|
st官方固件庫(kù)是在寄存器操作之上的,但是使用寄存器操作的話,需要注意的地方很多,需要對(duì)照參考手冊(cè)一個(gè)一個(gè)賦值,稍有不慎便會(huì)出錯(cuò),所以固件庫(kù)將外設(shè)的初始化封裝成初始化結(jié)構(gòu)體,將外設(shè)的操作封裝在函數(shù)中,將寄存器賦值的操作都封裝起來(lái),我們只需要調(diào)用API就可以,這樣一來(lái)既提高了開(kāi)發(fā)效率,也減少了代碼量,如果還不能在MDK里熟練使用固件庫(kù)編程,建議先補(bǔ)基礎(chǔ)~接下來(lái),我們?cè)谏弦还?jié)寄存器工程的基礎(chǔ)上,添加固件庫(kù),使用固件庫(kù)進(jìn)行開(kāi)發(fā)。 1.創(chuàng)建固件庫(kù)工程將上一節(jié)的寄存器工程復(fù)制過(guò)來(lái),改名為03-template-lib,然后再其中創(chuàng)建如下目錄結(jié)構(gòu),便于工程管理: 然后就開(kāi)始從固件庫(kù)中復(fù)制文件了: startup:直接將工程中的已有啟動(dòng)文件startup_stm32f10x_hd移動(dòng)進(jìn)去即可;
 cmsis:將工程中已有的內(nèi)核支持文件core_cm3.h(不要從固件庫(kù)中添加core_cm3.c進(jìn)去,添加后編譯會(huì)出錯(cuò)), 時(shí)鐘配置文件system_stm32f10x.h和system_stm32f10x.c(從固件庫(kù)中復(fù)制),以及stm32頭文件stm32f10x.h;
 libraries:這個(gè)直接將固件庫(kù)中STM32F10X_StdPeriph_Driver中的內(nèi)容拷貝過(guò)來(lái)即可:
 user:因?yàn)槭褂昧斯碳?kù),所以將固件庫(kù)配置頭文件stm32f10x_conf.h,中斷服務(wù)程序文件stm32f10x_it.h和stm32f10x_it.c都復(fù)制進(jìn)去,這些文件從固件庫(kù)的project/STM32F10X_StdPeriph_Template中復(fù)制,最后將我們工程中已有的main文件復(fù)制進(jìn)去:

到這里,我們的工程模板就建好了,然后就是編寫makefile來(lái)編譯整個(gè)工程了:
 2.編譯固件庫(kù)工程固件庫(kù)編譯的時(shí)候有幾點(diǎn)需要注意兩點(diǎn): 文件和makefile不是同一個(gè)目錄時(shí),如何告訴makefile找到頭文件呢? 固件庫(kù)中如此多的c文件,如何添加依賴關(guān)系呢?
首先來(lái)解決第一個(gè)問(wèn)題——如何告訴編譯器找到這些頭文件? 其實(shí)這個(gè)問(wèn)題在講使用gcc的時(shí)候有講:當(dāng)頭文件不和源文件在一個(gè)目錄時(shí),需要使用-I(大寫i)參數(shù)給編譯器添加頭文件搜索目錄,所以修改一下makefile:
在這里插入圖片描述然后來(lái)解決第二個(gè)問(wèn)題 —— 如何添加大量的源文件及其依賴到makefile? 其實(shí)文件雖然多,但是仔細(xì)理一下會(huì)發(fā)現(xiàn)可以分為以下幾步: 找到全部的c文件; 將每個(gè)c文件編譯為目標(biāo)文件,不進(jìn)行鏈接; 將所有的目標(biāo)文件一起鏈接,生成可執(zhí)行文件;
下面一步一步來(lái)~ 首先如何找到所有的c文件呢?可以在c文件全部使用相對(duì)于makefile的相對(duì)路徑,顯然這是最笨的辦法,因?yàn)檫@么多文件,不可能一步一步添加,但是,在linux下可以使用find命令來(lái)尋找目錄下的文件,所以我們使用find ./ -name '*.c'來(lái)尋找當(dāng)前目錄下所有的c文件,如圖:
 修改makefile,添加所有的c源文件:
 接下來(lái)解決第二個(gè)小問(wèn)題,如何將這些源文件分別編譯為對(duì)應(yīng)的目標(biāo)文件呢? 當(dāng)然是不可能一個(gè)一個(gè)寫的,這里使用makfile的靜態(tài)模式,它的語(yǔ)法是這樣的: <targets>:<target-pattern>:<prereq-patterns> <commands>
這里面targets定義了一系列目標(biāo)文件,可以有通配符,是目標(biāo)的一個(gè)集合;target-pattern指明了targets的模式,prereq-parrterns是目標(biāo)的依賴模式,它對(duì)target-parrtern形成的模式再進(jìn)行一次依賴目標(biāo)的定義: 首先我們需要一個(gè)目標(biāo)集合,也就是使用剛剛的靜態(tài)模式將上一步所有搜索到的.c文件換為同名.o文件:
 最后將目標(biāo)文件添加到鏈接中:
 這個(gè)時(shí)候,我們基本的兩個(gè)大問(wèn)題就解決完了,接下來(lái)編譯器參數(shù),一個(gè)是添加宏定義,首先是芯片型號(hào)宏定義STM32F10X_HD,然后是USE_STDPERIPH_DRIVER,表明我們使用了標(biāo)準(zhǔn)外設(shè)驅(qū)動(dòng)庫(kù);另一個(gè)是添加我們之前的頭文件路徑:
 還有一點(diǎn)需要注意,啟動(dòng)文件也需要修改:
 最后修改clean:
 這里我們的makefile就完成了,如果可以的話,還可以使用#添加必要的注釋進(jìn)去,最后進(jìn)行一下優(yōu)化,讓它默認(rèn)生成bin文件和hex文件:
 接下來(lái)還不能直接make,之前我們配置時(shí)鐘是在main.c里配置,這里引入了固件庫(kù)中的system_stm32f10x.c,時(shí)鐘配置在這里面已經(jīng)完成,默認(rèn)配置為72M,所以可以將main.c中的時(shí)鐘初始化去了,然后使用make指令即可編譯。
|