#uart #rp2040 #pio #embedded-io #raspberry-pi #state-machine

无需std pio-uart

基于PIO功能的RP2040软件UART实现

3个不稳定版本

0.2.1 2023年12月18日
0.2.0 2023年12月18日
0.1.0 2023年12月17日

#709嵌入式开发

BSD-3-Clause

24KB
346

pio-uart

crates.io docs.rs

概述

pio-uart 包为Raspberry Pi RP2040微控制器提供了一个软件UART实现,利用其可编程I/O (PIO) 功能。此包允许RP2040进行串行通信,而无需使用其专用的UART硬件块,从而在引脚选择上提供了更大的灵活性,并且可能释放硬件UART用于其他目的。

特性

  • 基于PIO的UART:完全通过RP2040的PIO功能实现UART通信。
  • 灵活的引脚选择:任何GPIO引脚都可以用于UART的TX和RX,不受特定UART引脚的限制。
  • 可配置波特率:支持设置自定义波特率,但受限于PIO状态机定时。
  • 发送/接收缓冲:内部提供发送和接收缓冲。
  • 错误处理:基本的帧错误检测。

安装

pio-uart 添加为依赖项

cargo add pio-uart

用法

pio-uart 包的基本用法是设置所需的引脚和波特率的PIO UART,然后使用它进行读写数据。

示例

use embedded_io::{Read, Write};
use fugit::RateExtU32;
use pio_uart::PioUart;
use rp2040_hal as hal;
use rp2040_hal::pac;

fn main() {
    let mut pac = pac::Peripherals::take().unwrap();
    let core = pac::CorePeripherals::take().unwrap();
    let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);
    let clocks = hal::clocks::init_clocks_and_plls(
        rp_pico::XOSC_CRYSTAL_FREQ, pac.XOSC, pac.CLOCKS,
        pac.PLL_SYS, pac.PLL_USB, &mut pac.RESETS, &mut watchdog,
    ).ok().unwrap();

    let sio = hal::Sio::new(pac.SIO);
    let pins = rp_pico::Pins::new(
        pac.IO_BANK0,
        pac.PADS_BANK0,
        sio.gpio_bank0,
        &mut pac.RESETS,
    );

    // Initialize software UART
    let mut uart = PioUart::new(
        pac.PIO0,
        pins.gpio16.reconfigure(),
        pins.gpio17.reconfigure(),
        &mut pac.RESETS,
        19200.Hz(),
        125.MHz(),
    )
    .enable();

    uart.write(b"Hello, UART over PIO!");
    let mut buffer = [0u8; 10];
    uart.read(&mut buffer);
}

文档

有关详细文档、示例和API参考,请访问 crates.io

许可证

此包根据 BSD-3-Clause许可证 许可。

贡献

欢迎贡献。请遵循标准的Rust社区贡献指南。

免责声明

此包按原样提供,不保证功能或稳定性。开发者不对使用此包造成的任何损害负责。

依赖项

~10-18MB
~261K SLoC