stm32f4发现板LED不闪烁
我测试了所有四个内置LED和外部LED的代码。 所有指示灯都亮起,但不闪烁。 这是我的代码:stm32f4发现板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++);
}
}
我的问题是什么?
for循环WaitaMoment
不会迭代,因为它设置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 小号 _14不GPIO_BSRR_B [R _14)
回答所有评论时,调试器未显示GPIO_BSRR_BR_14的任何值。现在这两个值都是0x4000,它与引脚D14的值1匹配。 BR被重置,所以我认为我应该设置点亮和RSetting来关闭LED。现在我写for循环(time; time> 0; time--)。 BSRRL和BSRRH没有OR,现在都是BS_14。有效。万分感谢。我将学习更多关于ORing,ANDing等的知识。 – Juliano
kk很棒,我甚至没有看过延迟循环。这显示了一个调试器的值,您可以在其中设置中断点和步骤。你会立即看到,LED *做*打开和关闭,很快意识到这是你的延迟循环无法正常工作。 – DiBosco
我不知道| =为GPIOD - > BSRRL&BSRRH是正确的。试试=而不是| =。除此之外,最有可能的是您的GPIO设置不正确。该行:GPIOD - > MODER | = GPIO_MODER_MODER14_0;什么是GPIO_MODER_MODER14_0定义为?应该是0x01我认为GP输出模式。另外,你只是在对它进行“或”操作,但是你操作它的价值是什么? – DiBosco
从“公开声明”:#define GPIO_MODER_MODER14_0((uint32_t)0x10000000)。所以它被设置为通用输出模式。我在这里放了=标志,但没有任何变化。我还把= BSRRL和BSRRH之前,并没有改变。 – Juliano
您的调试器确认MODER设置正确吗?你没有告诉我它是什么东西。我的下一个猜测是你试图切换错误的GPIO。没有看到原理图就不可能知道。 – DiBosco