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() 函数。
这些“延迟循环”仅对一些基本测试有用,它们永远不应该出现在您的最终生产代码中。精确计时应该用定时器来完成,当内核无事可做时,应该将其置于睡眠模式以节省功率。
我正在尝试使用以下程序编写一个简单的 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() 函数。
这些“延迟循环”仅对一些基本测试有用,它们永远不应该出现在您的最终生产代码中。精确计时应该用定时器来完成,当内核无事可做时,应该将其置于睡眠模式以节省功率。