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 外设上执行。
有人知道为什么代码不起作用吗?
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 外设上执行。