2017-07-25 155 views
0

我测试了所有四个内置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++); 
} 
} 

我的问题是什么?

+1

我不知道| =为GPIOD - > BSRRL&BSRRH是正确的。试试=而不是| =。除此之外,最有可能的是您的GPIO设置不正确。该行:GPIOD - > MODER | = GPIO_MODER_MODER14_0;什么是GPIO_MODER_MODER14_0定义为?应该是0x01我认为GP输出模式。另外,你只是在对它进行“或”操作,但是你操作它的价值是什么? – DiBosco

+0

从“公开声明”:#define GPIO_MODER_MODER14_0((uint32_t)0x10000000)。所以它被设置为通用输出模式。我在这里放了=标志,但没有任何变化。我还把= BSRRL和BSRRH之前,并没有改变。 – Juliano

+0

您的调试器确认MODER设置正确吗?你没有告诉我它是什么东西。我的下一个猜测是你试图切换错误的GPIO。没有看到原理图就不可能知道。 – DiBosco

回答

3

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)

+0

回答所有评论时,调试器未显示GPIO_BSRR_BR_14的任何值。现在这两个值都是0x4000,它与引脚D14的值1匹配。 BR被重置,所以我认为我应该设置点亮和RSetting来关闭LED。现在我写for循环(time; time> 0; time--)。 BSRRL和BSRRH没有OR,现在都是BS_14。有效。万分感谢。我将学习更多关于ORing,ANDing等的知识。 – Juliano

+0

kk很棒,我甚至没有看过延迟循环。这显示了一个调试器的值,您可以在其中设置中断点和步骤。你会立即看到,LED *做*打开和关闭,很快意识到这是你的延迟循环无法正常工作。 – DiBosco