- <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、MDK 安裝說明:安裝路徑不要包含中文,否則,就會出現一些奇怪的錯誤!</span>
2、建立工程
1)、由於以前用慣了原子的模板,就用原子大哥的模板啦!新建一個文件夾,命名為Template,然后在其下,建立五個子文件夾:CORE ,FWLIB,OBJ,SYSTEM,USER。名字可以隨便取,怎樣方便識別就怎樣取,如下:
2)、打開 Keil,點擊 Keil 的菜單: Project –>New Uvision Project ,然后將目錄定位到剛才建立的文件夾 Template 之下的 USER 子目錄,同時,工程取名為 MY_Template
之后點擊保存,我們的工程文件就都保存到 USER 文件夾下面。 操作過程如下圖:
新建工程
工程保存路徑以及命名
3)、接下來會出現一個選擇Device的界面,由於我買的是STM32F407ZGT6 核心板,故在STMicroelectronics 下面的 STM32F407ZG。(一定要安裝對應的器件 pack 才會顯示這些內容)
點擊 OK, MDK 會彈出 Manage Run-Time Environment 對話框
這是 MDK5 新增的一個功能,在這個界面,我們可以添加自己需要的組件,從而方便構建開發環境,沒用到,我們直接點擊 Cancel,即可得如下界面:
4)、現在我們可以看看USER 目錄下包含了 2 個文件,如下圖:
5)、工程建立好之后,我們就要將官方的固件庫包里的源碼文件復制到我們工程目錄對應的文件夾下面。
打開官方固件庫包,定位到我們之前准備好的固件庫包的目錄:\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,將目錄下面的 src,inc
文件夾 copy 到我們剛才建立的 FWLib 文件夾下面。src 存放的是固件庫的.c 文件, inc 存放的是對應的.h 文件,您不妨打開這兩個文件目錄過目一下里面的文件,每個外設對
應一個.c 文件和一個.h 頭文件。 如下圖
6)、接下來我們將固件庫包里面相關的啟動文件復制到我們的工程目錄CORE下。
打開官方固件庫包,定位到目錄 \STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 下面,將文件
startup_stm32f40_41xxx.s 復制到 CORE 目錄下面。然后定位到目錄\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Includ,將里面的頭文件 core_cm4.h
和 core_cm4_simd.h 同樣復制到 CORE 目錄下面。現在看看我們的 CORE 文件夾下面的文件,如下圖 :
7)、接下來我們要復制工程模板需要的一些其他頭文件和源文件到我們的工程。
首先定位到目錄:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 將里面的 2 個頭文件 stm32f4xx.h 和 system_stm32f4xx.h 復制到
USER 目錄之下。 這兩個頭文件是STM32F4 工程非常關鍵的兩個頭文件。后面我們講解相關知識的時候會給大家詳細講解。然后進入目錄
\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates ,將 目 錄 下 面 的 5 個 文 件 main.c , stm32f4xx_conf.h , stm32f4xx_it.c ,
stm32f4xx_it.h ,system_stm32f4xx.c 復制到 USER 目錄下面。 請按下圖 選中 5 個文件然后復制:
將這 2+5 個文件復制到USER 目錄中之后,USER目錄文件如下圖:
8)、前面 7 個步驟,我們將需要的固件庫相關文件復制到了我們的工程目錄下面,下面我們將這些文件加入我們的工程中去。右鍵點擊 Target1,選擇 Manage
Project Items...或者直接點擊快捷按鈕,如下圖,
9)、Project Targets 一欄,我們將 Target 名字修改為 Template,然后在 Groups 一欄刪掉一個 Source Group1,建立三個 Groups: USER,CORE,FWLIB。然后點擊 OK,可
以看到我們的 Target名字以及 Groups 情況如下圖
10)、下面我們往 Group 里面添加我們需要的文件。我們按照步驟 9 的方法, 右鍵點擊點擊Tempate,選擇選擇 Manage Components.然后選擇需要添加文件的 Group,這
里第一步我們選擇 FWLIB,然后點擊右邊的 Add Files,定位到我們剛才建立的目錄\FWLIB\src 下面,將里面所有的文件選中(Ctrl+A),然后點擊 Add,然后 Close.可以看到Files
列表下面包含我們添加的文件,如下圖,這里需要說明一下,對於我們寫代碼,如果我們只用到了其中的某個外設,我們就可以不用添加沒有用到的外設的庫文件。
例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。這里我們全部添加進來是為了后面方便,不用每次添加,當然這樣的壞處是工程太
大,編譯起來速度慢,用戶可以自行選擇。(添加文件也可以直接在FWLIB 圖標上單擊右鍵選擇 Add Exsiting....選擇要添加的文件即可)
這里有個文件 stm32f4xx_fmc.c 比較特殊。這個文件是 STM32F42 和 STM32F43 系列才用到,所以我們這里要把它刪掉( 注意是 stm32f4xx_fmc.c 要刪掉,不要刪掉
stm32f4xx_fsmc.c)。
11)、用同樣的方法,將 Groups 定位到 CORE 和 USER 下面,添加需要的文件。這里我們的 CORE 下面需要添加的文件為 startup_stm32f40_41xxx.s(注意,默認添加的時
候文件類型為.c,也就是添加 startup_stm32f40_41xxx.s 啟動文件的時候,你需要選擇文件類型為 All files才能看得到這個文件 ), USER 目錄下面需要添加的文件為 main.c,
stm32f4xx_it.c,system_stm32f4xx.c。 這樣我們需要添加的文件已經添加到我們的工程中去了,最后點擊 OK,回到工程主界面。
12)、接下來我們就需要在MDK 里面設置頭文件存放路徑。也就是告訴 MDK 到那些目錄下面去尋找包含了的頭文件。這一步驟非常重要。 如果沒有設置頭文件路徑,那么工
程會出現報錯頭文件路徑找不到。 具體操作如下圖, 5 步之后添加相應的頭文件路徑。
這里我們需要添加的頭文件路徑包括: \CORE, \USER\以及\FWLIB\inc。固件庫存放的頭文件子目錄是\FWLIB\inc,不是 FWLIB\src。
13)、接下來對於 STM32F40 系列的工程,還需要添加一個全局宏定義標識符。添加方法是點擊魔術棒之后,進入 C/C++選項卡,然后在 Define 輸入框連輸入:
STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意這里是兩個標識符 STM32F40_41xxx和 USE_STDPERIPH_DRIVER, 他們之間是用逗號隔開的。
14)、接下來我們要編譯工程,在編譯之前我們首先要選擇編譯中間文件編譯后存放目錄。方法是點擊魔術棒,然后選擇Output 選項下面的Select folder for object...,然后選擇目錄為我們上面新建的OBJ 目錄。同時將下方的三個選項框都勾上。如下圖

數變量定義。
15)、在編譯之前,我們先把 main.c 文件里面的內容替換為如下內容:
- #include "stm32f4xx.h"
- void Delay(__IO uint32_t nCount);
- void Delay(__IO uint32_t nCount)
- {
- while(nCount--){}
- }
- int main(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOF, &GPIO_InitStructure);
- while(1)
- {
- GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
- Delay(0x7FFFFF);
- GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
- Delay(0x7FFFFF);
- }
- }