STM32闪烁的LED错误寄存器?

STM32 blinking LED wrong register?

有人知道为什么代码不起作用吗?

RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);
GPIOB->MODER |= (0x1u << 6u);
for (int i = 0; i < 1000; i++) {
    GPIOB->ODR |= (0x1u << 0x3u);
}

我使用的是 STM 板 (STM32L432KC),它有一个集成 LED,称为引脚 PB3(端口 26),但在闪烁后没有任何反应。实际上应该有一个发光二极管。我使用正确的寄存器吗?

您在 ODR 中设置了一点但从未清除它,因此它不会闪烁,您需要在 on/off 转换之间延迟才能看到它闪烁.

最好尽可能写入 BSRR 寄存器而不是 ODR,这样可以避免 read-modify-write 周期。

如果该代码是您的全部 main(),那么您可能希望将 for (int i = 0; i < 1000; i++) 替换为 while(1),您通常不希望 return 来自 main 在嵌入式上下文中。

这个序列是错误的(我没有检查你是否使用了正确的RCC寄存器)

RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);

当您启用外设时钟时,您需要回读该值或添加一些延迟以通过总线传播您的更改。我通常为此使用屏障指令。

RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
__DMB();
GPIOB->MODER &= ~(0x3u << 6u);

如果不添加此延迟(或回读),第一次操作将失败,因为它将在非时钟 GPIO 外设上执行。