1. 程式人生 > >Linux下開發stm32(四) | 韌體庫工程開發

Linux下開發stm32(四) | 韌體庫工程開發

st官方韌體庫是在暫存器操作之上的,但是使用暫存器操作的話,需要注意的地方很多,需要對照參考手冊一個一個賦值,稍有不慎便會出錯,所以韌體庫將外設的初始化封裝成初始化結構體,將外設的操作封裝在函式中,將暫存器賦值的操作都封裝起來,我們只需要呼叫API就可以,這樣一來既提高了開發效率,也減少了程式碼量,如果還不能在MDK裡熟練使用韌體庫程式設計,建議先補基礎~接下來,我們在上一節暫存器工程的基礎上,新增韌體庫,使用韌體庫進行開發。

1.建立韌體庫工程

將上一節的暫存器工程複製過來,改名為03-template-lib,然後再其中建立如下目錄結構,便於工程管理:

  • startup
    :存放啟動檔案
  • cmsis:stm32韌體庫中的cmsis支援庫
  • libraries:stm32韌體庫中的外設驅動庫
  • user:存放使用者自己的檔案
  • doc:存放說明文件

然後就開始從韌體庫中複製檔案了:

  • startup:直接將工程中的已有啟動檔案startup_stm32f10x_hd移動進去即可;

  • cmsis:將工程中已有的核心支援檔案core_cm3.h(不要從韌體庫中新增core_cm3.c進去,新增後編譯會出錯), 時鐘配置檔案system_stm32f10x.hsystem_stm32f10x.c(從韌體庫中複製),以及stm32標頭檔案stm32f10x.h


  • libraries:這個直接將韌體庫中STM32F10X_StdPeriph_Driver中的內容拷貝過來即可:

  • user:因為使用了韌體庫,所以將韌體庫配置標頭檔案stm32f10x_conf.h,中斷服務程式檔案stm32f10x_it.hstm32f10x_it.c都複製進去,這些檔案從韌體庫的project/STM32F10X_StdPeriph_Template中複製,最後將我們工程中已有的main檔案複製進去:

到這裡,我們的工程模板就建好了,然後就是編寫makefile來編譯整個工程了:

2.編譯韌體庫工程

韌體庫編譯的時候有幾點需要注意兩點:

  1. 檔案和makefile不是同一個目錄時,如何告訴makefile找到標頭檔案呢?
  2. 韌體庫中如此多的c檔案,如何新增依賴關係呢?

首先來解決第一個問題——如何告訴編譯器找到這些標頭檔案?

其實這個問題在講使用gcc的時候有講:當頭檔案不和原始檔在一個目錄時,需要使用-I(大寫i)引數給編譯器新增標頭檔案搜尋目錄,所以修改一下makefile:
在這裡插入圖片描述

然後來解決第二個問題 —— 如何新增大量的原始檔及其依賴到makefile?

其實檔案雖然多,但是仔細理一下會發現可以分為以下幾步:

  1. 找到全部的c檔案;
  2. 將每個c檔案編譯為目標檔案,不進行連結;
  3. 將所有的目標檔案一起連結,生成可執行檔案;

下面一步一步來~
首先如何找到所有的c檔案呢?可以在c檔案全部使用相對於makefile的相對路徑,顯然這是最笨的辦法,因為這麼多檔案,不可能一步一步新增,但是,在linux下可以使用find命令來尋找目錄下的檔案,所以我們使用find ./ -name '*.c'來尋找當前目錄下所有的c檔案,如圖:

修改makefile,新增所有的c原始檔:

接下來解決第二個小問題,如何將這些原始檔分別編譯為對應的目標檔案呢?
當然是不可能一個一個寫的,這裡使用makfile的靜態模式,它的語法是這樣的:

<targets>:<target-pattern>:<prereq-patterns>
	<commands>

這裡面targets定義了一系列目標檔案,可以有萬用字元,是目標的一個集合;target-pattern指明瞭targets的模式,prereq-parrterns是目標的依賴模式,它對target-parrtern形成的模式再進行一次依賴目標的定義:
首先我們需要一個目標集合,也就是使用剛剛的靜態模式將上一步所有搜尋到的.c檔案換為同名.o檔案:

最後將目標檔案新增到連結中:

這個時候,我們基本的兩個大問題就解決完了,接下來編譯器引數,一個是新增巨集定義,首先是晶片型號巨集定義STM32F10X_HD,然後是USE_STDPERIPH_DRIVER,表明我們使用了標準外設驅動庫;另一個是新增我們之前的標頭檔案路徑:

還有一點需要注意,啟動檔案也需要修改:

最後修改clean:

這裡我們的makefile就完成了,如果可以的話,還可以使用#新增必要的註釋進去,最後進行一下優化,讓它預設生成bin檔案和hex檔案:

接下來還不能直接make,之前我們配置時鐘是在main.c裡配置,這裡引入了韌體庫中的system_stm32f10x.c,時鐘配置在這裡面已經完成,預設配置為72M,所以可以將main.c中的時鐘初始化去了,然後使用make指令即可編譯。