stm32f4发现板LED不闪烁

时间:2017-07-25 07:30:48

标签: microcontroller stm32f4

我测试了所有四个内置LED和一个外部LED的代码。 所有LED都亮起,但它们不闪烁。 这是我的代码:

#include "stm32f4xx.h"

void WaitaMoment (int time)
{
for (time = 0; time > 0; time--);
}

int main(void)
{
RCC -> AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD -> MODER |= GPIO_MODER_MODER14_0;
GPIOD -> OTYPER &= ~ (GPIO_OTYPER_OT_14);
GPIOD -> OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14;
GPIOD -> PUPDR &= ~ (GPIO_PUPDR_PUPDR14);

//int time;
while(1)
{
    GPIOD -> BSRRL |= GPIO_BSRR_BS_14;
    //for (time=0; time < 200000; time++);
    WaitaMoment(200000);
    GPIOD -> BSRRH |= GPIO_BSRR_BR_14;
    WaitaMoment(200000);
    //for (time=0; time < 200000; time++);
}
}

我的问题是什么?

1 个答案:

答案 0 :(得分:3)

WaitaMoment中的for循环不会迭代,因为它会设置time = 0然后循环而time > 0永远不会。更改它,以便循环不设置time = 0

void WaitaMoment (int time)
{
for (; time > 0; time--);
}

如果编译器识别出它没有做任何事情并将其优化掉,那么这个循环可能仍然不会迭代。确保延迟没有得到优化,否则LED可能会闪得太快,以至于您无法看到闪光灯。

如评论中所述,您不应将|=与BSRRL和BSRRH一起使用。把它写成这样。

GPIOD->BSRRL = GPIO_BSRR_BS_14;
WaitaMoment(200000);
GPIOD->BSRRH = GPIO_BSRR_BS_14;
WaitaMoment(200000);

确保拼写正确(GPIO_BSRR_B S _14而非GPIO_BSRR_B R _14)