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 硬件支持

Download history 3646/week @ 2024-03-14 3814/week @ 2024-03-21 3138/week @ 2024-03-28 3175/week @ 2024-04-04 2954/week @ 2024-04-11 3170/week @ 2024-04-18 3441/week @ 2024-04-25 3591/week @ 2024-05-02 2714/week @ 2024-05-09 2765/week @ 2024-05-16 2858/week @ 2024-05-23 2627/week @ 2024-05-30 2601/week @ 2024-06-06 2893/week @ 2024-06-13 2754/week @ 2024-06-20 2657/week @ 2024-06-27

每月下载 11,306次
用于 65 个crate(直接使用18个)

MIT 许可证

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 版本发布之前都将是易变的。

请参阅 开放问题 以获取建议功能(和已知问题的)列表。

贡献

贡献是开源社区如此令人惊叹的学习、灵感和创造之地的原因。您所做的任何贡献都将被 大力赞赏

  1. 分支项目
  2. 创建您的功能分支(git checkout -b feature/AmazingFeature
  3. 提交您的更改(git commit -m 'Add some AmazingFeature'
  4. 将更改推送到分支(git push origin feature/AmazingFeature
  5. 打开拉取请求

许可证

在 MIT 许可证下分发。有关更多信息,请参阅 LICENSE

联系方式

项目链接: https://github.com/rp-rs/pio-rs/issues Matrix: #rp-rs:matrix.org

致谢

依赖项

~1.5MB
~36K SLoC