天天看點

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

作者:電子友人章

使用标準庫建立工程模闆

需要準備的工具

表1:需要的工具軟體

序号 軟體工具 描述
J-Link仿真器或ST-Link仿真器 仿真器驅動已安裝
MDK5軟體 已完成該軟體的安裝
STM32F10x标準庫檔案 版本V3.5
  • 搭建開發環境所需工具在資料包中的位置:
  • MDK5驅動安裝軟體:位于“...\第2部分:開發軟體工具\ 1 - 搭建開發環境安裝源檔案\ 1--MDK5.23安裝檔案” 目錄下
  • STM32F10x标準庫檔案:位于“...\第2部分:開發軟體工具\ 1 - 搭建開發環境安裝源檔案\ 10--STM32F10x标準庫” 目錄下。
  • 注意事項:
  • 本文檔給出的建立工程的方法是基于STM32F10x标準庫的,不同于基于HAL庫建立工程的方法。
  • 基于STM32F10x标準庫建立工程的方法不是唯一的,本文檔僅是艾克姆科技推薦使用者可以借鑒的一種建立工程的方法。

建立工程模闆

規劃工程檔案存放目錄

建立工程之前,我們需要先考慮一下工程檔案的組織,也就是工程的存放目錄。清晰的工程目錄既友善我們管理工程中的各個檔案,也友善日後的維護和移植。我們可以根據自己的習慣和喜好來建立自己的工程存放目錄,但是也不要太随意,檔案目錄應該一目了然,目錄中各個檔案夾的名字要能準确地訓示裡面的内容。

下面是我們建立工程時使用的工程目錄,供大家參考。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖1:工程檔案存放目錄

建立工程

因為一般的項目都會用到LED訓示燈,是以下面我們通過建立一個點燈的工程來作為我們的工程模闆,以此來說明工程建立和配置的步驟。工程名取為:led_blinky,工程存放到D盤。

  1. 按照上文中描述的工程檔案存放目錄建立用于存放工程各個部件的檔案夾。

先在D盤建立一個名字為led_blinky的檔案夾,然後在這個檔案夾下面建立如下圖所示的5個檔案夾。

  1. 将STM32F10x标準庫Libraries檔案夾裡面的檔案拷貝到Lib檔案夾,并将STM32F10x_StdPeriph_Driver 改名為F10x_FWLIB(原檔案名較長,改名是為了友善)。
  2. 将庫配置頭檔案stm32f10x_conf.h拷貝到User檔案夾。
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖2:建好的工程檔案存放目錄

  1. 啟動MDK,點選【Project】,在彈出的下拉菜單中選擇【New uVision Project】。
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖3:建立工程視窗

  1. 設定工程名和工程儲存路徑,設定完成後點選【儲存】。
  • 注意事項:工程路徑和工程名設定注意事項:工程路徑和工程名最好不要包含漢字字元(雖然有些計算機使用漢字字元沒有問題,但是還是建議不要使用漢字字元,因為MDK對漢字字元的支援比較差),同時路徑不要過深,否則打開工程或仿真時可能會出現找不到檔案或者MDK崩潰的問題。
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖4:設定工程路徑和工程名

儲存後,工程名稱是:led_blinky,工程儲存路徑是:“…\project\led_blinky”。

  1. 儲存工程後,會彈出器件選擇視窗,選擇好器件後點選【确定】。

開發闆上使用的MCU型号是:STM32F103ZET6,是以,在下圖的器件清單中需要選擇STM32F103ZE這個型号。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖5:選擇器件型号

  1. 配置RTE(Run-Time Environment),選擇完成後點選【OK】。

勾選兩個必選項:CMSIS中的CORE和DEVICE中的StartUp。注意他們的版本号,STM32标準庫V3.5對應的Startup的版本号是1.0.0,是以這裡Startup的版本要選擇1.0.0。至于CORE版本,我們使用的是5.0.1版本(MDK5.23安裝時會同時安裝CMSIS5.0.1)。另外需要注意的是建立工程時,配置RTE的界面隻會顯示最新的CORE和DEVICE版本,如果顯示的版本和我們需求的版本不一樣,可以在工程配置中修改,後面在工程配置章節會說明修改方法。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖6:配置RTE

  1. 管理MDK工程目錄。

工程建立後,MDK工程視窗中顯示的是預設的目錄,為了讓MDK工程目錄清晰,友善添加檔案和管理檔案,我們需要對目錄進行整理。下圖中是建立工程時的預設目錄和整理後的目錄。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖7:整理目錄

我們可以看到,整理後的工程目錄很直覺:工程名是“led_blinky”,工程的目标裝置是IK-ZET6開發闆。工程包含4個組,用來歸類加入到工程的檔案,如果要加入STM32标準庫檔案,可以加入到“F10x_FWLIB”組,如果是我們自己編寫的檔案,可以加入到“User”組,如果使用了第三方的庫,可以将檔案加入到“EXTERNAL”組,如果是記錄或釋出相關的文檔,可以加入到“DOC”組。

  • 注意事項1:MDK中的工程目錄不需要完全和工程檔案存放目錄一樣。
  • 注意事項2:一般情況下,工程需要實作的功能稍複雜一些,還會再根據功能添加不同的組,如添加一個“BSP”組,将訓示燈LED和按鍵相關的檔案加入到該組,如下圖所示。
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖8:帶BSP組的目錄

整理MDK工程目錄時會用到下面幾個操作:

  • 修改組名稱:先選中需要修改名稱的組,然後單擊即可修改名稱。注意,不是輕按兩下。
  • 添加組:選中Target(即整理後的目錄中的IK-ZET6),右鍵選中“Add Group”,即可添加一個組。
  1. 管理軟體包。

 在這裡我們可以修改CMSIS和器件包的版本,以及設定CMSIS和器件包是否自動使用已安裝的最新的版本。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖9:管理軟體包

  • 注意事項:CMSIS我們使用的版本是5.0.1,器件包我們安裝的是标準庫3.5的器件包“Keil.STM32F1xx_DFP.2.2.0.pack”,是以這裡選擇2.2.0版本。
  1. 建立main.c檔案并添加到工程。

 通常,工程都會包含一個“main.c”檔案,用于存放C程式的入口函數(main()函數),是以,我們需要先建立一個“main.c”檔案并添加到工程。

  1. 執行“File→New”建立檔案,如下圖:
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖10:建立檔案

  1. 點選儲存按鈕“Save”将檔案命名為“main.c”并儲存到User檔案夾。
  2. 将“main.c”檔案添加到工程。

MDK建立的檔案不會自動加入到工程,需要手動添加。将檔案加入的到工程可通過下面3種來實作。

  • 方法1:輕按兩下組名Application打開添加檔案視窗,導航到“main.c”檔案的存放路徑,添加即可。
  • 方法2:選中Application組,右鍵選擇“Add Existing Files To…”打開添加檔案視窗,導航到“main.c”檔案的存放路徑,添加檔案。
  • 方法3:通過工程項目管理添加。如下圖所示:
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖11:通過工程項目管理添加檔案

  1. 向工程中添加需要的庫檔案

向工程中添加庫檔案的步驟和添加“main.c”檔案的步驟一樣。

本例中因為隻是驅動訓示燈,是以隻需要添加GPIO和RCC(複位和時鐘控制)這兩個庫檔案即可。庫檔案名稱是:stm32f10x_gpio.c和stm32f10x_rcc.c。

配置工程

點選魔術棒打開工程配置視窗。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖12:工程配置視窗

配置“Target”頁籤

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖13:配置Target頁籤

主要配置下面幾個項目:

  1. MicroLib庫:勾選使用MicroLib庫。Microlib是預設 C 庫的備選庫。RealView MDK為進一步改進基于ARM處理器的應用代碼密度,采用了新型Microlib C庫(用于C的ISO标準運作時庫的一個子集),并将其代碼鏡像降低最小以滿足微控制器應用的需求。Microlib C庫進行了高度優化以使代碼變得很小,可将運作時庫代碼大大降低。
  2. 記憶體配置

建立工程的時候,MDK會自動根據選擇的晶片配置記憶體,但是這裡我們也要明白記憶體這樣配置的依據是什麼。

查閱晶片的資料手冊可知STM32F103ZET6片内FLASH起始位址是0x80000000,大小是512KB(對應的16進制是:0x80000),片内RAM起始位址是0x20000000,大小是64KB(對應的16進制是:0x10000),是以記憶體應配置如下:

 片内ROM設定:

起始位址(16進制) 大小(16進制):512K位元組
0x80000000 0x80000

片内RAM設定:

起始位址(16進制) 大小(16進制):64K位元組
0x20000000 0x10000
  • 注意事項:晶振頻率Xtal是用于軟體仿真的,不需要設定。

配置“Output”頁籤

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖14:配置Output頁籤

主要配置下面幾個項目:

  1. 指定目标檔案輸出路徑:MDK建立工程的時候會自動在工程儲存目錄下建立Objects檔案夾,用來存放編譯後生成的目标檔案。這裡使用預設的路徑即可,一般情況下,不建議自己設定,但是我們需要知道在這裡可以設定目标檔案輸出路徑。
  2. 設定生成HEX檔案:需要勾選“Create HEX File”,使能生成HEX檔案,并設定一下輸出的HEX檔案的名稱,設定之後,工程編譯成功即可生成HEX檔案,生成的HEX檔案位于指定的“目标檔案輸出路徑”的目錄下。

配置“C/C++”頁籤

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖15:配置“C/C++”頁籤

主要配置下面幾個項目:

  1. 全局宏定義:如果有多個宏定義,用空格隔開。注意,這裡加入的宏定義,對于整個工程有效。
  • STM32F10X_HD:STM32F103ZET6的Flash是512K位元組,屬于高密度系列,是以要加入這個宏。
  • USE_STDPERIPH_DRIVER:工程中會使用标準庫的驅動,是以要加入這個宏啟用外設驅動。
  1. 設定優化級别“Optimization”:數值越大,優化級别越高。注意如果需要仿真,将優化級别設定為最低(Level 0)。
  2. 勾選“One ELF Secion per Function”。

One ELF Secion per Function的機制是将每一個函數作為一個優化的單元,而并非整個檔案作為參與優化的單元。該機制具有的這種優化功能特别重要,尤其是在對于生成的二進制檔案大小有嚴格要求的場合。

One ELF Section per Function對于一個大工程的優化效果尤其突出,對于小工程優化效果不是很明顯。想象一下這樣的一個應用場合:在STM32F103ZET6程式開發過程中,我們會使用标準庫,我們加入标準庫中的一個檔案到工程并不表示我們會使用這個檔案中所有的函數,這樣,最後生成的二進制檔案中就有可能包含衆多的備援函數,造成了存儲空間的浪費,通過使用One ELF Section per Function,即可在最後生成的二進制檔案中将備援函數排除掉,進而節省存儲空間。

  1. 啟用“C99 Mode”:啟用C99模式後,我們就可以使用C99的一些新特性,如程式語句之後定義變量(C99之前不允許這麼做),結構體指定初始化等。
  2. 設定頭檔案包含路徑:

當我們引用了一個頭檔案時,就需要告訴編譯器這個頭檔案的路徑,否則,編譯器無法定位頭檔案,在編譯的過程中會産生錯誤。

頭檔案路徑有幾種設定方法,最常用的方式就是在這裡加入頭檔案路徑(其他幾種方式不友善,也不靈活,極少被使用,故在此不提)。

添加頭檔案路徑的原則是:使用了哪個頭檔案,就要将該頭檔案所在路徑添加進來,如本例中使用了GPIO的頭檔案,是以要在這裡加入路徑“..\Lib\F10x_FWLIB\inc”。

路徑的設定方法:

路徑又分為相對路徑和絕對路徑,絕對路徑是從盤符開始的完整的路徑,相對路徑是相對于工程檔案“led_blinky.uvprojx”的路徑。使用絕對路徑時一旦将工程拷貝到其它目錄,編譯就會出錯,因為路徑變了。使用相對路徑則不會出現這樣的問題,是以我們通常使用的都是相對路徑。相對路徑中必須要掌握的幾種路徑表示方法:

  • "..\":表示工程檔案所在目錄向上一級的目錄。"..\"可以連用,“..\ ..\” 表示工程檔案所在目錄向上兩級的目錄,以此類推。
  • ".\":表示的是目前路徑。

配置“Debug”頁籤

IK-ZET6開發闆支援多種仿真器,如J-LINK、ST-LINK、CMSIS-DAP等,本節以J-LINK為例說明仿真器的配置。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖16:配置“Debug”頁籤

主要配置下面幾個項目:

  1. Run to main():勾選後,仿真時程式會自動運作到main()函數。
  2. 仿真器設定:選擇“J-LINK/J-TRACE Cortex”,點選“Setting”按鈕進入設定界面。(注意:設定時需要将J-LINK仿真器連接配接到計算機)。

進入仿真器設定界面後,先切換到“Debug”頁籤,配置調試接口。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖17:配置下載下傳選項

切換到“Flash Download”頁籤,加載程式設計算法。

【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖18:配置下載下傳選項

“Flash Download”頁籤主要設定項目如下:

  1. Reset and Run:下載下傳完成後自動複位并運作程式,這一項建議勾選。有時候我們發現程式下載下傳後需要斷電重新開機後才能運作,原因就是漏勾選了這一項。
  2. RAM for Algorithm:指定用于燒寫程式的RAM區域,一般使用預設設定即可。
  3. program algorithm:Flash程式設計算法,一般建立工程選擇晶片後會自動添加,如果沒有,點選“ADD”按鈕添加即可。

管理MDK軟體包

當MDK中安裝了多個軟體包的時候,我們可以移除不需要的軟體包,移除軟體包按照下面的步驟進行:

  1. 點選“Pack Installer”按鈕,如下圖所示:
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖19:打開“Pack Installer”

  1. Pack Installer的Devices頁籤中,選中“STM32F103”,切換到packs頁籤,點選需要删除的pack後面的“Remove”按鈕即可移除。移除後“Remove”按鈕的名稱變為“Unpack”,若需要再次安裝該pack,點選“Unpack”即可。
【STM32F103ZET6開發闆】第1-5講:使用标準庫建立工程模闆

圖20:移除軟體包

繼續閱讀