STM32學習之旅② 固件庫的使用及工程模板的建立



目錄:

一、認識其本質


  • STM32在進入中國市場的時候,商家爲了迎合中國市場,翻譯了很多英文文獻,所以STM32相對與其他單片機的資料是相對豐富的,這也是很多人推崇STM32的原因,這對於我們學習來說也是相當不錯的,但是由於翻譯版本很多,注意以官方版本爲準,在看文檔發現不對時應該參考官方文檔
  • 固件庫其實是官方爲了加快開發速度,幫助用戶快速上手芯片,進行二次開發而研究出來的,它的出現大大縮短了芯片開發週期

二、爲什麼要使用固件庫


(一)基於寄存器的編程(傳統編程方式)


  • 好處:開發者可以瞭解單片機較爲底層的寄存器,瞭解程序在硬件上的具體實現方式,便於糾錯。
  • 不足:
    1. 移植性差:由於單片機通常由很多外設,而不同型號的的單片機的寄存器操作方式都有所不同,當進行移植是需要修改的內容很多,工作量大。
    2. 效率低下:由於單片機內部資源豐富,需要設置的寄存器非常多,需要花很長的時間查閱用戶手冊才能完成。

(二)基於固件庫的編程


  • 極大縮短了開發週期,從而減少了開發成本

  • 不用深入底層底層便可以靈活規範地操作每一個外設,使編程思維更清晰,有利於開發人員將精力集中在頂層設計上

  • 具有可重入性,便於移植,便於二次開發

  • 固件庫的C源代碼只是用了最基本的C編程的知識,所有代碼經過嚴格測試,易於理解和使用,並且配有完整的文檔,非常方便進行二次開發和應用。


  • 另外,STM32的固件庫是開源的,它的源碼可以供我們學習參考,參考其如何使用c語言去實現一些複雜的功能。

三、所需材料



四、模板創建


(一)工作區和工程的建立

  • File->New Workspace

  • Project->Create New Project

這裏寫圖片描述

  • 建立工程文件夾
    這裏寫圖片描述
    這裏寫圖片描述

  • File->Save Workspace
    這裏寫圖片描述

  • 最後是這樣

這裏寫圖片描述


(二)STM32固件庫的介紹



- 固件庫的文件結構:下表簡述了固件庫文件內容及作用

這裏寫圖片描述
這裏寫圖片描述

文件夾名稱 子文件夾名稱 子子文件夾名稱 子子子文件夾名稱 描述
_htmresc ST官方Logo
Libraries CMSIS CM3 CoreSupport Cortex-M3內核內聯彙編文件
DeviceSupport 全局頭文件、時鐘配置文件以及相關啓動文件
STM32F10x_StdPeriph_Driver 標準固件庫文件,包含STM32外設對應驅動
Project STM32F10x_StdPeriph_Examples 各種外設使用例程
Project STM32F10x_StdPeriph_Template 不同IDE對應的模板文件
Utilities STM32_EVAL STM32評估版相關文件

固件庫的文件結構


(三)工程模板的建立及移植


1.複製工程源碼


  • 雖然STM32 固件庫裏面提供了很多例程給我們,但是都是基於ST 官方發行的一些評估板的,在實際應用當中,我們可能由於某些原因,不可能和官方評估板做的一模一樣,因此需要在STM32 標準例程的基礎上,進行移植和修改。

  • 建立層疊的文件夾,便於源碼的管理,在根文件夾裏面建立“USER”,“CMSIS”,“FWLIB”,“DRIVER”幾個文件夾,如下圖所示。其中,“USER”文件夾,主要存放用戶應用程序和中斷文件,如main.c 等等;“CMSIS”主要存放內核和系統相關的代碼;“FWLIB”主要存放STM32 標準外設的驅動代碼,“DRIVER”主要存放用戶的驅動代碼

這裏寫圖片描述

  • 複製相關文件至建立的模板文件夾。需要複製的文件夾如下表(小技巧:同時打開固件庫文件夾和模板文件夾,找到文件後直接ctrl+c、ctrl+v就OK了):
    這裏寫圖片描述

2.添加工程源碼

  • 我們最基本的源碼文件已經複製到我們建立的工程文件夾裏面,接下
    來要做的就是在IAR 裏面創造代碼管理文件夾,以及將相關的代碼添加到文件夾
    裏面。

  • 在IAR中添加管理文件夾,打開建立好的工作區

這裏寫圖片描述

  • 右鍵工程名->Add->Add Group…輸入文件夾名稱->OK,需要建立的文件夾如下圖所示

這裏寫圖片描述

  • 添加所需的文件,Add->Add File,需要添加的文件如下圖
    這裏寫圖片描述

  • 最後是這樣
    這裏寫圖片描述

  • 關於啓動文件的選擇
    這裏寫圖片描述


3.IDE的配置



  • 第一次編譯:Project->Make,然後是一堆錯誤,如下:
    這裏寫圖片描述
    我們看到這些錯誤大多是 cannot open source file "stm32f10x_spi.h" ,編譯器告訴爲們找不到對應的頭文件。解決方案是在option中添加對應的頭文件,右鍵工程名->Option…->Category->C/C++ Compiler->Preprocessor->在“Additional include directories:”輸入頭文件的包含路徑:
$PROJ_DIR$\
$PROJ_DIR$\CMSIS\
$PROJ_DIR$\FWLIB\inc\
$PROJ_DIR$\USER\
  • 每一行裏面用回車隔開,IAR是支持相對文件路徑的,但是要使用$PROJ_DIR$$PROJ_DIR$即代表根目錄文件夾“STM32F10X Template”。
    這裏寫圖片描述


  • 第二次編譯,還是有很多錯誤,仔細觀察可以發現,錯誤大多是 "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" ,請選擇芯片的型號

這裏寫圖片描述

  • 雙擊錯誤,條船到如圖所示的地方
    這裏寫圖片描述

  • 用Find功能找到其定義的地方
    這裏寫圖片描述

  • 這其實是預編譯處理,需要用戶指定需要使用的芯片型號,解決方案是在Options中進行預編譯處理,Options->Category->C/C++ compiler->Preprocessor->在“Defined Symbol”裏面定義所需要的芯片容量,添加STM32F10X_MD,如下圖:
    這裏寫圖片描述



  • 第三次編譯,編譯器告訴我們沒有包含“core_cm3.h”文件,解決方案是解決方式還是兩種,一是爲將庫函數裏面的core_cm3.h文件加入進工程。但是這樣編譯可能會出現其他錯誤,因此直接使用第二種方法,即使用IAR 自帶的core_cm3.h文件。Option->General Option->Target裏面選擇芯片型號,接着在在Option->General Option->Library Configuration裏面勾選“use
    CMSIS”,點擊“OK”,如下圖所示:
    這裏寫圖片描述
    這裏寫圖片描述
    這裏寫圖片描述


  • 第四次編譯,編譯器告訴我們缺少main.c文件,解決方案File->New File->File->Save->命名爲main.c->右鍵USER->Add->Add “main.c”,打開main.c,添加如下代碼
#include "stm32f10x.h"
int main()
{
    return 0;
}

這裏寫圖片描述

這裏寫圖片描述



  • 第五次編譯,0錯誤
    這裏寫圖片描述


  • 儘管錯誤已經沒有了,但是當我們調用驅動庫去操作外設的時候還是發現有問題,將以下代碼添加到main.c文件中,Make,如下圖
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
int main()
{
    GPIO_SetBits(GPIOA,0);
    return 0;
}

這裏寫圖片描述

這是因爲使用驅動庫的宏沒有打開,解決方案:Options->Category->C/C++ compiler->Preprocessor->Defined Symbol添加USE_STDPERIPH_DRIVER,如圖

這裏寫圖片描述

  • 然後設置鏈接選項裏面的flash 配置文件,Linker->Config->Linker Configuration file->,把“Override Default”選項勾選上,手動設置文件路徑爲$PROJ_DIR$\stm32f10x_flash.icf

  • 最後一次編譯,如下(記住要先右鍵工程名->Clean然後再Make):
    這裏寫圖片描述

  • 錯誤沒有,但是還是會有警告,而且警告的數量始終是53個,這是使用了固件庫的原因,但是不影響使用


  • 到這裏,一個基本的工程模板就建好了,以後的編程都可以基於這個模板開發,先複製一個副本,然後改成需要的名字,記住要保留模板文件


完!
愛學習的人總是好運的!!!
回到頂部

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章