主要針對(duì)一些使用較多、但本人并不十分清楚其作用的stm32官方.c/.h文件進(jìn)行系統(tǒng)的梳理。貼上官網(wǎng)標(biāo)準(zhǔn)庫(kù)下載地址(操作如下圖),或是直接下載這個(gè)附件。
簡(jiǎn)介
首先要搞清楚文件之間的關(guān)系。上圖。
打開固件庫(kù)文件。Libraries 文件夾下面有CMSIS 和 STM32F1xx_StdPeriph_Driver 兩個(gè)目錄,這兩個(gè)目錄包含固件庫(kù)核心的所有子文件夾和文件。 Libraries 1)CMSIS存放的是符合CMSIS規(guī)范的文件。包括STM32F1核內(nèi)外設(shè)訪問層代碼,DSP 軟件庫(kù),RTOS API,以及 STM32F1 片上外設(shè)訪問層代碼等。 2)STM32F1xx_StdPeriph_Driver放的是 STM32F1 標(biāo)準(zhǔn)外設(shè)固件庫(kù)源碼文件和對(duì)應(yīng)的頭文件。inc 目錄存放的是 stm32f1xx_ppp.h 頭文件,無(wú)需改動(dòng)。src 目錄下面放的是 stm32f1xx_ppp.c 格式的固件庫(kù)源碼文件。每一個(gè).c 文件和一個(gè)相應(yīng)的.h 文件對(duì)應(yīng),每個(gè)外設(shè)對(duì)應(yīng)一組文件。 ***Project *** 1)STM32F1xx_StdPeriph_Examples 文件夾下面存放的的 ST 官方提供的固件實(shí)例源碼,日后開發(fā)可修改這個(gè)官方提供的實(shí)例來(lái)快速驅(qū)動(dòng)自己的外設(shè)。 2)STM32F1xx_StdPeriph_Template 文件夾下面存放的是工程模板。 Utilities 存放官方評(píng)估板的對(duì)應(yīng)源碼。
CMSIS共三層:核內(nèi)外設(shè)訪問層Core Peripheral Access Layer(CPAL),中間件訪問層Middleware Access Layer(MWAL),設(shè)備訪問層Device Peripheral Access Layer(DPAL)。 CPAL用于訪問內(nèi)核的寄存器和組件,如NVIC,調(diào)試系統(tǒng)等。 MWAL用于對(duì)中間件的訪問。 DPAL用于定義一些硬件寄存器的地址和一些外設(shè)訪問函數(shù)。由芯片制造商實(shí)現(xiàn)。 CPAL層的實(shí)現(xiàn)——Core_cm3.c文件,DPAL層的實(shí)現(xiàn)——system_stm32f10x.c文件
STM32全部的標(biāo)準(zhǔn)外設(shè)名稱如下表所示。
工程目錄
比較喜歡這樣建工程
1、STARTUP----啟動(dòng)文件
startup_stm32f10x_hd.s
2、CMSIS------CMSIS標(biāo)準(zhǔn)文件
core_cm3.h 內(nèi)核功能定義
system_stm32f1xx.c 系統(tǒng),c文件
system_stm32f1xx.h 系統(tǒng).h文件
stm32f10x.h 頭文件
3、FWLIB------庫(kù)文件
misc.c/.h
stm32f10x_rcc.c/.h 庫(kù)函數(shù)源文件及對(duì)應(yīng)頭文件
stm32f10x_gpio.c/.h
....
4、HARDWARE---外設(shè)文件
oled、key文件...
5、SYSTEM-----系統(tǒng)文件
位帶操作函數(shù)sys文件、延時(shí)函數(shù)delay文件、串口操作函數(shù)usart文件...
6、USER-------用戶文件
main.c 主源文件
stm32f1xx_it.c 中斷源文件
stm32f1xx_it.h 中斷.h文件
XXX 工程文件
1、misc.c/h
一些版本的庫(kù)函數(shù)中沒有單獨(dú)對(duì)于NVIC的外設(shè)驅(qū)動(dòng),而是放在了misc.c ,以替代原stm32f10x_nvic.c。 定義了中斷優(yōu)先級(jí)分組以及 Systick 定時(shí)器相關(guān)的函數(shù)。
.c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src
2、startup_stm32f10x_hd.s
不同F(xiàn)lash容量不同啟動(dòng)文件(見下)。作用:設(shè)置堆棧、PC指針、初始化中斷向量表、配置系統(tǒng)時(shí)鐘等。 啟動(dòng)文件要引導(dǎo)進(jìn)入main 函數(shù)。Reset_Handler 中斷函數(shù)是唯一實(shí)現(xiàn)了的中斷處理函數(shù),其他的中斷函數(shù)基本都是死循環(huán)。Reset_handler 在系統(tǒng)啟動(dòng)的時(shí)候會(huì)調(diào)用。
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
此段代碼的作用是在系統(tǒng)復(fù)位后引導(dǎo)進(jìn)入 main 函數(shù),同時(shí)在進(jìn)入 main 函數(shù)之前,首先要調(diào)用 SystemInit()系統(tǒng)初始化函數(shù)。
.c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
3、system_stm32f10x.c/h
初始化時(shí)鐘的頻率、系統(tǒng)時(shí)鐘,設(shè)置中斷向量表的基地址和偏移地址。(這里有一個(gè)非常重要的SystemInit( )函數(shù)申明,在系統(tǒng)啟動(dòng)時(shí)都會(huì)調(diào)用,以設(shè)置系統(tǒng)的整個(gè)系統(tǒng)和總線時(shí)鐘) HSE=8M,經(jīng)過(guò)PLL倍頻為72M。
.c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
5、stm32f10x_conf.h
相當(dāng)于包含了所有的ST的3.5庫(kù)的頭文件,用戶在上層調(diào)用時(shí)只需要打開這個(gè)文件的注釋即可。實(shí)際使用中,會(huì)根據(jù)不同項(xiàng)目做改動(dòng)(可注釋掉不需用到的文件)。 stm32f10x.h頭文件中包含了stm32f10x_conf.h 。
.c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
6、stm32f10x_it.c/h
相當(dāng)于所有中斷函數(shù)入口,stm32f103的中斷入口名稱都固定,方便移植。事實(shí)上,用戶也可以把各自的中斷函數(shù)放在各自的模塊中而不使用該文件,效果相同。實(shí)際使用會(huì)根據(jù)不同項(xiàng)目做改動(dòng)。 .c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
7、core_cm3.c/h
由ARM 公司提供。是CMSIS的核心文件,提供進(jìn)入 M3 內(nèi)核接口,實(shí)現(xiàn)了內(nèi)核里面外設(shè)的寄存器映射。不需要修改這個(gè)文件。
1、NVIC相關(guān)的變量和函數(shù)。 中斷向量的使能 中斷向量的禁止 中斷向量的掛起 清除掛起的中斷 設(shè)置中斷的優(yōu)先級(jí) 讀取中斷的優(yōu)先級(jí) 2、systick定時(shí)器的配置,static __INLINE uint32_t SysTick_Config(uint32_t ticks);用來(lái)使能中斷、開啟systick定時(shí)器。
.c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
8、stm32f10x.h
十分重要的文件!主要功能:
- 定義各種中斷向量表的順序
- 定義數(shù)據(jù)類型
- 定義MCU外設(shè)相關(guān)的結(jié)構(gòu)體
- 定義外設(shè)在FLASH中的地址
- 進(jìn)行外設(shè)寄存器的位定義
它實(shí)現(xiàn)了內(nèi)核以外的外設(shè)的寄存器映射(映射到存儲(chǔ)區(qū)),相當(dāng)于51單片機(jī)中的<reg51.h>。
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
//外設(shè)別名區(qū)的基地址
#define PERIPH_BASE ((uint32_t)0x40000000)
//APB2外設(shè)總線上寄存器的基地址,GPIO掛在APB2總線上
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
// GPIO外設(shè)的地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
// 將外設(shè)地址強(qiáng)制轉(zhuǎn)化為結(jié)構(gòu)體的指針,然后就可以通過(guò)指針GPIOx區(qū)訪問某個(gè)端口中的寄存器
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
.c路徑:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
9、stm32f10x_xx.c/.h
stm32f10x_xx.c:外設(shè)的驅(qū)動(dòng)函數(shù)庫(kù)文件 stm32f10x_xx.h:存放外設(shè)的初始化結(jié)構(gòu)體,外設(shè)初始化結(jié)構(gòu)體成員的參數(shù)列表、外設(shè)固件庫(kù)函數(shù)的聲明
參考文章:1、2、3、4
|