stm32開發之使用Keil MDK以及標準外設庫建立STM32工程
通過上一節對標準外設庫的介紹,想必各位讀者對標準外設庫已經有了基本的認識,然而由於標準外設庫中檔案眾多,很多初學者在開始很長一段時間內甚至都無法完全自己建立一個工程,很多人只是依賴標準外設庫或給定的工程模板。本節就介紹怎樣利用Keil MDK開發環境和標準外設庫來搭建自己的工程。
建立一個基於標準外設庫其實並不複雜,網路上也有很多關於怎樣在Keil MDK下建立工程的教程,方法也各異,本節所介紹的方法本著少改動、便於使用、方便更換器件等原則,給大家介紹怎樣在Keil中建立一個工程,並以一個最簡單的例子來說明怎樣下載和除錯程式。
1.1.1 開發工具與開發環境
1. 軟體版本
本節所使用Keil MDK 為目前的最新版V4.21,具體版本資訊如圖 5‑6所示。其他版本差別不大,讀者可以根據自己使用的版本進行操作或者從Keil的官網下載新版本。使用的標準外設庫為目前最新的V3.5版本。使用的開發除錯工具為JLINK-V8,使用的驅動版本為V4.08l。
圖5‑6 MDK詳細版本資訊
2. 建立工程目錄
首先先建立一個用於存放工程的資料夾,此處命名為STM32,在資料夾下分別建立Src、Lis、Obj,Doc四個資料夾,分別用於存放原始碼、編譯過程中產生的臨時檔案和輸出檔案及文件,而src底下建立user用於存放使用者程式。
接下來拷貝標準外設庫和相應的檔案到工程目錄中,首先拷貝STM32F10x_StdPeriph_Lib_V3.5.0\Libraries資料夾下的兩個資料夾CMSIS和STM32F10x_StdPeriph_Driver到剛剛新建的STM32\Src目錄下,接下來拷貝使用者編寫程式的程式檔案,此檔案可以從標準外設庫自帶的例程中拷貝,這裡從STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA目錄下拷貝main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h四個檔案,這四個檔案是在程式設計的時候使用者往往需要根據實際需求進行修改的。因此拷貝至STM32\USER目錄下,system_stm32f10x.c檔案定義了系統時鐘等引數並完成微控制器的初始化,標準外設庫中已經有了,這裡可以不拷貝。這樣所需要的檔案都已經具備了,如圖 5‑7所示。
1.1.2 MDK的操作與設定
1. 新建工程
首先啟動Keil uVision4,點選選單欄Project-New uVision Project,選擇工程的儲存位置,儲存位置選擇在之前建立的MDK資料夾下,如圖 5‑8所示。
圖5‑8儲存路徑的選擇
在彈出的介面中選擇所使用的晶片訊號,筆者使用的晶片型號為STM32F103ZET6,所以選擇STM32F103ZE,如圖 5‑9所示。
圖5‑9選擇晶片型號
晶片選擇完成後軟體會彈出一條提示,提示是否要拷貝STM32大容量啟動程式碼並新增到工程,由於我們使用新版本標準外設庫中提供的啟動程式碼,因此此處選擇否。如圖 5‑10所示。
圖5‑10拷貝啟動程式碼選擇
接下來就出現了一個空的工程視窗,建立了一個新的工程。
2. 新增程式檔案
在左側Project一欄中對Target 1兩次點選之後可以重新命名,這裡命名為STM32,然後右擊,如所示,單擊Manage Comoonents。出現如所圖 5‑11示介面。
圖5‑11選擇 Manage Comoonents
在這個介面裡可以更為方便的新增工程的相關檔案。也可以在對應的Group上右鍵Add Group和Add Files to Group只是這種方式更方便集中的新增和管理。按照圖 5‑12所示,建立四個Group,點選Groups一欄右上角圖示,依次新建User、CMSIS、LIB三個組,點選對應的組在點選右下方Add Files新增相應的檔案到對應的組中。User組中新增User資料夾下的檔案,CMSIS組中新增STM32 PJ\STM32\LIB\CMSIS\CM3\CoreSupport資料夾下core_cm3.c檔案和STM32\LIB\CMSIS\CM3\DeviceSupport\ST\STM32F10x資料夾下system_stm32f10x.c檔案以及\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下的啟動檔案,根據是高密還是中等還是低密度晶片選擇。在LIB組下新增STM32\LIB\STM32F10x_StdPeriph_Driver\src下的所有檔案。至此,已經將對應的檔案全部加入工程中。
圖5‑12編輯組並新增對應檔案
檔案新增完成後的工程管理視窗如圖 5‑13所示。其中CMSIS和LIB組中的檔案圖示上由個鑰匙圖案,表示該檔案當前為只讀屬性,工程編譯完成後前面會出現一個加號,點選展開可以顯示當前檔案所呼叫的檔案。
圖5‑13工程管理檔案列表
3. 引數設定
接下來需要對工程進行一些引數設定,在中STM32上右擊,選擇第一項Options for Target ‘STM32’,如圖 5‑14所示。
圖5‑14選擇進行引數設定
彈出視窗如圖 5‑15所示。在這個視窗中共有10個選項卡,第一個選項卡Device用於選擇使用的器件,由於在新建工程的時候已經選擇這裡可以不用在選擇,當前的工程如果在後期要更換使用的晶片時可以在這個選項卡中更換晶片,同時還要注意更換對應的啟動檔案。在Target選項卡中,一般只需要填上使用的晶振頻率即可,其他都可以保持預設。
圖5‑15 Target選項設定
在如圖 5‑16所示Output選項卡中主要注意兩項,一是選擇輸出資料夾,選擇之前工程目錄中MDK資料夾下的Obj資料夾,在下面還有一個Create HEX File選項,用於選擇是否生成hex檔案,如果編譯好的程式要寫片,或者要提供給別人下載到晶片中而不希望別人知道原始碼時可以提供HEX檔案。
圖5‑16 Output選項設定
在Listing選項卡下同樣可以選擇Listing對應的資料夾,這裡選擇STM32\MDK\List資料夾,下方的複選框可以選擇需要生成的除錯資訊,這裡保持預設即可,如圖 5‑17所示。
圖5‑17 Listing 選項設定
C/C++選項卡中的設定比較重要,如圖 5‑18所示,選項卡中主要有兩個地方需要注意,首先是整個工程的巨集定義,在前面標準外設庫部分已經有過介紹,標準外設庫中很多功能都是通過巨集定義來實現的,由於標準外設庫針對STM32一系列晶片,因此需要通過巨集定義來進行鍼對性的選擇。這種選擇有兩種方式,第一種是直接改動巨集定義部分的庫檔案,缺點是需要更改一些功能時不是很方便,而且筆者建議在儘量不更改庫檔案的方式下實現功能的配置和使用,另一種方式就是在工程的設定中新增巨集定義,這兒添加了兩個巨集定義,USE_STDPERIPH_DRIVER表示使用標準外設庫進行程式開發, STM32F10X_HD表示使用的是STM32F10X系列大容量器件,本例中中使用的是STM32F103ZET6故填寫此項。
需要說明的是在程式開發過程中不光庫檔案可以通過巨集定義的方式進行程式功能配置,使用者程式也可以仿照庫檔案的這種形式,通過相關的巨集定義進行一些引數配置。STM32的標準外設庫在程式組織性、層次性、規範性等方面都值得我們去學習的。在“Target”的選項卡中進行的巨集定義是這對當前“Target”有效的,在每一個“Group”同樣可以設定作用於Group的巨集定義。
Language/Code Generation 一欄中主要是針對程式語言所所的一些優化和配置,預設情況下保持預設即可。
圖5‑18 C/C++選項設定
接下來一個重要的設定就是設定工程所包含的標頭檔案目錄,如圖 5‑19所示,點選Include Paths一欄右側圖示,彈出如所示的對話方塊。點選對話方塊右上角圖示,新增工程所包括的標頭檔案路徑,新增標頭檔案路徑的時候要把當前工程目錄中包含標頭檔案的路徑都新增進去,如所示,添加了以下幾個路徑:
..\USER
..\LIB\STM32F10x_StdPeriph_Driver\inc
..\LIB\CMSIS\CM3\CoreSupport
..\LIB\CMSIS\CM3\DeviceSupport\ST\STM32F10x
圖5‑19新增標頭檔案包含路徑
如果有使用者自己編寫的標頭檔案也要相應的加上引用路徑。仔細觀察可以發現在標註外設庫中標頭檔案的引用為:#include "stm32f10x.h",在C語言的學習中我們知道雙引號表示編譯器從使用者目錄開始搜尋,如果未找到才回去系統目錄去查詢,MDK的安裝目錄中同樣存在對應的庫檔案,路徑為Keil\ARM\INC\ST\STM32F10x,但是由於不同的版本所內含的庫檔案不同,如目前最新的V4.21版本中則內建了V3.4版本的庫檔案,而之前的版本中很多內建了V2.0版本的庫檔案,因此為了保持工程所使用的庫檔案和引用的標頭檔案的一致性,同時也方便工程檔案拷貝到其他電腦上執行,建議大家都按照本書介紹的方式都從自己的目錄中引用標頭檔案。
4. 程式除錯與下載設定
標頭檔案引用路徑新增完成後,就可以進行相關的編譯工作了,在進行這一步工作之前,我們還要完成有關程式除錯和下載的相關設定,有關除錯的設定在Debug選項卡中,之前的Asm和Linker選項卡保持預設。Debug選項卡如圖 5‑20所示。在此選項卡中主要完成程式除錯的相關設定,選項卡主要分為兩個部分,左側是使用模擬器進行模擬與除錯的方式,點選後軟體會進入模擬器除錯。右側是使用模擬器連線硬體開發平臺進行除錯,首先從右側選擇所使用的模擬器,這裡使用的是J-Link模擬器,故在下拉框中選擇Cortex-M/R J-LINK/J-Trace,在兩側的下方可以通過勾選對應的複選框來選擇是否需要在除錯開始時下載程式和執行到主程式,其他部分的設定保持預設即可。
圖5‑20除錯工具設定
點選右側圖示進入J-Link設定介面,如果此時模擬器和硬體開發平臺已經正確連線就會出現如圖 5‑21所示的介面,同時系統系統工作列中會自動彈出J-Link的控制軟體。從介面中可以讀出當前的J-Link SN號以及相應的版本資訊,如果沒有出現相關資訊請檢查相關驅動程式是否正確安裝,併到系統的裝置管理器中通用序列匯流排控制裝置一項檢查系統有沒有識別出J-Link,右側則可以讀取所連線的裝置資訊,如果沒有出現類似的資訊請檢查硬體連線。在此選項卡中可以進行J-Link的埠、速度等設定,這裡只需要保持預設就可以了。
圖5‑21 J-Link 連線
本章之前已經做過介紹,STM32F10X核心集成了序列/JTAG除錯介面SWJ-DP(Serial Wire and JTAG)。這是標準的ARM CoreSight除錯介面,包括JTAG-DP介面(使用5個引腳)和SW-DP(使用兩個引腳)。引腳分配如表 5‑9所示。兩種方式都可以進行程式的除錯和下載,但是SW方式更節省埠,只需要兩根線就可以,多餘的I/O可以釋放用作普通用途,SW方式和JTAG方式在普通程式除錯下載與除錯過程中並無明顯差別,如果想使用SW的方式除錯程式只需要在Port的下拉列表中選擇SW即可,如圖 5‑22所示。選擇完成後如果硬體連線正確同樣能夠讀取晶片的資訊。
表 5‑9 SWJ除錯埠引腳
SWJ-DP埠 引腳名稱 | JTAG 除錯介面 | SW 除錯介面 | 引腳分配 | ||
型別 | 描述 | 型別 | 除錯功能 | ||
JTMS/SWDIO | 輸入 | JTAG模式選擇 | 輸入/輸出 | 序列資料輸入/輸出 | PA13 |
JTCK/SWCLK | 輸入 | JTAG時鐘 | 輸入 | 序列時鐘 | PA14 |
JTDI | 輸入 | JTAG資料輸入 | —— | —— | PA15 |
JTDO/TRACESWO | 輸出 | JTAG資料輸出 | —— | 跟蹤時為TRACESWO訊號 | PB3 |
JNTRST | 輸入 | JTAG模組復位 | —— | —— | PB4 |
圖5‑22使用SW方式
設定好了Debug選項卡中有關選項後還需要設定Flash Download選項卡,如圖 5‑23所示。本選項卡主要設定燒寫Flash時的相關引數,這裡主要設定兩個部分,一個是設定程式下載的一些配置,這兒選擇Erase Sectors表示下載程式的時候擦除對應分割槽,勾選後面三項,分別表示下載程式,下載後校驗,程式下載後復位並執行。家下來需要選擇所使用的Flash,點選Add,新增所使用的晶片型別,筆者使用的是STM32F103ZET6,Flash大小是512k,因此選擇STM32F10X High-density Flash。至此完成使用J-Link完成程式除錯的配置。
圖5‑23 Flash燒寫引數設定
最後選擇程式下載按鈕所對應的工具配置,配置同Debug介面如圖 5‑24所示,同樣選擇Cortex-M/R J-LINK/J-Trace這樣就可以在後面的使用中一鍵將程式下載到Flash中。至此已經全部完成了程式除錯和下載的必要設定。
圖5‑19設定程式下載選單對應的工具