32个版本 (18个破坏性更新)

0.19.0 2024年8月14日
0.18.0 2024年5月18日
0.17.1 2024年1月21日
0.16.1 2023年12月20日
0.1.2 2017年3月3日

#10 in 嵌入式开发

Download history 2090/week @ 2024-05-04 2122/week @ 2024-05-11 2613/week @ 2024-05-18 2873/week @ 2024-05-25 2134/week @ 2024-06-01 1774/week @ 2024-06-08 2233/week @ 2024-06-15 2100/week @ 2024-06-22 1364/week @ 2024-06-29 1473/week @ 2024-07-06 2345/week @ 2024-07-13 2114/week @ 2024-07-20 2599/week @ 2024-07-27 2175/week @ 2024-08-03 2731/week @ 2024-08-10 2548/week @ 2024-08-17

每月10,329次下载
用于 107 个包 (98个直接使用)

MIT 许可证

320KB
6K SLoC

RPPAL - Raspberry Pi外设访问库

Build status crates.io MIT licensed Minimum rustc version

RPPAL通过用户友好的接口提供对Raspberry Pi的GPIO、I2C、PWM、SPI和UART外设的访问。除了外设访问外,RPPAL还提供对USB到串行适配器的支持。

该库可以通过其embedded-hal trait实现与各种平台无关的驱动程序一起使用。支持embedded-hal v0.2.7和v1。

RPPAL需要Raspberry Pi OS或任何类似的新近Linux发行版。支持GNU和musl libc目标。RPPAL与Raspberry Pi A、A+、B、B+、2B、3A+、3B、3B+、4B、5、CM、CM 3、CM 3+、CM 4、400、Zero、Zero W和Zero 2 W兼容。直到v1,不保证对较小版本的向下兼容性。

此库在GitHub仓库的master分支上开发。如果您正在寻找最新版本或任何早期版本的README.mdexamples目录,请访问crates.io,从GitHub releases页面下载存档版本,或克隆并检出相关版本标签。

目录

文档

最新的发布版本、旧版本和当前开发版本的在线文档均可用。

用法

使用以下命令将 rppal 依赖项添加到您的 Cargo.toml 文件中: cargo add rppal,或者通过在依赖项部分添加以下行。

[dependencies]
rppal = "0.19.0"

如果您的项目需要 embedded-hal 特性实现,请在依赖项声明中指定 halhal-unproven 特性标志。

[dependencies]
rppal = { version = "0.19.0", features = ["hal"] }

在任意外围设备上调用 new() 来构造一个新的实例。

use rppal::gpio::Gpio;
use rppal::i2c::I2c;
use rppal::pwm::{Channel, Pwm};
use rppal::spi::{Bus, Mode, SlaveSelect, Spi};
use rppal::uart::{Parity, Uart};

let gpio = Gpio::new()?;
let i2c = I2c::new()?;
let pwm = Pwm::new(Channel::Pwm0)?;
let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, 16_000_000, Mode::Mode0)?;
let uart = Uart::new(115_200, Parity::None, 8, 1)?;

在某些情况下,可能需要首先通过 sudo raspi-config 或编辑 /boot/firmware/config.txt 来启用对某些外围设备的访问。请参考相关模块的文档以获取所需的步骤。

示例

以下示例演示了如何闪烁连接到 GPIO 引脚的 LED。请记住添加一个适当值的电阻,以防止超过 GPIO 引脚和 LED 的最大电流额定值。

use std::error::Error;
use std::thread;
use std::time::Duration;

use rppal::gpio::Gpio;
use rppal::system::DeviceInfo;

// Gpio uses BCM pin numbering. BCM GPIO 23 is tied to physical pin 16.
const GPIO_LED: u8 = 23;

fn main() -> Result<(), Box<dyn Error>> {
    println!("Blinking an LED on a {}.", DeviceInfo::new()?.model());

    let mut pin = Gpio::new()?.get(GPIO_LED)?.into_output();

    // Blink the LED by setting the pin's logic level high for 500 ms.
    pin.set_high();
    thread::sleep(Duration::from_millis(500));
    pin.set_low();

    Ok(())
}

更多示例可以在 examples 目录中找到。

可选功能

默认情况下,所有可选功能均被禁用。您可以在 Cargo.toml 中通过指定相关特性标志来启用功能。

  • hal - 启用所有支持外围设备的 embedded-hal 特性实现。这不包括 unproven 特性。
  • hal-unproven - 启用所有支持外围设备的 embedded-hal 特性实现,包括标记为 unproven 的特性。请注意,embedded-halunproven 特性不遵循 semver 规则。补丁版本可能引入破坏性更改。

支持的设备

GPIO

为了确保快速性能,RPPAL 通过直接通过 /dev/gpiomem/dev/mem 访问寄存器来控制 GPIO 外围设备。使用 gpiochip 字符设备配置 GPIO 中断。

特性

  • 设置/获取引脚模式和逻辑电平
  • 配置内置的上拉/下拉电阻
  • 同步和异步中断处理程序
  • 基于软件的 PWM 实现
  • 可选的 embedded-hal 特性实现

I2C

Broadcom 串行控制器 (BSC) 外围设备控制符合 I2C 总线/接口的专用总线。RPPAL 使用 i2cdev 字符设备与 BSC 通信。

特性

  • 单主,7 位从地址,传输速率高达 400 kbit/s(快速模式)
  • I2C 基本读写,块读写,写+读组合
  • SMBus 协议:快速命令,发送/接收字节,读写字节/字,过程调用,块写,PEC
  • 可选的 embedded-hal 特性实现

PWM

RPPAL 通过 pwm sysfs 接口控制 Raspberry Pi 的 PWM 外围设备。

特性

  • 多达两个硬件 PWM 通道
  • 可配置频率、占空比和极性
  • 可选的 embedded-hal 特性实现

SPI

RPPAL 通过 spidev 字符设备控制 Raspberry Pi 的主和辅助 SPI 外围设备。

特性

  • SPI 主设备,模式 0-3,从选择低电平/高电平激活,每字 8 位,可配置时钟速度
  • 半双工读取、写入和多段传输
  • 全双工传输和多段传输
  • 可定制多段传输中每个段的可选设置(时钟速度、延迟、SS 变换)
  • 反转位顺序辅助函数
  • 可选的 embedded-hal 特性实现

UART

RPPAL 通过 ttyAMA0(PL011)和 ttyS0(mini UART)字符设备控制 Raspberry Pi 的 UART 外围设备。USB 至串行适配器使用 ttyUSBxttyACMx 字符设备控制。

特性

  • 支持 UART 外设(PL011,迷你 UART)和 USB 转串行适配器
  • 无/偶/奇/标记/空奇偶校验,5-8 位数据位,1-2 个停止位
  • 传输速率高达 4 Mbit/s(设备相关)
  • XON/XOFF 软件流控制
  • RTS/CTS 硬件流控制,自动引脚配置
  • 可选的 embedded-hal 特性实现

交叉编译

如果您不是直接在 Raspberry Pi 上工作,您需要交叉编译代码以适应适当的 ARM 架构。请参阅此指南获取更多信息,或尝试cross项目进行“零设置”交叉编译。

Cargo

对于不使用 cross 进行手动交叉编译,您需要安装适当的目标。大多数 Raspberry Pi 型号需要 armv7-unknown-linux-gnueabihf 目标以用于 32 位 Linux 发行版,或 aarch64-unknown-linux-gnu 用于 64 位。对于某些型号,如 Raspberry Pi Zero,需要不同的目标三元组。

使用 rustup 安装相关目标。

rustup target install armv7-unknown-linux-gnueabihf

在项目的根目录中,创建一个 .cargo 子目录,并将以下片段保存到 .cargo/config.toml

[build]
target = "armv7-unknown-linux-gnueabihf"

Visual Studio Code

Visual Studio Code 的 rust-analyzer 扩展需要通过设置 rust-analyzer.cargo.target 配置选项来了解目标平台。在项目的根目录中创建一个 .vscode 子目录,然后保存以下片段到 .vscode/settings.json

{
    "rust-analyzer.cargo.target": "armv7-unknown-linux-gnueabihf"
}

注意

在处理 Raspberry Pi 的外设时,始终要小心,尤其是如果您将任何外部组件连接到 GPIO 引脚。不当使用可能会导致永久性损坏。

版权所有 (c) 2017-2024 Rene van der Meer。在MIT 许可证下发布。

依赖项

~0–7.5MB
~39K SLoC