我测试了所有四个内置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++);
}
}
我的问题是什么?
答案 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)