0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

树莓派PICO pio使用

冬至子 来源:螺丝松掉的人 作者:螺丝松掉的人 2023-10-18 15:17 次阅读

树莓派 Pico 小小的板子上总是能让我们发现一些惊喜。其所使用的RP2040芯片还具备8个可编程I/O(PIO)状态机,用于自定义外围设备,与 FPGA 类似,开发者可以灵活的使用 PIO 自定义功能。

可编程I/O(PIO)是为 RP2040 开发的一种新型硬件,可以通过 PIO 创建新类型的(或附加)硬件接口。通过使用 PIO ,可以模拟更多,更丰富,更快的硬件接口,有助于提升性能和扩展性。

与 PIO 相比,FPGA 往往更加昂贵,而且需要使用其他的编程模式编写程序。但 PIO 仅仅只需要通过汇编语言就可以实现,开发者不需要去适应 FPGA 那种编程模式即可很快的实现自定义硬件接口。

PIO 一个简单的 demo:

主要需要用到一个汇编实现的pio文件,一些C文件,和Cmake文件,实现串口打印 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文件:

#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
}

我们会发现其中调用了 “hello.pio.h” 头文件,其与之前的 pio 文件相关,但 pio 文件并不能在 c 文件中直接调用,于是就需要 Cmake 文件将 pio 文件和 c 文件联系到一起,并构建一个可执行文件。

Cmake文件

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 的程序了。

其他

我是在移植 pico-w 板载的 Wi-Fi 功能时注意到这一功能的,因为需要使用到 cyw43_bus_pio_spi.pio 。但是由于 RT-Thread 这边使用的是 Scons,于是我就先利用 pico-examples 的 cmake 生成该 pio文件对应的 .h 文件 cyw43_bus_pio_spi.pio.h 然后复制过来是以供项目调用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1624

    文章

    21597

    浏览量

    601015
  • 存储器
    +关注

    关注

    38

    文章

    7413

    浏览量

    163466
  • 状态机
    +关注

    关注

    2

    文章

    490

    浏览量

    27447
  • RT-Thread
    +关注

    关注

    31

    文章

    1256

    浏览量

    39796
  • 树莓派
    +关注

    关注

    116

    文章

    1684

    浏览量

    105433
收藏 人收藏

    评论

    相关推荐

    树莓Pico如何使用PIO程序呢?

    在这篇教程中,我们看到的代码看起来与其他的部分的代码非常不同。那是因为我们大多数时候不得不在 MCU 的底层处理事情。
    的头像 发表于 11-14 15:06 1783次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>如何使用<b class='flag-5'>PIO</b>程序呢?

    树莓pico入门学习笔记(一)相关资料推荐

    树莓pico入门学习笔记选择自己熟悉的编程语言树莓pico提供C/C++和micropyth
    发表于 07-01 09:28

    树莓pico如何入门?

    树莓pico如何入门?
    发表于 10-13 08:11

    树莓Pico的相关资料分享

    关注、星标公众号,直达精彩内容1月22日,树莓基金会最新发布一款低成本、高性能的微控制器开发板Raspberry Pi Pico,新产品相比普通树莓
    发表于 11-03 08:44

    树莓Pico的相关资料推荐

    1月22日,树莓基金会最新发布一款低成本、高性能的微控制器开发板Raspberry Pi Pico,新产品相比普通树莓体积更小,售价仅4
    发表于 02-07 07:37

    远程控制树莓3b上的pi pico

    树莓pi pico树莓4相比差别很大,但是pi pico有一些特点是
    的头像 发表于 03-05 17:23 3916次阅读

    树莓也出MCU了?树莓Pico来了!

    关注、星标公众号,直达精彩内容1月22日,树莓基金会最新发布一款低成本、高性能的微控制器开发板Raspberry Pi Pico,新产品相比普通树莓
    发表于 10-28 10:36 11次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>也出MCU了?<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>来了!

    树莓不讲武德,自研双核MCU Pico,STM32哭晕在厕所!

    PIO架构,能否开创MCU市场全新领域,STM,兆易创新,STC,全志,乐鑫等一票国产MCU能否跟上?树莓派发布双核基于M0的MCU近日,树莓派发布了自研的40nm双核MCU,嵌入式MCU市场又要迎来真正的新气象.一如之前发布的
    发表于 10-28 20:20 14次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>不讲武德,自研双核MCU <b class='flag-5'>Pico</b>,STM32哭晕在厕所!

    树莓Pico:仅4美元的MCU

    1月22日,树莓基金会最新发布一款低成本、高性能的微控制器开发板Raspberry Pi Pico,新产品相比普通树莓体积更小,售价仅4
    发表于 12-04 13:06 13次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>:仅4美元的MCU

    树莓pico入门学习笔记(一)

    树莓pico入门学习笔记选择自己熟悉的编程语言树莓pico提供C/C++和micropyth
    发表于 12-17 18:42 21次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>pico</b>入门学习笔记(一)

    距离检测报警使用树莓Pico

    电子发烧友网站提供《距离检测报警使用树莓Pico.zip》资料免费下载
    发表于 11-09 11:49 0次下载
    距离检测报警使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>

    基于树莓pico的可编程游戏手柄设计

    方案介绍组件12x12x7.3mm 瞬时触觉按钮按钮树莓Pico通用 D1286464 OLED 显示屏操纵杆模块 PS210 欧姆电阻 组装将树莓
    发表于 12-26 15:10 0次下载

    使用树莓Pico制作USB麦克风

    本指南将教你如何使用树莓 Pico 和外部数字麦克风制作属于自己的 USB 麦克风。本项目通过 RP2040 微控制器(MCU)的编程 I/O(PIO)、直接存储器访问(DMA)和通
    的头像 发表于 08-17 10:12 2728次阅读
    使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>制作USB麦克风

    树莓Pico Flash驱动踩坑记录

    树莓 pico 带有 2MB 的 Flash 资源,以下是我基于官方 Pico C/C++ SDK 对接 Flash 驱动时踩到的一些坑和解决办法。
    的头像 发表于 10-20 11:44 1433次阅读

    如何在树莓Pico上使用红外线接收模块?

    树莓 Pico 上使用红外线接收模块(HX1838 型),我们采用开源的 pico_ir 库。
    的头像 发表于 11-30 09:08 2056次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>上使用红外线接收模块?