文章中操做基於Keil MDK5.2三、STM32F1和標準庫V3.5,建議讀者閱讀前確保本身已經安裝好Keil和STM32F1系列的Pack。html
同時,若是但願照着本文操做的話,請準備好標準庫的庫文件,可在官網下載,地址:連接,下載須要註冊,嫌麻煩也能夠找別人分享的資源。git
(這裏也給出一份:連接)electron
另外,本教程是爲校科協電子部的Birch系列開發板準備的配套文檔之一,因此,使用STM32F103C8T6這顆芯片進行演示。函數
在網上搜索STM32新建工程模板的方法的話,大部分教程都比較繁瑣,主要緣由在於大部分人只是照抄官方的指南、原子或者野火的教程什麼的,甚至不明白本身在搬運一些什麼文件,天然不會去想着簡化步驟。工具
可是已經0202年了嘛,各類開發工具愈來愈強大,開發者在實現想法時須要面對的困難應該愈來愈少纔是(合理使用工具的話)。因此呢,在這裏我準備分享一下這段時間總結的一個快速創建工程模板的方法。學習
顯然,爲了方便,應該在Search後面的框內輸入信息以搜索本身須要的型號而不是點加號展開列表慢慢找。開發工具
選中後點擊OK確認。測試
(如圖勾選而後確認便可,做用是添加內核相關的文件和啓動相關的文件)ui
(其實在這個界面下能夠直接勾選須要的組件來配置標準外設庫,可是因爲庫文件不會被複制到工程中,有時會出一些問題。而選擇Core和Startup時,Keil軟件會在工程文件所在文件夾(咱們以前創建的「Project」)下新建一個「RTE」文件夾並複製相關資源到這裏,因此工程移動到其餘安裝合適版本的Keil的PC上以後這部分也能正常編譯)spa
嗯,不對勁,得改。
很明顯,點擊叉叉能夠刪除當前選中的組。不過,點叉叉左邊的符號(而後輸入名字)能夠新建分組,這一點卻是不太明顯。
而後就要準備添加文件到相應分組。不過,我們的「模板」裏面尚未庫文件呢,因此咱們得來添加一下。
添加文件的時候,進入咱們工程模板的Lib文件夾下,打開「STM32F10x_StdPeriph_Driver」這個咱們添加的文件夾,你會看到兩個分別叫「src」和「inc」的文件夾,「src」表示「source」,用於存放代碼文件,點開會發現一堆「xxx.c」,這些文件須要添加到工程;「inc」表示「include」,即程序應該包含的頭文件,打開會發現一堆「xxx.h」,這些文件不須要添加到工程,但須要在軟件中添加他們的路徑讓編譯器可以順利找到這些文件。
在「Target_1」處右鍵,而後選擇「Options for Target···」
在Define後邊的文本框中輸入一串字符「STM32F10X_MD,USE_STDPERIPH_DRIVER」,以下圖:
在Define文本框中輸入的內容會被做爲全局的宏,不一樣的宏之間應該以英文逗號分隔(雖然看起來像句號,但那是個逗號)。
爲嘛要用宏呢,咱們知道,C語言裏面宏定義重要做用是用來進行添加編譯,寫一個
#ifdef XXX //若是定義了叫"XXX"的宏 //do something here. #elif defined XXXX //do something here. #endif
這樣的結構就能夠根據不一樣條件編譯不一樣內容。
咱們這裏有兩個宏,第一個是XXX_MD是「中容量產品」的意思,咱們使用的芯片STM32F103C8T6的Flash存儲器(做爲芯片的ROM)容量爲64KB(8 -> 64K),屬於ST劃分的F1系列下的「中容量產品」,若是是STM32F103ZET6這樣的「大容量產品」的話(E -> 512K),M就得改爲H(High)了。另外一個宏就很好理解了,使用標準庫的意思。
到這裏,雖然模板還不完善,可是你已經瞭解過全部的步驟,而且大體知道爲何要這麼作了,以後的講解中如遇相似操做,細節再也不贅述。
咱們的用戶文件夾「User」如今仍是空空的,以前分組的時候咱們試圖用分組讓文件的存儲更有條理,添加庫文件和路徑的時候咱們發現庫文件分了src和inc兩個文件夾分別存儲.c和.h文件,仔細一想這樣好像挺不錯的,因此咱們的User文件夾裏的內容也能夠如此放置。
(舒適提示:win下新建文件夾的快捷鍵爲Ctrl + Alt + N)
OK,這個教程裏面咱們就搬這幾回東西。
作完以前的步驟後,咱們創建了一個簡單但有序的空白工程,可是還不知道是否能用、好用,並且也缺少一些平時常用到的內容,接下來咱們就對這個工程進行一些測試和完善。
首先,在main.c文件中輸入以下代碼:
#include "stm32f10x.h" #include "stm32f10x_conf.h" int main() { return 0; }
(這部分代碼什麼也沒有執行)
使用快捷鍵F7能夠進行編譯(無效的話按Fn + Esc能夠切換熱鍵的狀態),或者點擊頂部菜單裏的"Build"也行,以下圖:
編譯完成後工做區域的底部應有相似下圖的提示:
可能會有一些warning(s),可是沒有Error的話就說明以前新建的空白工程基本沒問題。
接下來就能夠編寫程序測試這個工程模板是否真的能用了。
固然咱們會爲還在學習怎麼創建工程模板的童鞋提供代碼的,複製下面內容到main.c就能夠了(覆蓋原來的)。
#include "stm32f10x.h" #include "stm32f10x_conf.h" void delay_ms_test(uint32_t delay_time); void Board_LED_Init(void); void Board_LED_ON(void); void Board_LED_OFF(void); int main() { Board_LED_Init(); while(1) { Board_LED_ON(); delay_ms_test(200); Board_LED_OFF(); delay_ms_test(200); } return 0;//程序不會運行到這裏 } void delay_ms_test(uint32_t delay_time) { for(int i=0;i<delay_time;i++) { for(int j=0;j<11450;j++) { __nop();//do nothing } } } void Board_LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void Board_LED_ON(void) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,0); } void Board_LED_OFF(void) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,1); }
這部分程序實現的功能是讓核心板上PC13引腳鏈接的LED進行閃爍,一般STM32核心板都會有至少一個的板載LED,並且默認燒錄一個閃燈的代碼來測試,咱們用的「BluePill」也是這樣,爲了與本來的程序相區別,我把閃爍的頻率調快了一些。
F7以後,編譯沒問題的話就能夠準備下載了,工程默認的下載器是ulink,不經常使用。這裏咱們使用STlink進行下載。固然,ISP下載也是能夠的,不過這裏不作講解。
若是沒有意外的話,核心板上的與「PC13」字樣相鄰的LED將會以必定頻率閃爍,咱們的工程模板實現了「能用」的階段性目標,不過,若是沒有順利實現預期效果也不要放棄,這裏提供一份作好的工程模板以供不順利的童鞋查對,地址:連接
固然了,目前這個工程模板極不完善,缺乏不少經常使用的功能,好比準確的延時函數什麼的,要讓它變得「好用」,還須要繼續完善,不過,那是應該是下一篇文章的內容了。
(PS:如今能夠試着基於已有的工程模板讓LED發送「SOS」求救信號,並把操做封裝成一個函數)