簡體   English   中英

STM32裸金屬C - 無法使LED工作

[英]STM32 Bare Metal C - Can't get LED to work

所以我現在正在學習STM32微處理器的課程,但是,即使是最基本的東西,我似乎也失敗了:開啟LED。 完整的代碼位於這篇文章的底部。

重要:

  • 硬件運行正常。
  • 我使用的是STM32L432KC。

首先,我們必須弄清楚內置LED是什么引腳。 根據制造商手冊,LED應位於引腳D13(PB3)上。 在此輸入圖像描述


好的,我們正在尋找PB3。 根據STM32L432KC的數據表,PB3位於B端口,因此連接到高性能總線,如下圖所示。 在此輸入圖像描述


涼。 所以我們的巴士是AHB2,我們正在與GPIOB合作。 現在我們必須使用RCC_AHB3ENR寄存器在該總線上啟用時鍾。 現在,這是我可能會犯錯的部分(因為這篇文章不會存在),所以請密切注意。 如果我理解正確,我希望將第1位設置為1,因為這表示“GPIOBEN”設置為“啟用了IO端口B時鍾”。 在此輸入圖像描述 在此輸入圖像描述

這讓我相信我應該按如下方式設置總線寄存器:

RCC->AHB2ENR |= 0x2;

接下來我必須將GPIO引腳的模式設置為輸出。 根據課程和我的文檔,這是使用GPIOx_MODER完成的。 在此輸入圖像描述

這讓我相信我應該按如下方式設置GPIO模式:

GPIOB->MODER |= 0x40;

最后但並非最不重要的是打開實際的LED,我們必須設置輸出數據寄存器GPIOx_ODR。 在此輸入圖像描述

這讓我相信我應該將數據設置如下:

GPIOB->ODR = 0x8;

我不知道我哪里出錯了,但這是我第一次在如此深層次的寄存器上工作。 我必須忽視一些事情,但我嘗試了多個例子但沒有成功。 所有幫助表示贊賞。 這是完整的代碼:

// PB3 - User LED
// RCC->AHB2ENR
// GPIOx_MODER
// GPIOx_ODR

#include "stm32l4xx.h"

int main(void)
{
    RCC->AHB2ENR |= 0x2;
    GPIOB->MODER |= 0x40;

    while(1)
    {
        GPIOB->ODR = 0x8;
    }
}

您的模式寄存器配置不正確。 你的代碼行

GPIOB->MODER |= 0x40;

只能設置位,它不能清除它們。 並且您設置的位數太多,因為每對的復位值為11 ,端口CE的整個寄存器為FFFF FFFF ,端口B的FFFF FEBFFFFF FEBF

你應該用

GPIOB->MODER = (GPIOB->MODER & 0xFFFFFF3F) | 0x00000040;

雖然因為重置狀態得到保證,但這也有效:

 
 
 
  
  GPIOB->MODER &= 0xFFFFFF7F; // equivalently, ~0x0080
 
  

11 analog mode (reset state)文檔中的注釋對於所有引腳都不准確。 有幾個在復位時處於10 alternate function模式,包括PB3。 所以你需要清除一位並設置一位。

暫無
暫無

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

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