簡體   English   中英

STM32閃爍的LED錯誤寄存器?

[英]STM32 blinking LED wrong register?

有誰知道為什么代碼不起作用?

RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);
GPIOB->MODER |= (0x1u << 6u);
for (int i = 0; i < 1000; i++) {
    GPIOB->ODR |= (0x1u << 0x3u);
}

我使用的是 STM 板 (STM32L432KC),它有一個集成 LED,稱為 PB3 引腳(端口 26),但在閃爍后沒有任何反應。 實際上應該有一個發光二極管。 我是否使用了正確的寄存器?

您在ODR設置了一點但從未清除它,因此它不會閃爍,您需要在開/關轉換之間有一個延遲才能明顯看到它在閃爍。

在可能的情況下寫入BSRR寄存器而不是ODR是一種很好的做法,這樣可以避免讀取-修改-寫入周期。

如果該代碼是您的整個main()那么您可能想用while(1)替換for (int i = 0; i < 1000; i++) while(1) ,您通常不想在嵌入式上下文中從main返回.

這個順序是錯誤的(我沒有檢查你是否使用了正確的RCC寄存器)

RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER &= ~(0x3u << 6u);

當您啟用外設時鍾時,您需要回讀該值或添加一些延遲您的更改以通過總線傳播。 我通常使用屏障指令。

RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
__DMB();
GPIOB->MODER &= ~(0x3u << 6u);

如果您不添加此延遲(或回讀),則第一次操作將失敗,因為它將在非時鍾 GPIO 外設上執行。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM