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 嵌入式开发
每月10,329次下载
用于 107 个包 (98个直接使用)
320KB
6K SLoC
RPPAL - Raspberry Pi外设访问库
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.md
或examples
目录,请访问crates.io,从GitHub releases页面下载存档版本,或克隆并检出相关版本标签。
目录
文档
最新的发布版本、旧版本和当前开发版本的在线文档均可用。
用法
使用以下命令将 rppal
依赖项添加到您的 Cargo.toml
文件中: cargo add rppal
,或者通过在依赖项部分添加以下行。
[dependencies]
rppal = "0.19.0"
如果您的项目需要 embedded-hal
特性实现,请在依赖项声明中指定 hal
或 hal-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-hal
的unproven
特性不遵循 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 至串行适配器使用 ttyUSBx
和 ttyACMx
字符设备控制。
特性
- 支持 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