stm32固件库介绍_STM32固件库使用手册
目錄
一、初識stm32固件庫
1、什么是固件庫
2、初識庫函數
二、庫函數新建工程
1、新建本地工程文件夾
2、新建工程
三、GPIO 輸出—使用固件庫點亮 LED
1、LED引腳宏定義
2、LED 燈亮滅狀態的宏定義
3、LED GPIO 初始化函數
4、主函數
工程文件結構的基本構成
軟件設計
一、初識stm32固件庫
資料準備: 《
STM32F4xx
參考手冊》 《
STM32F4xx
規格書》
《
Cortex-M3 權威指南》
《
Cortex™-M4 內核參考手冊》
STM32
標準庫幫助文檔——《
stm32f4xx_dsp_stdperiph_lib_um.chm
》
1、什么是固件庫
ST
公司提供的標準軟件庫,包含了 STM32
芯片所有寄存器的控制操作,我們直接學習如何使用
ST
標準庫,會極大地方便控制 STM32
芯片。
在library里有:
在使用庫開發時,我們需要把
libraries
目錄下的庫函數文件添加到工程中,并查閱庫幫助文檔來了解 ST
提供的庫函數 如我們寫
STM32F4
的工程,必須用到其中的四個文件:
core_cm4.h
、
core_cmFunc.h
、 corecmInstr.h、
core_cmSimd.h
,其它的文件是屬于其它內核的,還有幾個文件是
DSP
函數庫使用的頭文件。
Include 文件夾;只需把這些文件加進我們的工程文件即可,有興趣的朋友可以深究
Device
文件夾下的是具體芯片直接相關的文件,包含啟動文件、芯片外設寄存器定義、系統時鐘初始化功能的一些文件。
system_stm32f4xx.c
文件:包含了 STM32
芯片上電后初始化系統時鐘、擴展外部存儲器用的函數 啟動文件 :如STM32F446 型號使“startup_stm32f446xx.s” stm32f4xx.h 文件:是一個 STM32 芯片底層相關的文件。
STM32F10x_StdPeriph_Driver 文件夾:文件夾下有 inc(include 的縮寫)跟 src(source 的簡寫)這兩個文件夾,這里的文件屬于 CMSIS 之外的的、芯片片上外設部分。
Project文件夾 stm32f4xx_it.c
:
stm32f4xx_it.c:這個文件是專門用來編寫中斷服務函數的 stm32f4xx_conf.h 文件:使用這個配置文件根據芯片型號增減 ST 庫的外設文件。
2、初識庫函數
學會查閱庫幫助文檔是很有必要的。
二、庫函數新建工程
1、新建本地工程文件夾
為了工程目錄更加清晰,我們在本地電腦上新建一個“工程模板”文件夾,在它之下 再新建 6 個文件夾,具體如下:在本地新建好文件夾后,把準備好的庫文件添加到相應的文件夾。
2、新建工程
①選擇
CPU
型號
②在線添加庫文件 ③添加組文件夾:文件從本地建好的工程文件夾下獲取,雙擊組文件夾就會出現添加文件的路徑,然后選擇文件即可 ④先把上面提到的文件從 ST 標準庫中復制到工程模版對應文件夾的目錄下,然后在新建的工程中添加這些文件,雙擊組文件夾就會出現添加文件的路徑,然后選擇文件即可 ⑤
設置文件是否加入編譯 ⑥
配置魔術棒選項卡(第一次配置的時候很重要!!!) ⑦下載仿真器配置
三、GPIO 輸出—使用固件庫點亮 LED
大致流程: 1. 使能 GPIO
端口時鐘; 2. 初始化 GPIO
目標引腳為推挽輸出模式; 3. 編寫簡單測試程序,控制 GPIO
引腳輸出高、低電平。
1、LED引腳宏定義
編寫應用程序要考慮更改硬件環境的情況,例如
LED 燈的控制引腳與當前的不一樣,我們希望程序只需要做最小的修改即可在新的環境正常運行。
若更改了硬件環境,只修改這些硬件相關的宏即可,這些定義一般存儲在頭文件,即本例子中的“bsp_led.h”文件中
1 //引腳定義
2 /*******************************************************/
3 //R 紅色燈
4 #define LED1_PIN GPIO_Pin_10
5 #define LED1_GPIO_PORT GPIOH
//GPIO_Pin_n可以理解為某端口腳在整個端口的位置。比方某GPIO口的第6管腳位置編碼GPIO_Pin_6 被定義為 //((uint16_t)0x0040) 有興趣的話,可以點擊GPIO_Init( )進去看看。
6 #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOH
7
8 //G 綠色燈
9 #define LED2_PIN GPIO_Pin_11
10 #define LED2_GPIO_PORT GPIOH
11 #define LED2_GPIO_CLK RCC_AHB1Periph_GPIOH
12
13 //B 藍色燈
14 #define LED3_PIN GPIO_Pin_12
15 #define LED3_GPIO_PORT GPIOH
16 #define LED3_GPIO_CLK RCC_AHB1Periph_GPIOH
22 /************************************************************/
以上代碼分別把控制四盞
LED
燈的
GPIO
端口、
GPIO
引腳號以及
GPIO
端口時鐘封裝起來了。在實際控制的時候我們就直接用這些宏,以達到應用代碼硬件無關的效果。
其中的
GPIO
時鐘宏“RCC_AHB1Periph_GPIOH”和“RCC_AHB1Periph_GPIOD”是 STM32 標準庫定義的
GPIO
端口時鐘相關的宏,它的作用與“GPIO_Pin_x”這類宏類似, 是用于指示寄存器位的,方便庫函數使用。它們分別指示 GPIOH
、
GPIOD
的時鐘,下面初始化 GPIO
時鐘的時候可以看到它的用法。 (區分GPIO、引腳、端口的概念。遇到宏不清楚的展開查看即可)
2、LED 燈亮滅狀態的宏定義
2 /* 直接操作寄存器的方法控制 IO */
3 #define digitalHi(p,i) {p->BSRRL=i;} //設置為高電平
4 #define digitalLo(p,i) {p->BSRRH=i;} //輸出低電平
5 #define digitalToggle(p,i) {p->ODR ^=i;} //輸出反轉狀態,Toggle是按鈕
6 /*BSRRH 表示GPIO端口置高電平寄存器,將端口賦給它,即此端口變為高電平*/
/*ODR 表示GPIO端口數據寄存器*/
7
8 /* 定義控制 IO 的宏 */
9 #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN)
10 #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN)
11 #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN)
12
13 #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN)
14 #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN)
15 #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN)
16
17 #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN)
18 #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN)
19 #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN)
2021 /* 基本混色,后面高級用法使用 PWM 可混出全彩顏色,且效果更好 */
2223 //紅 24 #define LED_RED \
25 LED1_ON;\
26 LED2_OFF;\
27 LED3_OFF
28
29 //綠
30 #define LED_GREEN \
31 LED1_OFF;\
32 LED2_ON;\
33 LED3_OFF
34
35 //藍
36 #define LED_BLUE \
37 LED1_OFF;\
38 LED2_OFF;\
39 LED3_ON
40
41
42 //黃(紅+綠)
43 #define LED_YELLOW \
44 LED1_ON;\
45 LED2_ON;\
46 LED3_OFF
這部分宏控制
LED
亮滅的操作是直接向
BSRR
寄存器寫入控制指令來實現的,對 BSRRL 寫
1
輸出高電平,對
BSRRH
寫
1
輸出低電平,對
ODR
寄存器某位進行異或操作 可反轉位的狀態。
3、LED GPIO 初始化函數
1 /**
2 * @brief 初始化控制 LED 的 IO
3 * @param 無
4 * @retval 無
5 */
6 void LED_GPIO_Config(void)
7 {
8 /*定義一個 GPIO_InitTypeDef 類型的結構體*/
9 GPIO_InitTypeDef GPIO_InitStructure;
10
11 /*開啟 LED 相關的 GPIO 外設時鐘*/
12 RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|
13 LED2_GPIO_CLK|
14 LED3_GPIO_CLK|
15 LED4_GPIO_CLK,
16 ENABLE);
17
18 /*選擇要控制的 GPIO 引腳*/
19 GPIO_InitStructure.GPIO_Pin = LED1_PIN;
20
21 /*設置引腳模式為輸出模式*/
22 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
23
24 /*設置引腳的輸出類型為推挽輸出*/
25 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
26
27 /*設置引腳為上拉模式*/
28 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
29
30 /*設置引腳速率為 2MHz */
31 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
32
33 /*調用庫函數,使用上面配置的 GPIO_InitStructure 初始化 GPIO*/
34 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
35
36 /*選擇要控制的 GPIO 引腳*/
37 GPIO_InitStructure.GPIO_Pin = LED2_PIN;
38 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
39
40 /*選擇要控制的 GPIO 引腳*/
41 GPIO_InitStructure.GPIO_Pin = LED3_PIN;
42 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
43
44 /*選擇要控制的 GPIO 引腳*/
45 GPIO_InitStructure.GPIO_Pin = LED4_PIN;
46 GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);
47
48 /*關閉 RGB 燈*/
49 LED_RGBOFF;
50 }
推挽模式跟開漏模式的區別:
置推挽模式,只能是輸出模式,而輸出高低電平的驅動電流都很大;
而開漏模式,即可作為輸出,也可作為輸入。
上拉就是把電位拉高,比如拉到Vcc;下拉就是把電壓拉低,比如拉到GND;浮空輸入,相當于該引腳接了高電平,引腳不建議懸空,易受干擾。
(1)
使用
GPIO_InitTypeDef
定義
GPIO
初始化結構體變量,以便下面用于存儲
GPIO
配置。 (2)
調用庫函數
RCC_AHB1PeriphClockCmd
來使能
LED
燈的
GPIO
端口時鐘
(3)
向
GPIO 初始化結構體賦值,把引腳初始化成推挽輸出模式,其中的 GPIO_Pin 使用宏“LEDx_PIN”來賦值,使函數的實現方便移植。
(4)使用以上初始化結構體的配置,調用 GPIO_Init
函數向寄存器寫入參數,完成
GPIO
的 初始化
(5)
使用同樣的初始化結構體,只修改控制的引腳和端口,初始化其它
LED
燈使用的 GPIO 引腳 (6)
使用宏控制
RGB
燈默認關閉,
LED4
指示燈默認開啟。
4、主函數
1 #include "stm32f4xx.h"
2 #include "./led/bsp_led.h"
3
4 void Delay(__IO u32 nCount);
5
6 /**
7 * @brief 主函數
8 * @param 無
9 * @retval 無
10 */
11 int main(void)
12 {
13 /* LED 端口初始化 */
14 LED_GPIO_Config();
15
16 /* 控制 LED 燈 */
17 while (1) {
18 LED1( ON ); // 亮
19 Delay(0xFFFFFF);
20 LED1( OFF ); // 滅
21
22 LED2( ON ); // 亮
23 Delay(0xFFFFFF);
24 LED2( OFF ); // 滅
25
26 LED3( ON ); // 亮
27 Delay(0xFFFFFF);
28 LED3( OFF ); // 滅
29
30 /*輪流顯示 紅綠藍黃紫青白 顏色*/
31 LED_RED;
32 Delay(0xFFFFFF);
33
34 LED_GREEN;
35 Delay(0xFFFFFF);
36
37 LED_BLUE;
38 Delay(0xFFFFFF);
39
40 LED_YELLOW;
41 Delay(0xFFFFFF);
42
43 LED_PURPLE;
44 Delay(0xFFFFFF);
45
46 LED_CYAN;
47 Delay(0xFFFFFF);
48
49 LED_WHITE;
50 Delay(0xFFFFFF);
51
52 LED_RGBOFF;
53 Delay(0xFFFFFF);
54 }
55 }
56
57 void Delay(__IO uint32_t nCount) //簡單的延時函數
58 {
59 for (; nCount != 0; nCount--);
60 }
在
main
函數中,調用我們前面定義的
LED_GPIO_Config
初始化好
LED
的控制引腳, 然后直接調用各種控制 LED
燈亮滅的宏來實現
LED
燈的控制。 以上,就是一個使用 STM32 標準軟件庫開發應用的流程。
附加
#ifndef __LED_H
#define __LED_H//是為了避免重復定義頭文件
自定義的頭文件需要添加到路徑里
總結
以上是生活随笔為你收集整理的stm32固件库介绍_STM32固件库使用手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEO优化中关键词布局怎么做
- 下一篇: 互联网架构优化