嵌入式 入門篇 - 第5章 STM32新建工程及配置
5.1 新建文件
5.1.1 新建文件夾
在 STM32-Template 文件夾下,我們新建四個文件夾,分別為DIF、Doc、Listing、Output、User。其中DIF中包含兩個文件夾CMSIS和Fwilb, CMSIS 用來存放庫為我們自帶的啟動文件和一些 M3系列的通用文件。CMSIS文件裏存放的文件適合任何M3內核的單片機,CMSIS 的 縮寫為:Cortex Microcontroller Software Interface Standard,是 ARM Cortex 微控制器 軟件接口標準,是 ARM 公司為芯片廠商提供的一套通用的且獨立於芯片廠商 的處理器軟件接口;FWlib 用來存放 STM32 庫裏面的 inc 和 src 這兩個文件,這兩個文件包 含了芯片上的所有驅動。Listing 用來存 放一些編譯過程中產生的文件。Output 用來保存軟件編譯後輸出的文件。USER 用來存放工程文件和用戶代碼,包括主函數main.c。另外,再把文件名為keilkilll的文件放到STM32-Template 文件夾用來清除不必要的文件。新建文件夾如下圖所示:
5.1.2 添加文件
在3.5.0目錄下
?3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 的 inc 跟 src 這兩個文件夾拷貝到 STM32-Template\DIF\FWlib 文件夾 中。
?3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 的全部文件拷貝到 STM32-Template\CMSIS\startup(需先在 CMSIS 新建好 startup 文件夾)文件夾下。 這些是用匯編寫的啟動文件。野火 M3 開發板用的 CPU 是 STM32F103VE,V表示100腳,E = 512K字節的閃存存儲器;其中 512KFlash,屬於大容量的,所以等下我們把startup_stm32f10x_hd.s添加到我們的工程中。根據 ST 的官方資料:Flash 在 16 ~32 Kbytes 為小容量,64 ~128 Kbytes為 中容量,256 ~512 Kbytes為大容量,不同大小的 Flash 對應的啟動文件不一 樣,這點要註意。
STM32 各類產品對應的啟動文件後綴名含義。
?3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 的 core_cm3.c 和 core_cm3.h 也拷貝到 STM32-Template\CMSIS 文件夾 下。
?3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h拷貝到STM32-Template\CMSIS 文件夾下。
?3.5.0\3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的 main.c、stm32f10x_conf.h、 stm32f10x_it.h、 stm32f10x_it.c 、system_stm32f10x.c 拷貝到 STM32-Template\USER 目錄下,再在STM32-Template\USER目錄下新建Libraries和Project ,其中Libraries用來存放庫函數,Project用來存放工程文件。
5.2新建的MDK 工程
5.2.1新建工程
1、點擊桌面 UVision4圖標,啟動軟件,在工具欄 Project->New μVision Project…新建我們的工程文件,我們將新建的工程文件保存在STM32-Template\USER\Project\RVMDK(uv4)文件夾下(先在Project文件夾下建立RVMDK(uv4)文件),文件名取為STM32-MINI(這款32是MINI板,所以取名STM32-MINI),名字可以隨便取,點擊保存。
2、窗口是讓我們選擇公司跟芯片的型號,我們用的芯片是 ST 公司的STM32F103VE,有64K SRAM,512K Flash,屬於高集成度的芯片。按如下選擇即可。
3、窗口問我們是否需要拷貝 STM32 的啟動代碼到工程文件中,這份啟 動代碼在 M3 系列中都是適用的,一般情況下我們都點擊是,但我們這裏用 的是 ST 的庫,庫文件裏面也自帶了這一份啟動代碼,所以為了保持庫的完 整性,我們就不需要開發環境為我們自帶的啟動代碼了,稍後我們自己手動添加,這裏我們點擊否。
4、將 Target 改為 STM32-MINI(不改也行)在 STM32-DEMO 上右鍵選中 Add Group…選項,新建四個組,分別命名為STARTUP、 FWlib、 CMSIS 、USER。STARTUP 從名字就可以看得出我們是用它來放我們的啟動代碼的,FWlib 用來 存放庫文件, CMSIS 用來存放 M3 系列單片機通用的文件,USER 用來存放用戶自定義的應用程序。然後添加相應文件,修改主函數main後如圖所示:
5.2.2配置 MDK 的配置選項
<1>點擊工具欄中的魔術棒按鈕
<2>在彈出來的窗口中選中Output點擊 Select Folder for Objects… 設置編譯後輸出文件保存的位置(放在STM32-Template\Output文件夾下)。同時把 Create HEX File 和 Browse information 這兩個選項框也選上。
<3>同樣在 Listing 這個選項卡中,我們也點擊 Select Folder listings…定位到模板中 的 Listing 文件夾。
<4> 在C/C++選項卡,在 Define 裏面輸入添加 USE_STDPERIPH_DRIVER,STM32F10X_HD。添加 USE_STDPERIPH_DRIVER 是為了屏蔽編譯器的默認搜索路徑,轉而使用我們添加到工程中的 ST 的庫,添加 STM32F10X_HD 是因為我們用的芯片是大容量的,添加了STM32F10X_HD 這個宏之後,庫文件裏面為大容量定義的寄存器我們就可以用了。芯片是小或中容量的時候宏要換成STM32F10X_LD 或者 STM32F10X_MD。其實不管是什麽容量的,我們只要添加上 STM32F10X_HD 這個宏即可,當你用小或者中容量的芯片時,那些為大容量定義的寄存器我不去訪問就是了,反正也訪問不了,關於這兩個宏的詳細解釋參看後文的小貼士。在 Include Paths 欄點擊,在這裏添加庫文件的搜索路徑,這樣就可以屏蔽掉默認的搜索路徑。
5.2.3硬件調試配置
接著以上操作,這個工程默認的是軟件仿真,如果開發板要用 J-LINK (ST-LINK同理)調試的話,還需要在 開發環境中做如下修改。實際上,我們開發程序的時候 80%都是在硬件上調試的。在 Debug 選項裏
單擊OK,大功告成!
小貼士:
關於STM32 MDK中USE_STDPERIPH_DRIVER, STM32F10X_HD問題的解釋
初學STM32,在MDK 環境中使用STM32固件庫建立工程時,初學者可能會遇到編譯不通過的問題。出現如下警告或錯誤提示:
warning: #223-D: function “assert_param” declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
這時候我們需要在“Target Options”中的“C/C++”選項卡中如圖5-18所示紅框中添加USE_STDPERIPH_DRIVER、STM32F10X_HD。這樣才能使編順利通過。
知其然了,我們還得知其所以然。下面就筆者給大家一一道來。我們知道,程序的執行是從“main.c”文件開始的,其中必須包含有頭文件“stm32f10x.h”。我們打開“stm32f10x.h”,按下“Ctrl+F”鍵,查找USE_STDPERIPH_DRIVER,在“Find What”欄中輸入“USE_STDPERIPH_DRIVER”。值得註意的是在查找之前工程必須是編譯過了的。如圖5-19所示。點擊“Find Next”,出現“USE_STDPERIPH_DRIVER”對應的代碼行,我們能在第8296-8298行找到如圖5-20所示代碼段。
這段代碼的意思是,只有用預編譯指令預定義了“USE_STDPERIPH_DRIVER”,才會將”stm32f10x_conf.h”包含進“stm32f10x.h”中,從而被”main.c”用到。這就解釋了,為什麽我們沒有在“main.c”中包含”stm32f10x_conf.h”,而在編譯之後卻被包含進了”main.c”中,出現如圖-5所示的情況。”stm32f10x_conf.h”文件相當於一個開關文件,如果要用到STM32固件庫驅動標準外設,則外設驅動頭文件是必不可少的,如“stm32f10x_gpio.h”。在”stm32f10x_conf.h”中我們通過代碼#include “stm32f10x_gpio.h”來實現這個操作。
說到這兒估計大家已經對“USE_STDPERIPH_DRIVER”的來龍去脈有個清晰的認識了吧?其實單從字面意思理解就是“使用標準外設驅動”,在C/C++預定義中加“USE_STDPERIPH_DRIVER”就是允許“使用標準外設驅動”了。至於加入的“STM32F10X_HD“同樣能在文件”stm32f10x.h“通過如上所述的方法通過功能查找來進行解釋,其實它也是對於對應硬件的某些定義起開關作用罷了。其實寫在這裏,他的名字叫define。 也就跟你在工程裏面寫define XXX是一樣的。。只不過寫在這裏的話,是全局的而已。
參考資料:http://www.makeru.com.cn/
嵌入式 入門篇 - 第5章 STM32新建工程及配置