st官方固件庫是在寄存器操作之上的,但是使用寄存器操作的話,需要注意的地方很多,需要對照參考手冊一個一個賦值,稍有不慎便會出錯,所以固件庫將外設(shè)的初始化封裝成初始化結(jié)構(gòu)體,將外設(shè)的操作封裝在函數(shù)中,將寄存器賦值的操作都封裝起來,我們只需要調(diào)用API就可以,這樣一來既提高了開發(fā)效率,也減少了代碼量,如果還不能在MDK里熟練使用固件庫編程,建議先補基礎(chǔ)~接下來,我們在上一節(jié)寄存器工程的基礎(chǔ)上,添加固件庫,使用固件庫進行開發(fā)。
將上一節(jié)的寄存器工程復(fù)制過來,改名為03-template-lib
,然后再其中創(chuàng)建如下目錄結(jié)構(gòu),便于工程管理:
startup
:存放啟動文件
cmsis
:stm32固件庫中的cmsis支持庫
libraries
:stm32固件庫中的外設(shè)驅(qū)動庫
user
:存放用戶自己的文件
doc
:存放說明文檔
然后就開始從固件庫中復(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來編譯整個工程了:
固件庫編譯的時候有幾點需要注意兩點:
文件和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指令即可編譯。