所以...我一直在关注嵌入式 rust 书...我目前正在阅读有关寄存器的内容。现在,这本书确实建议我使用STM32F303VC 发现来避免问题,但我找不到,因此我得到了Nucleo F303RE。货物的目标和材料保持不变。所以我认为不会有任何问题。
因此,我使用的 MCU 将 Led 连接到端口 A (0x48000000),其 BSRR 偏移量为 0x18。现在,我在数据表中读到,端口 A 的默认值为 0xa8000000,我不明白为什么。但是当我尝试使用没有任何反应来设置 LED 引脚
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 {}
}