【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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值