【Birch開發板系列教程】(一)如何快速爲STM32創建工程模板(基於Keil、標準庫)

提示

  文章中操做基於Keil MDK5.2三、STM32F1和標準庫V3.5,建議讀者閱讀前確保本身已經安裝好Keil和STM32F1系列的Pack。html

  同時,若是但願照着本文操做的話,請準備好標準庫的庫文件,可在官網下載,地址:連接,下載須要註冊,嫌麻煩也能夠找別人分享的資源。git

(這裏也給出一份:連接electron

  另外,本教程是爲校科協電子部的Birch系列開發板準備的配套文檔之一,因此,使用STM32F103C8T6這顆芯片進行演示。函數

寫在前面

  在網上搜索STM32新建工程模板的方法的話,大部分教程都比較繁瑣,主要緣由在於大部分人只是照抄官方的指南、原子或者野火的教程什麼的,甚至不明白本身在搬運一些什麼文件,天然不會去想着簡化步驟。工具

  可是已經0202年了嘛,各類開發工具愈來愈強大,開發者在實現想法時須要面對的困難應該愈來愈少纔是(合理使用工具的話)。因此呢,在這裏我準備分享一下這段時間總結的一個快速創建工程模板的方法。學習

步驟

1、新建文件夾

  • 首先,新建一個文件夾來存放咱們的工程模板。起個描述用途的名字,好比「F103_Template」什麼的。
  • 而後,打開新建的文件夾,在裏面新建「Doc」「Lib」「Project」「User」四個文件夾分別用於存放用戶添加的文檔、庫文件、工程文件、用戶代碼等等

P1.jpg

2、新建工程

  • 打開Keil,依次選擇「Project -> New uVision Project」
  • 而後呢,會彈出一個窗口,用於指定工程文件的所在目錄和名稱,選擇咱們以前創建的「Project」文件夾,而後,給工程文件起個「容易從名稱上明白含義含義」的名字,好比「F103_Template」什麼的,保存。
  • 而後你會看到這樣的界面,在這裏,應當選擇一個芯片型號,以便IDE爲你準備芯片須要的啓動文件等等。

P2.jpg

顯然,爲了方便,應該在Search後面的框內輸入信息以搜索本身須要的型號而不是點加號展開列表慢慢找。開發工具

P3.jpg

選中後點擊OK確認。測試

  • 而後會來到配置運行時環境的界面,在通常的新建工程教程中,大部分藏得很深的、要在文件夾裏翻找半天才能看見的文件基本都是和芯片的內核、啓動、各項配置等相關的,合理配置運行時環境能夠大大簡化這一步驟。

    (如圖勾選而後確認便可,做用是添加內核相關的文件和啓動相關的文件)ui

P4.jpg

(其實在這個界面下能夠直接勾選須要的組件來配置標準外設庫,可是因爲庫文件不會被複制到工程中,有時會出一些問題。而選擇Core和Startup時,Keil軟件會在工程文件所在文件夾(咱們以前創建的「Project」)下新建一個「RTE」文件夾並複製相關資源到這裏,因此工程移動到其餘安裝合適版本的Keil的PC上以後這部分也能正常編譯)spa

3、分組、添加文件

  • 以前創建文件夾的時候是給文件分了類的,可是,剛剛創建的工程裏面可沒有咱們規整的劃分,打開一看,孤零零一個「Target_1」,(點加號)展開是下面這樣的:

P5.jpg

嗯,不對勁,得改。

  • 因此,在"Target_1"那裏單擊右鍵,而後選擇「Manage Project Items」

P6.jpg

  • 彈出一個這樣的界面,在這裏管理不一樣文件所屬的分組。

P7.jpg

很明顯,點擊叉叉能夠刪除當前選中的組。不過,點叉叉左邊的符號(而後輸入名字)能夠新建分組,這一點卻是不太明顯。

  • 刪掉默認的分組,新建分組「App」「Hardware_Driver」"Lib""Doc"四個分組,分別用於存放用戶的應用層級代碼文件、硬件驅動相關的代碼文件、庫文件、文檔(而後,記得點OK來確認修改)。

    而後就要準備添加文件到相應分組。不過,我們的「模板」裏面尚未庫文件呢,因此咱們得來添加一下。

  • 解壓以前下載的STM32F1的標準外設庫壓縮包,按照「STM32F10x_StdPeriph_Lib_V3.5.0 -> Libraries」的順序打開文件夾,而後複製「Libraries」目錄下的「STM32F10x_StdPeriph_Driver」文件夾到咱們準備的工程模板的「Lib」文件夾裏。這樣,工程模板的文件目錄下就有須要的庫文件了。
  • 以後回到Keil軟件,在左邊工程結構裏的「Lib」上單擊右鍵,選擇「Add Exsiting File ····」來添加文件(進入以前的「Manage Project Items」而後選中對應的組來添加文件也是同樣的)。

P8.jpg

添加文件的時候,進入咱們工程模板的Lib文件夾下,打開「STM32F10x_StdPeriph_Driver」這個咱們添加的文件夾,你會看到兩個分別叫「src」和「inc」的文件夾,「src」表示「source」,用於存放代碼文件,點開會發現一堆「xxx.c」,這些文件須要添加到工程;「inc」表示「include」,即程序應該包含的頭文件,打開會發現一堆「xxx.h」,這些文件不須要添加到工程,但須要在軟件中添加他們的路徑讓編譯器可以順利找到這些文件。

  • 因此,在打開了「STM32F10x_StdPeriph_Driver」以後,你須要作的就是,打開」src」文件夾,全選裏面的文件,點擊「Add」而後退出(沒有確認給你點)。以後你就能看到「lib」這一項的左邊多出一個加號,展開後就是添加的一堆文件。
  • 搞定src以後,還得處理inc,此次不須要添加文件,而是須要添加路徑。

    在「Target_1」處右鍵,而後選擇「Options for Target···」

P9.jpg

  • 在彈出的菜單中選擇「C/C++」選項卡,而後,在添加路徑以前(既然都到這來了),先來添加一個宏定義,

    在Define後邊的文本框中輸入一串字符「STM32F10X_MD,USE_STDPERIPH_DRIVER」,以下圖:

P10.jpg

在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)了。另外一個宏就很好理解了,使用標準庫的意思。

  • 而後,點擊「Include Paths」右側的「···」(如圖)

P11.jpg

  • 在彈出的界面中,嗯,你應該知道點哪一個東西來添加條目,選擇inc目錄並添加,效果以下圖,退出時記得點OK。

P12.jpg

敲黑板

  到這裏,雖然模板還不完善,可是你已經瞭解過全部的步驟,而且大體知道爲何要這麼作了,以後的講解中如遇相似操做,細節再也不贅述。

添加用戶代碼等等

  咱們的用戶文件夾「User」如今仍是空空的,以前分組的時候咱們試圖用分組讓文件的存儲更有條理,添加庫文件和路徑的時候咱們發現庫文件分了src和inc兩個文件夾分別存儲.c和.h文件,仔細一想這樣好像挺不錯的,因此咱們的User文件夾裏的內容也能夠如此放置。

  • 在工程模板的User文件夾下新建「Application」"BSP""Hardware_Driver"三個文件夾(BSP,即板級支持包,一般用於提供一些與特定開發板相關的接口函數),並分別在每一個文件夾下新建src文件夾和inc文件夾。

    (舒適提示:win下新建文件夾的快捷鍵爲Ctrl + Alt + N)

  • 回到Keil軟件界面,從頂部菜單依次選擇「File -> New」新建一個空白文件,而後保存爲「main.c」,保存的地方選擇"User -> Application -> src"(類型選擇默認的allfile便可,".c"不要省去)。
  • 而後,把main文件添加到「App」這個分組下(如今你應該會這個操做)。
  • 對了,到這還有個補充的操做,須要你回到以前解壓出來的外設標準庫文件夾下找點東西,請依次打開「STM32F10x_StdPeriph_Lib_V3.5.0 -> Project -> STM32F10x_StdPeriph_Template」,看名字就知道這是一個官方提供的工程模板,不過結構不是很適合咱們,因此咱們拿點東西就走。
  • 把該文件夾下的「stm32f10x_it.c」複製到"User -> Application -> src"下;「stm32f10x_it.h」複製到"User -> Application -> inc",而後C文件添加到Keil工程裏的App分組下,inc的路徑記得添加一下,這個操做你會的(笑)。
  • 仍是獲取「stm32f10x_it.c」的那個文件夾,把「stm32f10x_conf.h」複製到"User -> Application -> inc"下,添加過的路徑不一樣重複添加(既然在同一文件夾下)。

    OK,這個教程裏面咱們就搬這幾回東西。

測試與完善

  作完以前的步驟後,咱們創建了一個簡單但有序的空白工程,可是還不知道是否能用、好用,並且也缺少一些平時常用到的內容,接下來咱們就對這個工程進行一些測試和完善。

  首先,在main.c文件中輸入以下代碼:

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

int main()
{
    return 0;
}

  (這部分代碼什麼也沒有執行)

  使用快捷鍵F7能夠進行編譯(無效的話按Fn + Esc能夠切換熱鍵的狀態),或者點擊頂部菜單裏的"Build"也行,以下圖:

P13.jpg

  編譯完成後工做區域的底部應有相似下圖的提示:

P14.jpg

  可能會有一些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下載也是能夠的,不過這裏不作講解。

  • 打開下圖界面,進入「debug」選項卡,在圖示下拉列表中選擇ST-Link,而後點擊右側的「Settings」。

P15.jpg

  • 而後在彈出的菜單中選擇「Flash Download」選項卡,在該界面下勾選「Reset and Run」。很明顯,這個設置是讓下載器完成下載後幫你復位芯片以運行新下載的程序,省去手動復位的麻煩。

P16.jpg

  • 而後,F8下載,或者點擊頂部菜單裏的「Load」,以下圖:

P17.jpg

  若是沒有意外的話,核心板上的與「PC13」字樣相鄰的LED將會以必定頻率閃爍,咱們的工程模板實現了「能用」的階段性目標,不過,若是沒有順利實現預期效果也不要放棄,這裏提供一份作好的工程模板以供不順利的童鞋查對,地址:連接

  固然了,目前這個工程模板極不完善,缺乏不少經常使用的功能,好比準確的延時函數什麼的,要讓它變得「好用」,還須要繼續完善,不過,那是應該是下一篇文章的內容了。

(PS:如今能夠試着基於已有的工程模板讓LED發送「SOS」求救信號,並把操做封裝成一個函數)

相關文章
相關標籤/搜索