【雕爷学编程】MicroPython手册之 RP2040 特定端口库 rp2.StateMachine.tx_fifo()-程序员宅基地

技术标签: MicroPython手册  python  嵌入式硬件  MicroPython  RP2040 特定端口库  单片机  

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述

RP2040 是一款由树莓派公司设计的 32 位双核 ARM Cortex-M0+ 微控制器芯片,于 2021 年 1 月发布,作为树莓派 Pico 开发板的核心部件。RP2040 的特点是高性能、低成本、小封装、灵活的 I/O 和独特的可编程 I/O(PIO)子系统。RP2040 还支持 MicroPython、C/C++ 和 TensorFlow Lite 等编程语言和框架,适用于各种创意项目和机器学习应用。

MicroPython 的特定于 RP2040 的库包括以下模块:

rp2:包含特定于 RP2040 的函数和类,如 PIO 相关功能、Flash 类和 StateMachine 类。
machine:包含通用的硬件控制功能,如 Pin、Timer、UART、PWM、ADC 等。
utime:包含时间相关的函数,如 sleep、ticks_ms、ticks_diff 等。
uos:包含操作系统相关的函数,如 uname、mount、remove 等。

这些模块使得 MicroPython 可以充分利用 RP2040 的硬件特性,实现各种创意项目。

在这里插入图片描述
MicroPython 的 rp2.StateMachine.tx_fifo() 是一个用于返回状态机的 TX FIFO 中的字数的方法。状态机是 RP2040 芯片的一种特殊功能,它可以实现自定义的 I/O 行为,例如模拟 SPI、I2C、UART 等协议,或者实现位摇摆 (bit banging) 技术。状态机有两个实例,每个实例有四个编号为 0 到 3 的状态机,共计八个状态机。

rp2.StateMachine.tx_fifo() 的主要特点是:

它可以在任何时候调用,无论状态机是否已经初始化或启动。如果状态机未初始化,则该方法无效。
它可以返回一个整数,表示状态机的 TX FIFO 中的字数。如果返回值为 0,则表示 TX FIFO 为空;如果返回值等于或大于 4,则表示 TX FIFO 已满或溢出。

rp2.StateMachine.tx_fifo() 的应用场景是:

当需要在程序中检查状态机是否有数据可写时,例如在使用状态机模拟 UART、SPI、I2C 等协议时,检查 TX FIFO 中是否有空间写入要发送的数据。
当需要在程序中控制状态机的数据写入速度或频率时,例如在使用状态机模拟高速或高频的 I/O 行为时,根据 TX FIFO 中的字数来决定何时调用 StateMachine.put() 方法。
当需要在程序中处理状态机的数据满载或丢失情况时,例如在使用状态机模拟不可靠的通信协议时,检查 TX FIFO 中的字数是否达到了预期的范围。

rp2.StateMachine.tx_fifo() 的注意事项是:

使用 rp2.StateMachine.tx_fifo() 时,需要注意 TX FIFO 的容量和状态。如果 TX FIFO 为空,则表示没有数据可写;如果 TX FIFO 满了,则表示可能有数据满载或丢失。
使用 rp2.StateMachine.tx_fifo() 时,需要注意数据的格式和长度。如果向 TX FIFO 中写入的数据不符合预期的格式或长度,可能会导致错误或异常。
使用 rp2.StateMachine.tx_fifo() 时,需要注意数据的同步和时序。如果向 TX FIFO 中写入的数据与接收方或其他设备不同步或不匹配,可能会影响数据的传输或处理。

以下是 MicroPython 的 rp2.StateMachine.tx_fifo() 的几个实际运用程序参考代码案例:

案例一:使用状态机 0 实现一个简单的 UART (通用异步收发器) 发送器,并在每次发送一个字节时打印出来。

from machine import Pin
import rp2

# 定义一个 UART 发送程序
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW, sideset_init=(rp2.PIO.OUT_LOW,))
def uart_tx_prog():
    # 设置初始波特率为 9600
    set(x, 103) [31]
    # 设置初始数据位为 8
    set(y, 7) [31]
    label("uartloop")
    # 判断是否有数据要发送(从 TX FIFO 中读取数据)
    pull(block)
    mov(isr, osr)
    # 输出起始位(低电平,side set)
    out(x, 0) .side(0)
    # 等待一个周期
    nop() [31]
    label("outbit")
    # 输出一位数据到输出引脚(side set)
    out(x, 1) .side(isr)
    # 等待一个周期
    mov(x, isr)
    label("waitbit")
    jmp(x_dec, "waitbit")
    # 判断是否输出完所有数据位
    jmp(y_dec, "outbit")
    # 输出停止位(高电平,side set)
    out(x, 0) .side(1)
    # 等待一个周期
    nop() [31]
    # 跳转到循环开始处
    jmp("uartloop")

# 创建状态机 0,从 Pin(17) 发送 UART 数据
sm = rp2.StateMachine(0, uart_tx_prog, freq=1000000, out_base=Pin(17))

# 启动状态机 0
sm.active(1)

# 循环发送字节数据,并打印出来
for i in range(256):
    # 检查 TX FIFO 中的字数
    while sm.tx_fifo() >= 4:
        # 等待 TX FIFO 有空间
        pass
    # 向 TX FIFO 中写入一个字节数据
    sm.put(i)
    # 打印发送的字节数据
    print("UART sent:", i)

案例二:使用状态机 1 实现一个简单的 DAC (数模转换器) 功能,并在每次写入一个 10 位的数字值时将其转换为模拟值。

from machine import Pin
import rp2

# 定义一个 DAC 程序
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
def dac_prog():
    # 设置初始输出周期为 1000
    set(x, 999) [31]
    # 设置初始数据位为 10
    set(y, 9) [31]
    label("dacloop")
    # 判断是否有数据要输出(从 TX FIFO 中读取数据)
    pull(block)
    mov(isr, osr)
    # 输出一位数据到输出引脚
    out(pins, 1)
    # 判断是否输出完所有数据位
    jmp(y_dec, "dacloop")
    # 跳转到循环开始处
    jmp("dacloop")

# 创建状态机 1,输出 DAC 数据到 Pin(25)
sm = rp2.StateMachine(1, dac_prog, freq=1000000, out_base=Pin(25))

# 启动状态机 1
sm.active(1)

# 循环写入数字值,并打印出来
for i in range(1024):
    # 检查 TX FIFO 中的字数
    while sm.tx_fifo() >= 4:
        # 等待 TX FIFO 有空间
        pass
    # 向 TX FIFO 中写入一个 10 位的数字值,并左移 6 位,将其转换为 16 位的模拟值
    sm.put(i, shift=6)

案例三:使用状态机 2 和状态机 3 实现一个简单的 SPI (串行外设接口) 主从模式,并在每次发送或接收一个字节时打印出来。这是一个利用状态机的 rp2.StateMachine.put() 方法来向 TX FIFO 中写入数据,以及 rp2.StateMachine.get() 方法来从 RX FIFO 中读取数据的例子。SPI 是一种常用的同步串行通信协议,它由一个主设备和一个或多个从设备组成,通过四根线(片选、时钟、主出从入、主入从出)进行数据的传输。

from machine import Pin
import rp2

# 定义一个 SPI 主机程序
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW, sideset_init=(rp2.PIO.OUT_LOW,))
def spi_master_prog():
    # 设置初始时钟分频为 250(4 MHz)
    set(x, 249) [31]
    # 设置初始数据位为 8
    set(y, 7) [31]
    label("spiloop")
    # 拉低片选引脚(side set)
    set(pindirs, 1) .side(0)
    # 判断是否有数据要发送(从 TX FIFO 中读取数据)
    pull(block)
    mov(isr, osr)
    label("outbit")
    # 输出一位数据到输出引脚(side set)
    out(x, 1) .side(1)
    # 等待半个周期
    nop() [31]
    # 输入一位数据到输入移位寄存器
    in_(pins, 1)
    # 输出另一位数据到输出引脚(side set)
    out(x, 1) .side(0)
    # 等待半个周期
    nop()
    # 判断是否输出完所有数据位
    jmp(y_dec, "outbit")
    # 拉高片选引脚(side set)
    set(pindirs, 1) .side(1)
    # 将输入移位寄存器的内容推送到 RX FIFO
    push()
    # 跳转到循环开始处
    jmp("spiloop")

# 定义一个 SPI 从机程序
@rp2.asm_pio(set_init=rp2.PIO.IN_LOW, sideset_init=(rp2.PIO.OUT_LOW,))
def spi_slave_prog():
    # 设置初始时钟分频为 250(4 MHz)
    set(x, 249) [31]
    # 设置初始数据位为 8
    set(y, 7) [31]
    label("spiloop")
    # 等待片选引脚为低电平
    wait(0, pin, 0)
    label("inbit")
    # 输入一位数据到输入移位寄存器
    in_(pins, 1)
    # 等待半个周期
    nop() [31]
    # 输出一位数据到输出引脚(side set)
    out(x, 1) .side(isr)

案例四:写入单个字节的数据:

import rp2

# 创建 PIO 对象
pio = rp2.PIO(0)

# 设置 PIO 引脚 0 和 1 为输出引脚
pio.set_pins(0, 1 << 0)
pio.set_pins(1, 1 << 1)

# 创建 PIO 状态机
sm = rp2.StateMachine(0, pio, freq=1000000, out_base=pio.base)

# 启动状态机
sm.active(1)

# 写入单个字节的数据
data = 0xAA
sm.tx_fifo(data)

这个示例创建了一个 PIO 对象,并使用 pio.set_pins() 方法将 PIO 引脚 0 和 1 配置为输出引脚。然后,使用 rp2.StateMachine() 创建了一个 PIO 状态机对象 sm。接着,通过调用 sm.active(1) 启动状态机。最后,通过调用 sm.tx_fifo(data) 方法将单个字节的数据写入状态机的发送 FIFO 中。

案例五:写入多个字节的数据:

import rp2

# 创建 PIO 对象
pio = rp2.PIO(0)

# 设置 PIO 引脚 0 和 1 为输出引脚
pio.set_pins(0, 1 << 0)
pio.set_pins(1, 1 << 1)

# 创建 PIO 状态机
sm = rp2.StateMachine(0, pio, freq=1000000, out_base=pio.base)

# 启动状态机
sm.active(1)

# 写入多个字节的数据
data = [0xAA, 0xBB, 0xCC, 0xDD]
for byte in data:
    sm.tx_fifo(byte)

这个示例创建了一个 PIO 对象,并使用 pio.set_pins() 方法将 PIO 引脚 0 和 1 配置为输出引脚。然后,使用 rp2.StateMachine() 创建了一个 PIO 状态机对象 sm。接着,通过调用 sm.active(1) 启动状态机。在循环中,通过遍历列表 data,并调用 sm.tx_fifo(byte) 方法将每个字节数据写入状态机的发送 FIFO 中。

案例六:使用循环连续写入数据:

import rp2
import time

# 创建 PIO 对象
pio = rp2.PIO(0)

# 设置 PIO 引脚 0 和 1 为输出引脚
pio.set_pins(0, 1 << 0)
pio.set_pins(1, 1 << 1)

# 创建 PIO 状态机
sm = rp2.StateMachine(0, pio, freq=1000000, out_base=pio.base)

# 启动状态机
sm.active(1)

# 使用循环连续写入数据
while True:
    # 写入单个字节的数据
    data = 0xAA
    sm.tx_fifo(data)

    # 等待一段时间
    time.sleep(0.1)

这个示例创建了一个 PIO 对象,并使用 pio.set_pins() 方法将 PIO 引脚 0 和 1 配置为输出引脚。然后,使用 rp2.StateMachine() 创建了一个 PIO 状态机对象 sm。接着,通过调用 sm.active(1) 启动状态机。在主循环中,通过调用 sm.tx_fifo(data) 方法将单个字节的数据写入状态机的发送 FIFO 中。然后,通过调用 time.sleep(0.1) 等待一段时间,可以根据实际需求调整等待时间。请注意,这是一个无限循环,如果需要退出循环,可以在适当的条件下使用 break 语句。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41659040/article/details/133179462

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文

推荐文章

热门文章

相关标签