4个版本 (2个破坏性更新)
0.2.1 | 2022年12月26日 |
---|---|
0.2.0 | 2022年3月6日 |
0.1.0 | 2021年12月11日 |
0.0.1 | 2018年1月23日 |
#85 in 硬件支持
每月下载 11,306次
用于 65 个crate(直接使用18个)
36KB
774 行
pio-rs
支持树莓派硅RP2040的 PIO 状态机。
什么是PIO?
请参阅 https://www.raspberrypi.com/news/what-is-pio/。您还可以阅读RP2040数据手册(写得非常好)中的PIO部分:https://datasheets.raspberrypi.org/rp2040/rp2040-datasheet.pdf。
什么是pio-rs?
PIO程序必须从PIO汇编语言编译成特殊的PIO机器代码。然后,这种机器代码存储在您的C或Rust程序中,程序在相关时间点被复制到PIO硬件。
树莓派提供了一个名为pioasm的PIO汇编器,它位于 https://github.com/raspberrypi/pico-sdk/tree/master/tools/pioasm。如果您想使用树莓派Pico SDK(https://github.com/raspberrypi/pico-sdk)为RP2040编写C或C++程序,这是一个不错的选择。
pio-rs项目提供了一个pioasm的替代实现。主要优点如下
- 比
pioasm
更容易集成到RP2040的嵌入式Rust程序中 - 编译器本身可以包含在您的嵌入式Rust程序中,因此您可以在RP2040上运行时编译PIO代码!
- 编写汇编器是测试我们对规范理解的好方法。
- 它是用Rust编写的 :)
如何使用pio-rs?
如果您想用Rust编写一个使用RP2040的PIO块的程序,有三种方法可以使用pio-rs
pio!
有一个名为 pio!
的宏,它允许您将PIO汇编语言源代码放置在Rust程序中。此源代码在编译时被汇编成PIO程序。
您的 Cargo.toml
文件应包含以下内容
[dependencies]
pio-proc = "0.2"
pio = "0.2"
您的 Rust 程序应包含您的 PIO 程序,如下所示,在文件中直接使用 PIO 汇编
use pio_proc::pio_asm;
let program_with_defines = pio_proc::pio_asm!(
"set pindirs, 1",
".wrap_target",
"set pins, 0 [31]",
"set pins, 1 [31]",
".wrap",
options(max_program_size = 32) // Optional, defaults to 32
);
let program = program_with_defines.program;
或者您可以从磁盘组装一个独立的 PIO 文件
use pio_proc::pio_file;
let program_with_defines = pio_proc::pio_file!(
"./tests/test.pio",
select_program("test"), // Optional if only one program in the file
options(max_program_size = 32) // Optional, defaults to 32
);
let program = program_with_defines.program;
语法应与官方 pioasm 工具支持的语法相同
pio::Assembler::new()
您可以调用 pio::Assembler::new()
并使用 'builder pattern' 构建一个 PIO 程序 - 也就是说,您实际上是在 RP2040 上实时编译 PIO 程序!
// Define some simple PIO program.
const MAX_DELAY: u8 = 31;
let mut assembler = pio::Assembler::<32>::new();
let mut wrap_target = assembler.label();
let mut wrap_source = assembler.label();
// Set pin as Out
assembler.set(pio::SetDestination::PINDIRS, 1);
// Define begin of program loop
assembler.bind(&mut wrap_target);
// Set pin low
assembler.set_with_delay(pio::SetDestination::PINS, 0, MAX_DELAY);
// Set pin high
assembler.set_with_delay(pio::SetDestination::PINS, 1, MAX_DELAY);
// Define end of program loop
assembler.bind(&mut wrap_source);
// The labels wrap_target and wrap_source, as set above,
// define a loop which is executed repeatedly by the PIO
// state machine.
let program = assembler.assemble_with_wrap(wrap_source, wrap_target);
每个以 assembler.
开头的行都会向程序添加一行。完成后的程序可以传递给 Rust 语言的 PIO 驱动程序 RP2040 HAL。
PIO 示例
这个软件包只是 PIO 汇编器。如果您想在 RP2040 上查看一些与嵌入式 Rust 集成的完整功能的 PIO 示例,请查看 rp-hal 示例。
路线图
注意:此工具处于积极开发中。因此,它可能直到 1.0.0 版本发布之前都将是易变的。
请参阅 开放问题 以获取建议功能(和已知问题的)列表。
贡献
贡献是开源社区如此令人惊叹的学习、灵感和创造之地的原因。您所做的任何贡献都将被 大力赞赏。
- 分支项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m 'Add some AmazingFeature'
) - 将更改推送到分支(
git push origin feature/AmazingFeature
) - 打开拉取请求
许可证
在 MIT 许可证下分发。有关更多信息,请参阅 LICENSE
。
联系方式
项目链接: https://github.com/rp-rs/pio-rs/issues Matrix: #rp-rs:matrix.org
致谢
依赖项
~1.5MB
~36K SLoC