【发布时间】:2022-01-15 09:37:21
【问题描述】:
所以...我一直在关注embedded rust book...,我目前正在阅读有关寄存器的信息。现在,这本书确实建议我使用STM32F303VC discovery 来避免问题,但我找不到,因此我得到了Nucleo F303RE instead。货物的目标和材料保持不变。所以我认为不会有任何问题。
所以,我使用的 MCU 将 LED 连接到端口 A (0x48000000),其 BSRR 偏移量为 0x18。现在,我在datasheet 中读到,端口 A 的默认值为 0xa8000000,我不明白为什么。但是当我尝试使用
ptr::write_volatile(PORTA_BSRR as *mut u32, 1 << 5); 没有任何反应。甚至我的 gdb 终端也没有反映任何变化。因此,我尝试按照原始教程的建议(0x48001018)检查portE。但即便如此,寄存器值也不会改变。我无法调试此问题。
现在,我可以运行之前的教程,并且可以检查变量和内容。我的 stm 似乎没有任何问题,因为我可以使用 stmc32cubeide 很好地控制它。
这里是代码以供您参考
编辑:所以,我阅读了@Ikolbly 的评论,并查看了 RCC_AHBENR 寄存器,我猜这就像在 arduino 中设置 pinMode(pin, HIGH) 一样,它会打开端口。
我已修改代码以设置该位,但似乎没有任何变化。我猜辅助代码已经为 portE 做了这件事,这就是为什么我不必为此做任何初始化......但即使更改 portE 的寄存器值也不起作用。
//#![deny(unsafe_code)]
#![no_main]
#![no_std]
use aux5::entry;
use core::ptr;
#[entry]
fn main() -> ! {
const RCC_AHBENR: u32 = 0x48000014;
const PORTA_BSRR: u32 = 0x48000018;
let _y;
let x = 42;
_y = x;
unsafe {
// EDIT enabling portA
ptr::write_volatile(RCC_AHBENR as *mut u32, 1 << 17);
// Toggling pin PA5
ptr::write_volatile(PORTA_BSRR as *mut u32, 1 << 5);
// Toggling random shit to see if it works
ptr::write_volatile(PORTA_BSRR as *mut u32, 1 << 6);
ptr::write_volatile(PORTA_BSRR as *mut u32, 1 << 7);
ptr::write_volatile(PORTA_BSRR as *mut u32, 1 << 8);
}
// infinite loop; just so we don't leave this stack frame
loop {}
}
【问题讨论】:
-
是否需要设置 RCC_AHBENR 中的 IOPAEN 位来启用 GPIO bank?
-
RCC 的基地址为 0x4002_1000,因此 RCC_AHBENR 将位于地址 0x4002_1014。对于 GPIOE,如果您调用 init:github.com/rust-embedded/discovery/blob/master/f3discovery/src/… 看起来辅助代码是这样做的
-
非常感谢...我仍然无法打开 LED,但我可以操作寄存器并使用 gdb 检查它们...我想我必须阅读数据表更多...另外...如果我在生锈之前使用嵌入式 C 进行探索会有所帮助吗?还是几乎一样?
-
是的,必须启用外围设备已经让我好几次了。由于我是谁,我对 Rust 有偏见,我认为使用嵌入式 C 而不是 Rust 没有任何真正的好处。你只会遇到同样的问题,除了 C 带来的问题。
-
最低限度是您需要在 rcc 中启用 gpio,上面的讨论是关于 IOPAEN(I/O 端口 A 启用)。然后,您需要设置匹配的调制解调器寄存器位,以使 gpio 引脚成为输出。 otypr 寄存器,如果你使用的单片机有,你不需要触摸,也不需要速度寄存器。您只需要将输出模式设置为输出,推拉即可。
标签: rust embedded bare-metal stm32f3