有谁知道为什么代码不能工作吗?
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),它有一个被称为引脚PB3 (端口26)的集成发光二极管,但闪烁后没有任何反应。实际上,那里应该有一个发光二极管。我是否使用了正确的寄存器?
发布于 2020-09-18 23:10:22
您在ODR中设置了位,但从未清除它,因此它不会闪烁,您需要在开/关转换之间延迟一段时间才能清晰地看到它闪烁。
在可能的情况下,最好也写入BSRR寄存器而不是ODR,这样可以避免读取-修改-写入周期。
如果代码是整个main(),那么您可能希望用while(1)替换for (int i = 0; i < 1000; i++),您通常不希望在嵌入式上下文中从main返回。
发布于 2020-09-19 16:33:07
此序列错误(我没有检查您是否使用了正确的RCC寄存器)
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);当您启用外设时钟时,您需要读回值或添加一些延迟,以便通过总线传播更改。为此,我通常使用屏障指令。
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
__DMB();
GPIOB->MODER &= ~(0x3u << 6u);如果不添加此延迟(或回读),则第一次操作将失败,因为它将在非时钟GPIO外设上执行。

https://stackoverflow.com/questions/63958330
复制相似问题