当前位置: 首页 > ds >正文

PIO 也有并发喔,巧用SIDE-SET

前言

      Raspberry Pi Pico 的 PIO 模块赋予开发者近乎极限的 IO 时序控制能力。而其中的 side-set 是一个能够“同时控制额外引脚状态”的超级武器。今天我们通过一个极简而优雅的工程级应用:使用 一个 LED 主闪烁引脚 + 一个状态引脚,来完整演示 side-set 的用法及优势。


side-set 是什么?

      简而言之,side-set 让你能在一条 PIO 指令执行的同时控制某些 GPIO 引脚的电平,而不会占用额外的指令周期。

      这样你可以并发控制多个 IO 状态变化,非常适合用来:

  • 模拟通信协议中的同步信号(如 I2S 的 WS、SPI 的 CLK)

  • 输出调试波形(示波器对拍神器)

  • 控制多引脚状态机的切换信号

  • LED 状态指示


示例代码

PIO代码

@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, set_init=rp2.PIO.OUT_LOW)
def blink_1hz2():set(x, 31)   .side(1)   [6]label("delay_high")nop()                   [7]nop()                   [7]nop()                   [7]nop()                   [5]jmp(x_dec, "delay_high")set(x, 31)   .side(0)  [6]label("delay_low")nop()                   [7]nop()                   [7]nop()                   [7]nop()                   [5]jmp(x_dec, "delay_low")

代码分析

  • 每半个周期共 961 个指令周期(根据 jmp(x_dec, "delay_*") 运行 31 次,每次 31 个周期;

  • 2000Hz 状态机频率下,总共 1922个时钟周期,约1秒;

  • side-set 引脚控制led亮灭交替变化。


 主程序代码

from machine import Pin
import rp2sm = rp2.StateMachine(0, blink_1hz2, freq=2000,sideset_base=Pin(25)     # 控灯
)sm.active(1)

有个小知识点

可以看到这张图8~12位,写的是Delay/side-set,Delay是设置延时用的,比如:

nop()                   [7]

这就是延时7个时钟周期,那么一共有5位,则可以延时31个时钟周期,

小知识点来了:

       如果你设置了side-set,那么这条指令最多只能设置7个时钟周期!因为side-set占用了2位。


实际应用场景

1. 调试分析

通过 side-set 输出状态,可以轻松用逻辑分析仪/示波器捕捉闪烁信号,分辨出状态机运行状态、延迟是否正确等。

2. 通信协议帧信号

类似 I2S、SPI、UART 等协议中都需要帧开始/结束等“状态提示信号”,而 side-set 非常适合用来输出这种同步信号。

3. 触发外部事件

你甚至可以让 side-set 引脚连接到外部中断引脚,用来触发其他芯片的工作/同步检测。


总结

side-set 是 Pico PIO 中最具“魔法感”的特性之一。它允许你:

  • 精准输出辅助信号(0 delay 并发)

  • 不影响主逻辑流程

  • 在硬实时控制中节省宝贵指令周期

http://www.xdnf.cn/news/9344.html

相关文章:

  • 解决Qt 打包的软件缺少dll问题
  • 《计算机组成原理》第 4 章 - 存储器​
  • 零基础设计模式——结构型模式 - 装饰器模式
  • 国芯思辰| 同步降压转换器CN2020应用于智能电视,替换LMR33620
  • 在ubuntu手动分区时,730GB的总空间,建议划分多少给根目录
  • AI应用 Markdown 渲染对比与原生实现方案
  • 书籍品读:《逆水行舟话幸福》(陈州)
  • 【Python】2. 基础语法(2)
  • 【运维_日常报错解决方案_docker系列】一、docker系统不起来
  • 从自动化到智能化:制造业数字化转型的五个关键跃迁
  • Vue-03 (调试工具Vue Devtools )
  • delphi xe 12.3下解决错误 ld.exe: unrecognized option ‘--no-rosegment‘
  • 试验台铁地板:技术创新与品质保障
  • 【观成科技】Ymir勒索软件组织窃密木马RustyStealer加密通信分析
  • STM32的HAL编码流程总结(上部)
  • 大模型——MCP 深度解析
  • vue2使用element中多选组件el-checkbox-group,数据与UI更新不同步
  • 【React】jsx 从声明式语法变成命令式语法
  • 5G NTN卫星通信发展现状(截止2025年3月)
  • 每日算法-250527
  • SNTP 协议详解:网络时间同步的轻量级解决方案
  • Python os 模块简介及基础使用示例
  • 如何撰写一篇优质 Python 相关的技术文档 进阶指南
  • Cmake编译yaml-cpp并在QT中测试成功操作步骤
  • AI情感陪伴在医疗领域的核心应用潜力
  • 打卡37天
  • HarmonyNext使用request.agent.download实现断点下载
  • 设计模式-开放封闭原则
  • 多相电机驱动控制学习(1)——基于双dq坐标系的六相PMSM驱动控制
  • C++23 新成员函数与字符串类型的改动