野火STM32學(xué)習(xí)筆記:固件庫大致的組成

這節(jié)課不編程,只是來分析一下這個固件庫。
猜猜固件庫有哪些部分組成
? ? 前幾節(jié)課我們已經(jīng)構(gòu)建了庫函數(shù)的模型,主要以GPIO為主角,今天我們就用構(gòu)建好的庫函數(shù)模型來猜一猜,固件庫的組成是什么樣的。
1.啟動文件
startup_stm32f10x_hd.s
這個啟動文件是由匯編編寫的,如圖所示在這個位置,名字叫startup_stm32f10x_hd.s

這個啟動文件的內(nèi)容大家有余力可以去仔細閱讀一下,我的匯編不是很好,忘得差不多了,大家其實只需要知道它的作用是什么就可以了。它的功能是:設(shè)置堆棧指針、設(shè)置PC指針、初始化中斷向量表、配置系統(tǒng)時鐘、對用C庫函數(shù)_main最終去到C的世界。以后有時間我會學(xué)習(xí)一下,再給大家講解的。
2.時鐘配置文件
system_stm32f10x.c
文件名叫system_stm32f10x.c,它的作用是把外部的HSE=8M,經(jīng)過PLL鎖相環(huán)(專門來倍頻的外設(shè))倍頻成72M,從而系統(tǒng)時鐘已經(jīng)配置為72M了。
3.外設(shè)相關(guān)的
stm32f10x.h
stm32f10x_xx.c
stm32f10x_xx.h
在進入固件庫編程之前,我們都是寄存器編程的,寄存器編程的困難性有目共睹,通過技術(shù)手冊尋找我們要使用的外設(shè)地址,要記住初始地址,偏移地址等等等等。因此我們要對各種外設(shè)(內(nèi)核外的)的地址進行寄存器映射的操作,寄存器映射就是我之前在我的第二篇博客最后講的,關(guān)于寄存器地址是如何封裝的。這里在把網(wǎng)上的解釋摘錄下來,給大家再復(fù)習(xí)一下。
寄存器映射:
我們知道,存儲器本身沒有地址,給存儲器分配地址的過程叫存儲器映射,那什么叫寄存器映射?寄存器到底是什么?
在存儲器Block2 這塊區(qū)域,設(shè)計的是片上外設(shè),它們以四個字節(jié)為一個單元,共32bit,每一個單元對應(yīng)不同的功能,當我們控制這些單元時就可以驅(qū)動外設(shè)工作。我們可以找到每個單元的起始地址,然后通過C 語言指針的操作方式來訪問這些單元,如果每次都是通過這種地址的方式來訪問,不僅不好記憶還容易出錯,這時我們可以根據(jù)每個單元功能的不同,以功能為名給這個內(nèi)存單元取一個別名,這個別名就是我們經(jīng)常說的寄存器,這個給已經(jīng)分配好地址的有特定功能的內(nèi)存單元取別名的過程就叫寄存器映射。
具體文章詳見知乎:https://zhuanlan.zhihu.com/p/96133532。
這些寄存器映射都在一個叫做stm32f10x.h的頭文件里,一般都是結(jié)構(gòu)體封裝的外設(shè),比如GPIO,串口,I2C,SPI這些。這些外設(shè)都在內(nèi)核外,是ST公司設(shè)計。對應(yīng)當然有ARM公司設(shè)計的內(nèi)核外設(shè),會在下面提到。
寄存器映射完成以后就要開始編程,操作這些寄存器了。我們構(gòu)建庫函數(shù)模型的時候就拿了GPIO舉了例子,它的固件庫C文件名稱叫做stm32f10x_gpio.c,里面寫了GPIO的置位復(fù)位函數(shù),初始化函數(shù)(必須有的),以此類推,如果是關(guān)于串口的固件庫,固件庫C文件名字應(yīng)該就是stm32f10x_usart.c。有C文件那必然會有頭文件,stm32f10x_gpio.h,stm32f10x_usart.h這些頭文件就用來存放C文件中的函數(shù)的定義,以及枚舉的一些外設(shè)工作狀態(tài),用再C文件里,這里我們可以再看一下GPIO對應(yīng)的stm32f10x_gpio.h。

4.內(nèi)核相關(guān)的
core_cm3.h
core_cm3.c
misc.h
misc.c
core_cm3.h實現(xiàn)了內(nèi)核里面的寄存器映射,當然也會有對應(yīng)的C文件。core_cm3.c的內(nèi)容是CMSIS-Cortex微控制器軟件接口標準,這些都是ARM公司設(shè)計的,只要是ARM公司設(shè)計的內(nèi)核的,都可以通用的。但是這個內(nèi)核的外設(shè)其實有很多,不過我們的單片機用不了那么多,因此ST公司把它裁剪了,于是這兩個文件misc.h,misc.c誕生了,它們中主要的內(nèi)核外設(shè)是NVIC(嵌套向量中斷控制器),SysTick(系統(tǒng)滴答定時器)。
5.頭文件的配置文件
stm32f10x_conf.h:頭文件的頭文件
它出現(xiàn)在main函數(shù)的開頭,在構(gòu)建庫函數(shù)模型的時候,由于我們只用了GPIO這個舉例子,如果用到其他的,ADC,I2C,這些的話,那都要把頭文件添加一遍。程序會非常冗雜,因此這個頭文件的頭文件作用,就是包含這些所有的頭文件了。奇怪的是,真正的固件庫里面是不包含這個頭文件的,其實不是不存在,只是開發(fā)者往往都把它包含在stm32f10x.h里面了,如圖所示

6.專門存放中斷服務(wù)函數(shù)的C文件
stm32f10x_it.c
stm32f10x_it.h
由于stm32非常強大,因此它有很多的中斷,為了方便管理,中斷服務(wù)函數(shù)全被寫在一個C文件里叫stm32f10x_it.c,當然與之對應(yīng)也有一個頭文件。這些中斷服務(wù)函數(shù)可以隨意放在某個地方。
最后固件庫成型大致是這樣的

啟動文件,內(nèi)核外設(shè),片上外設(shè),時鐘控制等等應(yīng)有盡有。
最后到達main函數(shù)的內(nèi)容
#include "stm32f10x.h"? ?// 相當于51單片機中的? #include <reg51.h>
int main(void)
{
// 來到這里的時候,系統(tǒng)的時鐘已經(jīng)被配置成72M。
}
在固件庫搭建完成以后,我們就可以在main函數(shù)里寫程序了。