2017-07-25 101 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