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

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