使用STM32單片機點亮LED

2023-06-21 11:11:09 來源:學嵌入式的釘子君

有一人,登場于金庸先生的《神雕俠侶》,以大理段氏“一陽指”自成一派,武學修為登峰造極,“天下五絕”之一,號稱“南帝”,他就是“一燈大師”。如今,武林中逐漸被遺忘的“一燈大師”,卻活躍在另一個行業——嵌入式開發中。

傳說,每一個成功的MCU(俗稱單片機)開發組中,都有一名“一燈大師”,他精通所有開發板的點燈方法,對于企業引入的新開發板,總是勤學苦練,從點燈開始,快速掌握新開發板的編程要點,帶領團隊走向勝利。

成為“一燈大師”,離不開持續的修行,離不開對一招一式的勤學苦練。本文將講解如何通過編程來控制STM32點亮一個LED


(資料圖片)

學習環境:

1.軟件:Keil5

2.硬件:STM32開發板(筆者使用信盈達公司的M4開發板,芯片型號為STM32F407ZGT6)

適合人群:

在校初入電子坑的小白,不懂STM32編程的硬件開發人員和想了解庫函數編程的人。

文末將提供示例代碼和文檔的資料分享。

Part 1

點燈的思路講解

本文中的點燈,是指用STM32單片機點亮與之連接的LED的操作。首先我們先了解一下LED這種器件。

LED的本質是一種發光二極管,所以點燈的核心就是:如何用STM32控制一個二極管電路。

市場上各類LED(直插式/貼片式以及各種顏色的LED,都有點區別)在導通時的壓降一般在1.8~3.3V。所以點燈需要先查看電路圖,確定驅動LED的方法。

下圖是筆者使用到STM32開發板的LED部分的原理圖。

本文接下來將以點亮LED1為例進行講解。通過上圖,我們可以看到或總結出以下信息:

1.LED1與單片機的PF6引腳連接。

2.由于LED1是一個二極管,點亮LED1需要PF6引腳上的電壓值為低電平(滿足發光二極管的導通壓降需求即可)。

3.由于需要實現控制LED1點亮和LED1熄滅,需要將PF6引腳配置為輸出模式,且輸出電平可控。

故在編程步驟中主要需要完成兩個部分:LED初始化函數(主要是配置引腳PF6為輸出模式)和 點亮/熄滅LED1的接口(控制引腳PF6輸出低/高電平)。

其中,LED1初始化的主要步驟為:

激活外設GPIOF(PF6是外設GPIOF的IO引腳之一)。將PF6配置為輸出模式將PF6的輸出類型配置為推挽輸出配置PF6輸出速度為低速(其他速度也可以)配置PF6的輸出數據(點亮/熄滅LED1)

Part 2

用庫函數編程方法點燈

本方法是通過調用STM32官方提供的庫函數,完成對引腳有關的一系列操作。庫函數編程方法簡單易用,適合新人學習。

Step1,打開STM32F4xx官方庫函數文檔(stm32f4xx_dsp_stdperiph_lib_um.chm),找到以下函數。

void  RCC_AHB1PeriphClockCmd (uint32_t RCC_AHB1Periph, FunctionalState NewState)   此函數用于激活AHB1總線上的外設(GPIOF在此總線上)void  GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)   此函數將基于參數初始化GPIOxvoid  GPIO_SetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)   此函數用于控制指定IO引腳輸出高電平void  GPIO_ResetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)   此函數用于控制指定IO引腳輸出低電平

Step2,通過在庫函數幫助文檔中點擊函數名,查看函數的定義,明確參數填寫方法。

比如,點擊GPIO_Init() 函數,查看其詳細信息

通過閱讀圖中文字,可知:第一個參數填寫為GPIOx,其中x需要用字母A~K替代(取決于引腳),由于本例使用PF6引腳,故填寫為GPIOF;第二個參數需要先定義一個GPIO_InitTypeDef類型的結構體變量,對其成員賦值后,再將變量的地址傳入。

繼續查看GPIO_InitTypeDef類型的定義。

GPIO_InitTypeDef結構體類型中的這5個成員分別表示對以下內容的配置:IO引腳的模式、輸出類型、引腳序號、內置電阻和 輸出速度。

其他幾個函數也可以參考此方法進行查看,從而確定函數的調用形式。

Step3,結合前文“點燈的思路講解”寫出代碼

//1. 激活外設GPIOFRCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOF, ENABLE);
//2. 將PF6配置為輸出模式//3. 將PF6的輸出類型配置為推挽輸出//4. 配置PF6輸出速度為低速GPIO_InitTypeDef   gpio_InitStruct ;gpio_InitStruct.GPIO_Mode   =  GPIO_Mode_OUT ;gpio_InitStruct.GPIO_OType   = GPIO_OType_PP ;gpio_InitStruct.GPIO_Pin     = GPIO_Pin_6 ;gpio_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL ;gpio_InitStruct.GPIO_Speed   =  GPIO_Low_Speed ;GPIO_Init (GPIOF , &gpio_InitStruct);
//5. 點亮/熄滅LED1#define LED1_ON    GPIO_ResetBits (GPIOF, GPIO_Pin_6)#define LED1_OFF   GPIO_SetBits (GPIOF, GPIO_Pin_6)

Step4,整理代碼,將他們添加到用Keil5軟件建立的工程中。可參考以下形式。(細節詳見文末提供的資料分享)

Step5,編程工程,下載到開發板,觀察現象。正常現象是LED1以固定的頻率交替進行亮和滅動作。

留給讀者的思考,本文提供的開發板的LED部分原理圖中還有另外3個LED,嘗試編寫代碼,驅動他們。有條件的朋友建議購買開發板直接實物驗證,將理論與實踐結合,早日成為“一燈大師”!

標簽:

上一篇:Linux系統中的抽象級別和層數|環球實時
下一篇:最后一頁