一、先下載芯片支持包
第一步:當然是先百度搜索我們的keil官網(wǎng)(網(wǎng)址):https://www.keil.com/

?第二步:點擊首頁的Project,會跳轉(zhuǎn)如界面,再次點擊Arm Cortex-M,如圖所示:

??第三步:點擊后會再次跳轉(zhuǎn),這時候我們再次點擊Public Software Packs,如圖所示:

第四步:點擊后會再次跳轉(zhuǎn),我們只要仔細尋找就可以找到STM32F1,點擊下載,下載起來有點點慢,如下圖所示:

第五步:下載完成后雙擊打開會自動檢索到安裝的keil的芯片包文件夾,點擊Next,開始安裝,如圖所示:


二、準備工作,將我們在理論篇創(chuàng)建的文件夾里面放入相應的文件內(nèi)容
(1)在CMSIS文件夾中存放的是我們內(nèi)核控制相關(guān)的文件,可以在之前我們下載好的ST標準庫找到,如下圖所示將文件復制粘貼進文件夾中:

名稱 |
文件所在標準庫中的位置 |
core_cm3.c\h |
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\CoreSupport |
stm32f10x.h、system_stm32f10x.c\h |
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x |
stm32f10x_conf.h 、stm32f10_it.c\h |
\STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA |
(2)STM32F10x_FWLib文件夾是存放ST標準庫文件的地方,里面有ST編寫的提供給用戶調(diào)用的規(guī)范化代碼,例如對引腳口、系統(tǒng)時鐘、DMA等等的操作,如下所示:

inc、src |
STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x_StdPeriph_Driver |
(3)startup文件夾存放芯片的啟動文件,怎么選擇對應的芯片的啟動文件請參考上一篇理論篇,如圖所示:

名稱 |
文件所在標準庫中的位置 |
startup_stm32f10x_hd.s |
\STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm |
(4) 剩余的user放置主函數(shù)文件、BSP、Application文件里創(chuàng)建的內(nèi)容有自己創(chuàng)建自己定義,然后Project我們等下創(chuàng)建的工程就是放在這里面
(5)Firmware等下編譯完程序輸出文件放置于此
三、MDK創(chuàng)建工程
第一步:打開keil5軟件,依次點擊Project—New uVision Project,如圖所示:

第二步:繼第一步后會彈出界面選擇保存位置,這里我們將整個工程存放在Project文件夾中工程取名為template,注意工程的后綴名,點擊保存,如圖所示:

?第三步:繼第二步后會彈出如下框,是讓我們選擇芯片,我們用的是STM32F103VE,故依次選擇STMicroelectronics—STM32F103—STM32F103VE—OK,這是芯片支持包提供的芯片種類,讓編譯器知道你用的是什么芯片,如果沒有安裝STM32F1的芯片支持包是沒有芯片可以選擇的。


??第四步:繼第三步后會彈出如下界面框Manage Run-Time Environment,可以用來配置 MDK 驅(qū)動和ST外設文件等,比如內(nèi)核文件與啟動文件,大家也可以先搜一下他的功能,這里我們先點擊Cancel,如下圖所示:由于我們之前已經(jīng)將內(nèi)科核文件和啟動文件準備好了,所以這里我們可以選擇跳過,

如果你沒準備還也可以點擊添加內(nèi)核文件與啟動文件,然后點擊OK完成后,可以在我們的Project文件夾看到keil創(chuàng)建的文件,以后我們就從Project—template進入我們的工程文件。

完成后,可以在我們的Project文件夾看到keil創(chuàng)建的文件,以后我們就從Project—template進入我們的工程文件。

?第五步:第四步后我們的工程就初步建立起來了,可以看到左側(cè)的project項目區(qū)沒有內(nèi)容只有默認的文件(Target),接著點擊如下按鈕,開始在工程里面新建目錄,將各個代碼分類存放,如圖所示:

點擊左邊區(qū)域的Target可以修改名稱,這里我們修改為template,同理接著點擊中間區(qū)域的Source Group1修改名稱,點擊第三個箭頭處的新建按鈕可以新建文件,依次建立如下文件,如下圖所示:

序號①處是新建文件、②處是刪除文件、③是上移選中的文件、④是下移選中的文件,創(chuàng)建完如下圖所示的文件后點擊OK完成創(chuàng)建,可以在左側(cè)項目目錄框看到我們新建好的目錄結(jié)構(gòu),如下圖所示:

??第六步:接下來就要將我們上一章復制粘貼的文件與工程關(guān)聯(lián)起來放入工程中,首先是把源文件(.c文件)引入工程,還是點擊第五步的小按鈕,如下圖所示:

①先選中CMSIS,然后在②點擊,添加文件,彈出界面,我們需要選中CMSIS中的源文件把他們添加進來,同理選中FWLB,點擊Add Files…將FWLIB-src下的文件添加進來,添加startup文件時請注意,需要將尋找的類型換成所有文件,因為啟動文件是.S結(jié)尾的,最后將新建的main.c也添加進user中,如下圖所示:

以此類推,把該添加的文件添加完成
??最后點擊下方的OK按鈕,完成添加,完成后可以在左側(cè)的項目框中看到我們添加的文件(FWLIB沒展開,有點多),如圖所示:

?第七步:完成了源文件的添加,接著就是頭文件的添加,點擊魔術(shù)棒按鈕,如下圖所示:

點擊后選中C/C++選項卡,在點擊Include Paths后面的…按鈕打開,如圖所示:

點擊①處新建后會出來②處空白的框在點擊②處的…按鈕添加路徑,注意頭文件的路徑需要選擇到頭文件的根目錄,我們把CMSIS、FWLIB-INC、main.h這些文件的路徑包含進來。如下圖所示:

第八步:添加完頭文件和源文件后,基本完成的差不多了,只是現(xiàn)在還不能進行編譯,我們還沒有編寫程序主函數(shù)main()函數(shù),在左側(cè)的Project項目框中,找到user,單擊點開,雙擊打開我們新建并添加的main.c文件,編寫main函數(shù),如圖所示:
#include "main.h"
int main(void)
{
while(1)
{
;
}
}
main.h文件:
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f10x.h"
#endif
?第九步:編寫好這兩個文件后,這個時候去點編譯的按鈕,可以看到,如圖所示:

?序號①是編譯當前文件,就是我們的main.c、序號②是快速編譯、序號③是全編譯,第一次打開工程時我們需要點擊③全編譯,后續(xù)修改工程我們可以按序號②縮短編譯時間

?一大堆問題,先別急,在按下序號②我們先看看現(xiàn)象,如下:

?當我們只編譯main.c就可以發(fā)現(xiàn)不會有錯誤,這是正確的,因為main.c沒啥內(nèi)容怎么會報錯,如下:

當我們?nèi)志幾g的時候會發(fā)送那么多錯誤和警告,這是為啥呢?原因是我們沒有將必須要包含的預編譯字讓編譯器包含。
??第十步:點擊魔術(shù)棒按鈕,選擇“C/C++”選項卡中所示紅框中添加STM32F10X_HD,USE_STDPERIPH_DRIVER(中間用英文的“,”隔開)這樣才能使編順利通過,如圖所示:

define這兩個字有什么用呢,我們一個一個看,首先是USE_STDPERIPH_DRIVER,字面理解使用標準外設驅(qū)動,我們在使用STM32時不可避免的會用到外設,像最常用的是引腳,我們需要把頭文件包含進來(#include “stm32f10x_gpio.h”),但是在寫代碼的時候我們往往不會這么操作,我們只會#include “stm32f10x.h”,就可以使用引腳的一些操作,這是為啥呢?原因很簡單,我們在stm32f10x.h文件中查找USE_STDPERIPH_DRIVER,可以發(fā)現(xiàn)下面的代碼:

如果我們定義了USE_STDPERIPH_DRIVER,就會把stm32f10x_conf.h文件包含進來,我們再看看stm32f10x_conf.h文件里面是什么,上一篇博客也提到過這份文件的作用,如圖所示stm32f10x_conf.h文件把我們用的所有的標準外設頭文件都包含進來了,所以我們只需要調(diào)用#include "stm32f10x.h"文件就能實現(xiàn)操作外設的作用,同時需要在C/C++選項卡定義USE_STDPERIPH_DRIVER:

再來看一下STM32F10X_HD,這像不像我們啟動文件的命名,我們打開另一份文件systeam_stm32f10x.c和stm32f10x.h,查找STM32F10X_HD,會找到一些與芯片時鐘頻率有關(guān)的定義,以及一些中斷號的定義與中斷服務函數(shù)有關(guān),如下兩圖所示:

?所以綜上這兩個參數(shù)的定義是必須要設置的。
?第十一步:最后我們再次全編譯會發(fā)現(xiàn)沒有錯誤沒有警告,我們的工程模板順利的創(chuàng)建完成了,如圖所示:

第一步:打開keil5軟件,依次點擊Project—New uVision Project,如圖所示:

?第二步:繼第一步后會彈出界面選擇保存位置,這里我們將整個工程存放在Project文件夾中工程取名為template,注意工程的后綴名,點擊保存,如圖所示:

?第三步:繼第二步后會彈出如下框,是讓我們選擇芯片,我們用的是STM32F103VE,故依次選擇STMicroelectronics—STM32F103—STM32F103VE—OK,這是芯片支持包提供的芯片種類,讓編譯器知道你用的是什么芯片

第四步:繼第三步后會彈出如下界面框Manage Run-Time Environment,可以用來配置 MDK 驅(qū)動和ST外設文件等,由于我們之前那已經(jīng)手動移植的啟動和內(nèi)核文件;比如華大單片機官方那提供的驅(qū)動庫文件沒有內(nèi)核文件,那我們就需要在這里將CORE內(nèi)核勾選,
但在這里我們STM32的官方驅(qū)動庫已經(jīng)提供,且我們已經(jīng)幅值到我們的文件夾了,所以這里我們點擊Cancel就可以了,如下圖所示:

??完成后,可以在我們的Project文件夾看到keil創(chuàng)建的文件,以后我們就從Project—template進入我們的工程文件。

?第五步:第四步后我們的工程就初步建立起來了,可以看到左側(cè)的project項目區(qū)沒有內(nèi)容只有默認的文件(Target),接著點擊如下按鈕,開始在工程里面新建目錄,將各個代碼分類存放,如圖所示:
(1)CMISIS

(2)啟動文件

注:這里只選擇對應型號的啟動文件,不要把文件的所有啟動文件全都包含進來,如果全部包含進來會出錯
那如果多選了會怎么樣呢?如下圖,選擇了多個啟動文件,那編譯器會產(chǎn)生什么錯誤呢?

Keil提示錯誤信息error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.

所以則合格錯誤表示,你添加多個啟動文件, 所以我們一定要選擇符合我們使用芯片類型的的啟動文件就好
(3)庫文件添加




??第六步:完成了源文件的添加,接著就是頭文件的添加,點擊魔術(shù)棒按鈕,如下圖所示:

??點擊后選中C/C++選項卡,在點擊Include Paths后面的…按鈕打開,如圖所示:

將下面這些頭文件添加進來

??第七步:添加完頭文件和源文件后,基本完成的差不多了,只是現(xiàn)在還不能進行編譯,我們還沒有編寫程序主函數(shù)main()函數(shù),在左側(cè)的Project項目框中,找到user,單擊點開,雙擊打開我們新建并添加的main.c文件,編寫main函數(shù),如圖所示:
#include "main.h"
#include "bsp_Stm32fx.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//搶占優(yōu)先級分組
BSP_SysTickInit();
BSP_UartInit(115200);
BSP_GpioInit();
while(1)
{
BSP_SetLed0(2);//LED0閃爍
delay_ms(300);
printf("hello word\n");
}
}
main.h文件:
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f10x.h"
#endif
?第八步:編寫好這兩個文件后,這個時候去點編譯的按鈕,可以看到,如圖所示:

?左到右 1號 2號 3號 ;序號①是編譯當前文件,就是我們的main.c、序號②是快速編譯、序號③是全編譯,第一次打開工程時我們需要點擊③全編譯,后續(xù)修改工程我們可以按序號②縮短編譯時間
然后我們編譯下:

一堆錯誤,,這是為啥呢?原因是我們沒有將必須要包含的預編譯字讓編譯器包含。

STM32F10X_HD,USE_STDPERIPH_DRIVER

重新編譯下

沒問題了,那為啥加這個就好了
?define這兩個字有什么用呢,我們一個一個看,首先是USE_STDPERIPH_DRIVER,字面理解使用標準外設驅(qū)動,我們在使用STM32時不可避免的會用到外設,像最常用的是引腳,我們需要把頭文件包含進來(#include “stm32f10x_gpio.h”),但是在寫代碼的時候我們往往不會這么操作,我們只會#include “stm32f10x.h”,就可以使用引腳的一些操作,這是為啥呢?原因很簡單,我們在stm32f10x.h文件中查找USE_STDPERIPH_DRIVER,可以發(fā)現(xiàn)下面的代碼:

如果我們定義了USE_STDPERIPH_DRIVER,就會把stm32f10x_conf.h文件包含進來,我們再看看stm32f10x_conf.h文件里面是什么,上一篇博客也提到過這份文件的作用,如圖所示stm32f10x_conf.h文件把我們用的所有的標準外設頭文件都包含進來了,所以我們只需要調(diào)用#include "stm32f10x.h"文件就能實現(xiàn)操作外設的作用,同時需要在C/C++選項卡定義USE_STDPERIPH_DRIVER:

再來看一下STM32F10X_HD,這像不像我們啟動文件的命名,我們打開另一份文件systeam_stm32f10x.c和stm32f10x.h,查找STM32F10X_HD,會找到一些與芯片時鐘頻率有關(guān)的定義,以及一些中斷號的定義與中斷服務函數(shù)有關(guān),如下兩圖所示:

??所以綜上這兩個參數(shù)的定義是必須要設置的。
最后我們需要將生成的hex文件下載到開發(fā)板驗證,下載之前我們先添加個好用的東西
上一篇文章講:Firmware文件夾:專門用來存放生產(chǎn)的Hex、bin等程序輸出燒錄文件
那么如何配置:
(1)創(chuàng)建一個文本L:編寫內(nèi)容如下

(2)將其另存為.bat后綴,放置于工程中

(3)點擊魔術(shù)棒將剛才的創(chuàng)建的"firmware.bat"文件包含進來

然后選擇重新編譯下

在看下文件Firmware里面只有一個hex很整潔!

到這里我們裸機工程創(chuàng)建結(jié)束了,我們最后看一下效果。

輸出正常!
附錄:
創(chuàng)建好的裸機工程:
鏈接:https://pan.baidu.com/s/1aaHOZryOd6nO1KX94bUncg
提取碼:8fd4文章來源:http://www.zghlxwxcb.cn/news/detail-604400.html
本文參考博主:https://blog.csdn.net/weixin_45857160/article/details/121062231?spm=1001.2014.3001.5501文章來源地址http://www.zghlxwxcb.cn/news/detail-604400.html
到了這里,關(guān)于MDK keil5新建STM32工程文件--實踐篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!