Nucleo STM32F446RE - 延迟功能不起作用

Nucleo STM32F446RE - DELAY function not working

我正在尝试使用以下程序编写一个简单的 C 程序来使 LED 闪烁:

#include "stm32f4xx.h"

#include "stdint.h"

#include "stdlib.h"

void delayMs(int n);

int main(void) {

RCC->AHB1ENR |= 1; /* enable GPIOA clock */

GPIOA->MODER &= ~0x00000C00; /* clear pin mode */

GPIOA->MODER |= 0x00000400; /* set pin to output mode */

while(1) {

GPIOA->BSRR = 0x00000020; /* turn on LED */

delayMs(500);

GPIOA->BSRR = 0x00200000; /* turn off LED */

delayMs(500);

}

}

void delayMs(int n)

{

int i; for (; n > 0; n--)

for (i = 0; i < 3195; i++) ;

}

我使用 KEIL uVision IDE 构建代码,错误为 0,并将其下载到核板,但 LED 不闪烁。然而,在调试模式下,我成功地打开和关闭了 LED,但没有延迟。我注意到在调试模式下我从不进入延迟功能。对此类问题有任何解释吗?谢谢你的帮助。

这是 C 编译器的优化,它删除了您的循环。您可以使用调试器检查,不会为循环生成汇编代码。 您要么在循环中放置 __NOP() 指令,以便执行一些代码。

您也可以使用 HAL_Delay() 函数。

这些“延迟循环”仅对一些基本测试有用,它们永远不应该出现在您的最终生产代码中。精确计时应该用定时器来完成,当内核无事可做时,应该将其置于睡眠模式以节省功率。