树莓派PICO PIO完整使用方法与步骤详解教程
树莓派Pico的RP2040拥有8个可编程I O状态机(PIO),可自定义硬件接口,较FPGA更易用。通过 pio汇编、C调用及CMake生成头文件,实现串口打印“hello”程序。
在树莓派 Pico 这块小巧的开发板上,总能带给我们惊喜。它搭载的 RP2040 芯片内置了 8 个可编程 I/O(PIO)状态机,专门用于实现自定义外设——听起来是不是有点像 FPGA?没错,PIO 确实能让开发者灵活地按需定制硬件接口,而且上手门槛比 FPGA 低得多,是树莓派 Pico PIO 使用中的一大亮点。

可编程 I/O(PIO)是 RP2040 的一项全新硬件设计。简单来说,你可以通过 PIO 创建新的或额外的硬件接口,模拟更多、更丰富、更快的通信协议——这对提升性能、扩展功能来说,是非常实用的手段,也是树莓派 Pico 自定义硬件接口的核心方式。
相比 FPGA,PIO 的优势很明显:FPGA 往往更贵,且需要学习完全不同的编程模式。而 PIO 只需用汇编语言就能搞定,开发者无需适应 FPGA 的思维方式,就能快速实现自定义硬件接口,尤其适合那些需要 PIO 状态机配置的嵌入式项目。
不妨看一个简单的 demo,主要包含一个用汇编写的 .pio 文件、几个 C 文件,以及 CMake 配置文件,最终实现通过串口打印 "hello" 的功能,完美展示 PIO 汇编语言开发流程。
pio 文件(hello.pio):
.program hello
; Repeatedly get one word of data from the TX FIFO, stalling when the FIFO is
; empty. Write the least significant bit to the OUT pin group.
loop:
pull
out pins, 1
jmp loop
% c-sdk {
static inline void hello_program_init(PIO pio, uint sm, uint offset, uint pin) {
pio_sm_config c = hello_program_get_default_config(offset);
// Map the state machine's OUT pin group to one pin, namely the pin
// parameter to this function.
sm_config_set_out_pins(&c, pin, 1);
// Set this pin's GPIO function (connect PIO to the pad)
pio_gpio_init(pio, pin);
// Set the pin direction to output at the PIO
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
// Load our configuration, and jump to the start of the program
pio_sm_init(pio, sm, offset, &c);
// Set the state machine running
pio_sm_set_enabled(pio, sm, true);
}
%}
整个流程大致分三步:
- 将程序加载到 PIO 的指令存储器中;
- 配置 PIO 状态机并运行程序;
- 在状态机运行期间与之交互,实现数据收发。
C 文件(hello.c):
#include "pico/stdlib.h"
#include "hardware/pio.h"
// Our assembled program:
#include "hello.pio.h"
int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning pio/hello_pio example requires a board with a regular LED
#else
// Choose which PIO instance to use (there are two instances)
PIO pio = pio0;
// Our assembled program needs to be loaded into this PIO's instruction
// memory. This SDK function will find a location (offset) in the
// instruction memory where there is enough space for our program. We need
// to remember this location!
uint offset = pio_add_program(pio, &hello_program);
// Find a free state machine on our chosen PIO (erroring if there are
// none). Configure it to run our program, and start it, using the
// helper function we included in our .pio file.
uint sm = pio_claim_unused_sm(pio, true);
hello_program_init(pio, sm, offset, PICO_DEFAULT_LED_PIN);
// The state machine is now running. Any value we push to its TX FIFO will
// appear on the LED pin.
while (true) {
// Blink
pio_sm_put_blocking(pio, sm, 1);
sleep_ms(500);
// Blonk
pio_sm_put_blocking(pio, sm, 0);
sleep_ms(500);
}
#endif
}
注意看,C 文件里引用了 hello.pio.h 这个头文件——它和前面的 .pio 文件对应,但 .pio 本身不能直接在 C 中调用。这时就需要 CMake 来牵线搭桥,把 .pio 和 .c 文件关联起来,最终构建出一个可执行文件,这也是树莓派 Pico PIO 编程中常见的构建方式。
CMake 文件(CMakeLists.txt):
add_executable(hello_pio)
pico_generate_pio_header(hello_pio ${CMAKE_CURRENT_LIST_DIR}/hello.pio)
target_sources(hello_pio PRIVATE hello.c)
target_link_libraries(hello_pio PRIVATE
pico_stdlib
hardware_pio
)
pico_add_extra_outputs(hello_pio)
#add url via pico_set_program_url
example_auto_set_url(hello_pio)
其中关键的魔法就是 pico_generate_pio_header 这条指令,它会将汇编语言写的 .pio 文件自动生成对应的 .h 头文件,供 C 文件调用。配合 Pico 官方 SDK,就能构建出一个串口打印 "hello" 的程序,让开发者轻松上手 PIO 状态机配置。
其他
其实最初注意到这个功能,是在移植 Pico W 板载 Wi-Fi 的过程中——因为需要用到一个叫 cyw43_bus_pio_spi.pio 的 PIO 程序。当时 RT-Thread 那边用的是 Scons 构建系统,所以就先借助 pico-examples 里的 CMake 生成对应的 .h 文件(cyw43_bus_pio_spi.pio.h),然后直接复制过来使用。这个方法虽然有点绕,但胜在简单可靠,也算是 PIO 灵活性的一个现实注脚,体现了树莓派 Pico 自定义硬件接口的实用价值。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:树莓派PICO PIO完整使用方法与步骤详解教程要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点在COMPUTEX2026展会上,技嘉展示了AORUSGeForceRTX5080INFINITYWOOD显卡和AORUSX870EINFINITYNEXT主板。RTX5080显卡采用白色主题与木色元素装饰,设计独特;X870E主板则以蝴蝶翅膀为灵感,采用类蜂窝结构和金属3D打印
星际荣耀公司近日成功完成SQX-3运载火箭海上回收高精度导航系统的无人机挂飞试验。该试验在广东阳江海域进行,采用创新的半实物动态模拟方案,全面验证了导航系统在复杂海况下的性能。结果表明,系统各项指标均优于设计要求,能够稳定提供火箭与回收船之间的高精度相对导航信息。这标志着该核心系统已完成全部地面验证
PC内存厂商OriginCode近日分别针对英特尔和AMD平台推出专项优化内存。面向英特尔平台的CQDIMM内存,通过与技嘉合作验证了256GB8000MT s的高带宽套条,旨在为本地AI、视频渲染等重载任务提供强大数据吞吐能力,并计划在2026年台北电脑展展出。针对AMD平台,则推出多款支持E
东风本田公布5月销量达18563台,环比增长20%,其中CR-V销量增长显著。品牌同步推出6月限时购车权益,涵盖CR-V、英仕派、HR-V及思域等多款车型,权益价最低至9 79万元起,并可叠加国家以旧换新补贴及原厂配置加装优惠,为近期有购车计划的消费者提供了具体的价格参考与增值选择。
- 日榜
- 周榜
- 月榜
热点快看
