繁体   English   中英

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设置了一点但从未清除它,因此它不会闪烁,您需要在开/关转换之间有一个延迟才能明显看到它在闪烁。

在可能的情况下写入BSRR寄存器而不是ODR是一种很好的做法,这样可以避免读取-修改-写入周期。

如果该代码是您的整个main()那么您可能想用while(1)替换for (int i = 0; i < 1000; i++) while(1) ,您通常不想在嵌入式上下文中从main返回.

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

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

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

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

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM