學習stm32,第一步就是選擇開發工具了,GCC,MDK,IAR每一種都有自己的優劣勢,這里我選擇使用MDK軟件實現STM32模板。當然如果想更快的接觸stm32實例,領略嵌入式開發的魅力,STM也提供了豐富的例程供開發者學習使用,具體參考http://www.stmcu.com.cn/design_resources.html。直接使用例程對於快速開發實現功能十分有利,但當我們需要學習時就會變得復雜。為了更好的解析學習STM32,脫離例程,建立工程模板是十分有必要的。初次建立自然錯誤一堆,但通過查錯的過程,可以清晰的了解項目的執行流程和各模塊及定義的含義。如果你只是想快速的開發功能,那么上面網址內的資源會更加有效,不過如果你想深入學習嵌入式,那么從工程模板開始,一步步積累自己的STM32工程庫是必要的。
1. 准備工作
建立工程文件夾,在其下面添加/DRIVER,/MDK-ARM,/USER這三個文件夾(PS:所有文件夾名字要用英文,中文在某些情況下會出現未知編譯錯誤):
DRIVER:包含着與STM32F10x芯片相關的外設固件函數庫,啟動文件以及寄存器地址定義。
MDK-ARM:包含工程文件,編譯生成的中間文件以及最后輸出hex文件。
USER: 用戶編譯的代碼,包含外設配置和main文件。
移動標准庫函數文件中的配置文件到DRIVER文件夾中,以我當前使用的STM32F10x_StdPeriph_Lib_V3.5.0為例(后續的庫可能有其它改動,這可以按照這個思路去處理配置驅動文件),解壓STM32F10x_StdPeriph_Lib,...\\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries文件夾下的
並復制到...\\DRIVER文件夾下。
CMSIS:Cortex的微控制器軟件接口標准,它提供了stm32的啟動文件,外設定義,以及器件的定義。
STM32F10x_StdPeriph_Driver: ST公司提供的操作芯片的外設庫函數。
2. 使用MDK建立工程
1).新建工程
打開MDK5.14,選項Porject->New uVision Project,將生成的project放在...\MDK-ARM文件夾,之后選擇開發板對應芯片,例如我選擇的是芯片是STM32F107VC,如此便建立了一個空的工程。
2).添加GROUP,並添加項目文件
添加三個GROUP,並改名字為User,Driver,StartUp。
User:用戶代碼,包含自己編寫的外設配置函數和程序的功能主體實現,在...\\USER文件夾下
Driver:系統固件函數庫,在...\\DRIVER\STM32F10x_StdPeriph_Driver\src文件夾下
StartUp:啟動代碼,在...\\DIVER\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夾下
3).添加頭文件查找,解決錯誤
選中MDK中target文件夾,右鍵選擇OPTION(或者快捷鍵ALT+F7),在彈出的對話框上方選中C/C++。
在對話框下方的include Pathe處添加:......\SOURCE\STM32F10x_StdPeriph_Driver\inc提供頭文件目錄支持(后續還要添加新的頭文件目錄,如果了解windows環境變量Path,其實和這個的原理一樣),也就是將用到的頭文件的路徑包含到軟件中,在編譯的時候軟件就可以查詢指定目錄內的頭文件。
如此完成了整個工程的建立,下面就是解決錯誤了。上面的都完成后,再main.c文件里添加代碼,頭文件為#include"stm32f10x.h",編譯。如果你用的是標准庫文件,那么這時會出現
C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(8319):error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory
stm32f10x_conf.h里是所用外設的頭文件的申明以及程序內部assert處理命令,在3.5的固態庫我沒有找到這個頭文件,於是我下載一個具有所有外設頭文件申明的頭文件stm32f10x_conf.h,將其放入......\DRIVER\STM32F10x_StdPeriph_Driver\inc中,繼續編譯,出現一堆端口未定義,這是因為stm32f10x_conf.h雖然添加進去了,但並沒有真正啟用,在stm32f10x.h中查找,大概100行的位置
取消掉#define USE_STDPERIPH_DRIVER這句話的注釋,如上圖即可。
此外,#include”stm32f10x_conf.h”定義在#include"stm32f10x.h"的末尾.
下面就來講stm32f10x_conf.h這個頭文件。
里面包含了所有的外設頭文件,你需要用什么外設就取消對應得頭文件注釋即可。此外如果出現
C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(97):error: #35: #error directive:"Please select first the target STM32F10x device used in your application(in stm32f10x.h file)"
表明你沒有申明當前選擇的STM芯片的類型,在stm32f10x.h找到如下的代碼段,下方會有英文注釋告訴你如何選擇,取消掉你所用板子型號對應類型的注釋即可(重要,板子型號對應的寄存器設置會不同,選擇不符合的可能程序跑不起來),如stm32f107為互聯型,則取消STM32F10X_CL的注釋。
解決以上問題,那么一個基礎ARM項目模板就建立起來了,不過要實現一個完整的實現功能的嵌入式程序,還需要自己添加相關的代碼。上述程序的實踐可參考第二章:基於STM32F10x.3.5.0庫的流水燈程序實現
注意:如果使用系統自帶的啟動文件如startup_stm32f10x_cl.s等,則必須添加文件system_stm32f10x.c,否則程序會啟動不成功。
從這可以看出,復位后程序會先加載SystemInit,這個函數實現了系統時鍾RCC的配置,它的定義正是在system_stm32f10x.c中。