MicroPython RP2040可编程IOs(PIO)示例介绍

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MicroPython RP2040可编程IOs(PIO)示例介绍相关的知识,希望对你有一定的参考价值。

【MicroPython RP2040】可编程ios(PIO)


  • 原文链接:https://www.cnx-software.com/2021/01/27/a-closer-look-at-raspberry-pi-rp2040-programmable-ios-pio/

为什么用可编程I / O ?

所有的电路板通常都带有对数字通信协议(如I2C、SPI和UART)的硬件支持。然而,如果你计划使用更多的这些接口,而不是在板上可用的,你可以使用可编程的IOs在RP2040微控制器提供。

它的功能比我们想象的要多。让我们假设你想输出一个DPI视频或“与AliExpress上的串行设备通信”现在可以通过可编程I/O。顾名思义,“可编程”IO表明它可以直接编程支持多个接口,包括SD卡接口,VGA输出,和更快的数据传输速度。挂在!这篇文章中最令人兴奋的部分即将到来——“如何编程这些可编程I/ o,使您的工作变得容易”。

📖PIO汇编指令

当对这些IO接口进行编程时,有9条汇编指令“ JMP、WAIT、IN、OUT、PUSH、PULL、MOV、IRQ和SET”。虽然大多数人可能对使用C / C ++或Python语言对PIO接口进行编程感兴趣,但让我们看看用于IO接口的一些汇编语言指令。

  • 📍JMP:此“跳转”指令可以是条件语句或非条件语句。在此,它通过更改指令指针寄存器来传输执行流程。简而言之,使用“ jmp”语句,执行流程进入代码的另一部分。
  • 📍WAIT:该指令会暂停代码的执行。每条指令需要一个周期,除非被停止(使用WAIT指令)。
  • 📍OUT:该指令将数据从输出移位寄存器移至其他目标,每次1…32位。
  • 📍 PULL:该指令将32位字从TX FIFO传输到输出移位寄存器中。
  • 📍IN:该指令一次将1…32位移入寄存器。
  • 📍PUSH:该指令用于将ISR内容写入RX FIFO。

有关汇编语言说明的更多信息,请参见RP2040数据表:https://datasheets.raspberrypi.org/rp2040/rp2040_datasheet.pdf

板载LED闪烁的PIO MicroPython代码

import time
from rp2 import PIO, asm_pio
from machine import Pin

# Define the blink program.  It has one GPIO to bind to on the set instruction, which is an output pin.
# Use lots of delays to make the blinking visible by eye.
@asm_pio(set_init=rp2.PIO.OUT_LOW)
def blink():
    wrap_target()
    set(pins, 1)   [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    set(pins, 0)   [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    wrap()

# 使用blink程序实例化一个状态机,频率为2000Hz,并设置为 Pin(25) (LED on the rp2 board)
sm = rp2.StateMachine(0, blink, freq=2000, set_base=Pin(25))

# Run the state machine for 3 seconds.  The LED should blink.
sm.active(1)
time.sleep(3)
sm.active(0)
  • 🌿一秒亮一秒熄灭
from machine import Pin
import rp2

@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
def blink_1hz():
    # Cycles: 1 + 7 + 32 * (30 + 1) = 1000
    set(pins, 1)
    set(x, 31)                  [6]
    label("delay_high")# 设置汇编延时入口
    nop()                       [29]
    jmp(x_dec, "delay_high")# 汇编延时跳出指令

    # Cycles: 1 + 7 + 32 * (30 + 1) = 1000
    set(pins, 0)
    set(x, 31)                  [6]
    label("delay_low")
    nop()                       [29]
    jmp(x_dec, "delay_low")

# Create and start a StateMachine with blink_1hz, outputting on Pin(25)
sm = rp2.StateMachine(0, blink_1hz, freq=2000, set_base=Pin(25))
sm.active(1)

以上是关于MicroPython RP2040可编程IOs(PIO)示例介绍的主要内容,如果未能解决你的问题,请参考以下文章

MicroPythonRP2040 MicroPython固件烧录以及Thonny 开发初探

MicroPython RP2040通过ADC调节PWM输出示例

如何在 Arduino Nano Connect RP2040 上使用 MicroPython 发出 HTTP 请求

MicroPython RP2040读取DHT11温湿度传感器数据+ 0.96“I2C oled显示

MicroPython RP2040读取DS18B20温度传感器数据+ 0.96“I2C oled显示

micropython RP2040/esp32/c3自编译4MB/8MB/16MB固件分享