rust - 如何以简单的英语引用 SPI1 数据寄存器以在 Rust 中设置 DMA

标签 rust embedded stm32

我正在尝试使用 Rust 语言为 STM32 bluepill 编写代码。我正在使用 STM32f1xx_hal crate,它随后为外围设备调用 STM32f1 crate。我想做的是使用更自然的语言来指定 DMA 目标内存位置的外设地址,而不是对地址进行硬编码。

这是硬编码地址的样子:

dp.DMA1.ch3.par.write(|w| unsafe { w.bits(0x4001_3000 + 0x0c) } );

这是我想做的:

dp.DMA1.ch3.par.write(|w| &dp.SPI1.dr as *const _);

我当然会为此出错。

预期的可变引用,找到 *-ptr

我对此非常陌生(嵌入式编程和使用 Rust)并且很可能完全错了。这里有人可以指出我正确的方向吗?提前致谢。我也完全意识到这可能是错误的论坛。如果是这样,请告诉我,我会把我的问题转移到那里。

最佳答案

首先,您在这里使用的是 PAC(外设访问包)API,它功能强大,但级别较低且容易出错。 stm32f1xx-hal有一个DMA API .存储库中有多个 examples that use it .

如果该 HAL API 适合您的需求,那么我会改用它。

至于您的实际问题,您在正确的轨道上,但还不完全正确。

首先,您用来写入寄存器的方法是错误的:

dp.DMA1.ch3.par.write(|w| &dp.SPI1.dr as *const _);

write 方法采用一个闭包,它为您提供了 w 参数并期望您返回相同的 ww 参数的类型为 &mut dma1::ch::par::W ,闭包期望你返回同样的东西。您所写的内容返回了您的 const 指针,这就是错误消息所提示的。

您需要做的是使用W 提供的API。类型写入寄存器。我没有测试以下内容,但根据文档,它(或接近它的东西)应该可以工作:

dp.DMA1.ch3.par.write(|w| w.pa().bits(&dp.SPI1.dr as *const _ as u32));

I also totally realize that this may be the incorrect forum. If so, let me know and I will shift my question over there.

我认为这不是不正确 论坛,但可能有一些更好的论坛。很多人都在 Matrix 的 rust-embedded channel 闲逛。在我的脑海中,我不知道有什么好的链接可以指导初学者,但这里是 a direct link to the channel .你可能会想出来:-)

另一个很好的可能性是 embedded category on the Rust Users forum .

关于rust - 如何以简单的英语引用 SPI1 数据寄存器以在 Rust 中设置 DMA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57231946/

相关文章:

rust - 函数中本地枚举的全局导入

rust - 非详尽模式 - Rust 匹配表达式

embedded - 在重置皮质 m3 上保留一些 RAM 值

c - 启动 SRAM 读操作

arm - STM32 输入捕捉间接模式

c - 如何用STM32正确实现按键组合?

rust - 如何将 and_then 链分成两部分?

rust - 我可以创建一个指向堆栈对象的拥有指针吗

c++ - 如何追踪 SIGFPE/算术异常

STM32 和 SD 卡(FATFS 和 SPI)