目錄:
一、認識其本質
- STM32在進入中國市場的時候,商家爲了迎合中國市場,翻譯了很多英文文獻,所以STM32相對與其他單片機的資料是相對豐富的,這也是很多人推崇STM32的原因,這對於我們學習來說也是相當不錯的,但是由於翻譯版本很多,注意以官方版本爲準,在看文檔發現不對時應該參考官方文檔
- 固件庫其實是官方爲了加快開發速度,幫助用戶快速上手芯片,進行二次開發而研究出來的,它的出現大大縮短了芯片開發週期
二、爲什麼要使用固件庫
(一)基於寄存器的編程(傳統編程方式)
- 好處:開發者可以瞭解單片機較爲底層的寄存器,瞭解程序在硬件上的具體實現方式,便於糾錯。
- 不足:
- 移植性差:由於單片機通常由很多外設,而不同型號的的單片機的寄存器操作方式都有所不同,當進行移植是需要修改的內容很多,工作量大。
- 效率低下:由於單片機內部資源豐富,需要設置的寄存器非常多,需要花很長的時間查閱用戶手冊才能完成。
(二)基於固件庫的編程
極大縮短了開發週期,從而減少了開發成本
不用深入底層底層便可以靈活規範地操作每一個外設,使編程思維更清晰,有利於開發人員將精力集中在頂層設計上
具有可重入性,便於移植,便於二次開發
固件庫的C源代碼只是用了最基本的C編程的知識,所有代碼經過嚴格測試,易於理解和使用,並且配有完整的文檔,非常方便進行二次開發和應用。
- 另外,STM32的固件庫是開源的,它的源碼可以供我們學習參考,參考其如何使用c語言去實現一些複雜的功能。
三、所需材料
獲取STM32官方固件庫,從網盤獲取, 密碼:8sgn
如何從ST官網獲取芯片的相關文檔手冊,中文版 ,密碼:wupy
四、模板創建
(一)工作區和工程的建立
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個,這是使用了固件庫的原因,但是不影響使用
- 到這裏,一個基本的工程模板就建好了,以後的編程都可以基於這個模板開發,先複製一個副本,然後改成需要的名字,記住要保留模板文件
完!
愛學習的人總是好運的!!!
回到頂部