【正点原子STM32连载】第六章 新建寄存器版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)實驗平臺:正點原子MiniPro H750開發(fā)板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=677017430560
3)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/thread-336836-1-1.html
4)對正點原子STM32感興趣的同學可以加群討論:879133275
第六章 新建寄存器版本MDK工程
通過前面幾章的學習,我們對STM32有了個比較清晰的了解,本章我們將講解新建寄存器庫版本MDK工程的詳細步驟。我們把本章新建好的工程放在光盤里,路徑:4,程序源碼\2,標準例程-HAL庫版本\實驗0 基礎入門實驗\實驗0-2,新建工程實驗-寄存器版本,大家在學習新建工程過程中間遇到一些問題,可以直接打開這個工程,然后對比學習。
本章將分為如下兩個小節(jié):
6.1 新建寄存器版本MDK工程
6.2 下載驗證
6.1 新建寄存器版本MDK工程
本節(jié)我們將教大家如何新建一個STM32H750的MDK5工程。為了方便大家參考,我們將本節(jié)最終新建好的工程模板存放在A盤:4、程序源碼\2,標準例程-HAL庫版本\實驗0 基礎入門實驗\實驗0-2,新建工程實驗-寄存器版本,如遇新建工程問題,請打開該實驗對比。
整個新建過程比較復雜,我們將其拆分為5個步驟進行講解,請準備大概2個小時時間,耐心細致的做完!對你后續(xù)的學習非常有幫助!
在新建工程之前,首先我們要做如下準備:
1、 STM32Cube官方固件包:我們使用的固件包版本是STM32Cube_FW_H7_V1.6.0,固件包路徑:A盤8,STM32參考資料1,STM32CubeH7固件包。
2、開發(fā)環(huán)境搭建:參考本書第三章相關內容。
6.1.1 新建工程文件夾
新建工程文件夾分為2個步驟:1,新建工程文件夾;2,拷貝工程相關文件。
首先我們在桌面新建一個工程根目錄文件夾,后續(xù)的工程文件都將在這個文件夾里建立,我們把這個文件夾重命名為:實驗0-2,新建工程實驗-寄存器版本。如圖6.1.1.1所示:
圖6.1.1.1 新建工程根目錄文件夾
為了讓工程的文件目錄結構更加清晰易懂,我們會在工程根目錄文件夾下建立以下幾個文件夾,每個文件夾名稱及其作用如表6.1.1.1所示:
表6.1.1.1 工程根目錄新建文件夾及其作用
新建完成以后,最后得到我們的工程根目錄文件夾如圖6.1.1.2所示。
圖6.1.1.2 工程根目錄文件夾
工程根目錄及其相關文件夾新建好以后,我們需要拷貝一些工程相關文件過來(主要是在Drivers文件夾里面),以便等下的新建工程需要。
2. 拷貝工程相關文件
接下來,我們按圖6.1.1.2的根目錄文件夾順序介紹每個文件夾及其需要拷貝的文件。
Drivers文件夾
該文件夾用于存放與硬件相關的驅動層文件,一般包括如表6.1.1.2所示的三個文件夾:
表6.1.1.2 Drivers包含文件夾
BSP文件夾,用于存放正點原子提供的板級支持包驅動代碼,如:LED、蜂鳴器、按鍵等。本章我們暫時用不到該文件夾,不過可以先建好備用。
CMSIS文件夾,用于存放CMSIS底層代碼(ARM和ST提供),如:啟動文件(.s文件)、stm32h7xx.h等各種頭文件。該文件夾我們可以直接從STM32CubeH7固件包(路徑:A盤8,STM32參考資料1,STM32CubeH7固件包)里面拷貝,不過由于固件包里面的CMISIS兼容了太多芯片,導致非常大(300多MB),因此我們根據(jù)實際情況,對其進行了大幅精簡,精簡后的CMSIS文件夾大小為2.3MB左右。精簡后的CMSIS文件夾大家可以在:A盤4,程序源碼1,標準例程-寄存器版本 文件夾里面的任何一個實驗的Drivers文件夾里面拷貝過來。
SYSTEM文件夾,用于存放正點原子提供的系統(tǒng)級核心驅動代碼,如:sys.c、delay.c和usart.c等,方便大家快速搭建自己的工程。該文件同樣可以從:A盤4,程序源碼1,標準例程-寄存器版本 文件夾里面的任何一個實驗的Drivers文件夾里面拷貝過來。
執(zhí)行完以上操作后,Drivers文件夾最終結構如圖6.1.1.3所示:
圖6.1.1.3 工程根目錄文件夾
Middlewares文件夾
該文件夾用于存放正點原子和其他第三方提供的中間層代碼(組件/Lib等),如:USMART、MALLOC、TEXT、FATFS、USB、LWIP、各種OS、各種GUI等等。本章我們暫時用不到該文件夾,不過可以先建好備用,后面的實驗將會陸續(xù)添加各種文件。
Output文件夾
該文件夾用于存放編譯器編譯工程輸出的中間文件,比如:.hex、.bin、.o文件等等。這里不需要操作,后面只需要在MDK里面設置該文件夾為編譯過程中間文件的存放文件夾就行。
Projects文件夾
該文件夾用于存放編譯器(MDK、IAR等)工程文件,我們主要用MDK,為了方便區(qū)分,我們在該文件夾下新建:MDK-ARM文件夾,用于存放MDK的工程文件,如圖6.1.1.4所示:
圖6.1.1.4 在Projects文件夾下新建MDK-ARM文件夾
User文件夾
該文件夾用于存放用戶編寫的代碼,如:main.c等。目前還沒有任何代碼,所以暫時為空即可。
6.1.2 新建一個工程框架
首先,打開MDK軟件。然后點擊ProjectNew uVision Project如圖6.1.2.1所示:
圖6.1.2.1 新建MDK工程
然后彈出工程命名和保存的操作窗口,我們將工程文件保存路徑設置在上一節(jié)新建的工程文件夾內,具體路徑為:桌面實驗0-2,新建工程實驗-寄存器版本ProjectsMDK-ARM,工程名字我們取:atk_h750,最后點擊保存即可。具體操作窗口如圖6.1.2.2所示:
圖6.1.2.2 保存工程界面
之后,彈出器件選擇對話框,如圖6.1.2.3所示。因為正點原子MiniPRO STM32H750開發(fā)板所使用的STM32型號為STM32H750VBT6,所以我們選擇:STMicroelectronicsSTM32H7 SeriesSTM32H750STM32H750VBTx(如果使用的是其他系列的芯片,選擇相應的型號就可以了,特別注意:一定要安裝對應的器件pack才會顯示這些內容哦!!如果沒得選擇,請關閉MDK,然后安裝 A盤:6,軟件資料\1,軟件\MDK5\ Keil.STM32H7xx_DFP.2.5.0.pack這個安裝包后重試)。
點擊OK,MDK會彈出Manage Run-Time Environment對話框,如圖6.1.2.4所示:
圖3.2.1.4 Manage Run-Time Environment界面
這是MDK5新增的一個功能,在這個界面,我們可以添加自己需要的組件,從而方便構建開發(fā)環(huán)境,不過這里我們不做介紹。所以在圖6.1.2.4所示界面,我們直接點擊Cancel,即可,得到如圖6.1.2.5所示界面:
圖6.1.2.5 工程初步建立
此時,我們打開MDK-ARM文件夾,會看到MDK在該文件夾下自動創(chuàng)建了3個文件夾(DebugConfig、Listings和Objects),如圖6.1.2.6所示:
圖6.1.2.6 MDK新建工程時自動創(chuàng)建的文件夾
這三個文件夾的作用如表6.1.2.1所示:
表6.1.2.1 三個文件夾及其作用
編譯過程產(chǎn)生的鏈接列表、調試信息、預覽、lib等文件,統(tǒng)稱為中間文件。為了統(tǒng)一管理,方便使用,我們會把輸出在Listings和Objects文件夾的內容,統(tǒng)一改為輸出到Output文件夾(通過魔術棒設置),我們先把MDK自動生成的這兩個文件夾(Listings和Objects)刪除。
至此,我們還只是建了一個框架,還有好幾個步驟要做,比如添加文件、魔術棒設置、編寫main.c等。
6.1.3 添加文件
本節(jié)將分3個步驟:1,設置工程名和分組名;2,添加啟動文件;3,添加SYSTEM源碼。1. 設置工程名和分組名
在ProjectTarget上右鍵,選擇Manage Project Items…(方法一)或在菜單欄點擊品字形紅綠白圖標(方法二)進入工程管理界面,如圖6.1.3.1所示:
圖6.1.3.1 進入工程管理界面
在工程管理界面,我們可以執(zhí)行設置工程名字(Project Targets)、分組名字(Groups)以及添加每個分組的文件(Files)等操作。我們設置工程名字為:Template,并設置四個分組:Startup(存放啟動文件)、User(存放main.c等用戶代碼)、Drivers/SYSTEM(存放系統(tǒng)級驅動代碼)、Readme(存放工程說明文件),如圖6.1.3.2所示:
圖6.1.3.2 設置工程名和分組名
設置好之后,我們點擊OK,回到MDK主界面,可以看到我們設置的工程名和分組名如圖6.1.3.3所示:
圖6.1.3.3 設置成功
這里我們只是新建了一個簡單的工程,并沒有添加BSP、Middlewares等分組,后面隨著工程復雜程度的增加,我們需要一步步添加對應的分組。
注意:為了讓工程結構清晰,我們會盡量讓MDK的工程分組和我們前面新建的工程文件夾對應起來,由于MDK分組不支持多級目錄,因此我們將路徑也帶入分組命名里面,以便區(qū)分。如:User分組對應User文件夾里面的源碼,Drivers/SYSTEM分組,對應Drivers/SYSTEM文件夾里面的源碼,Drivers/BSP分組對應Drivers/BSP文件夾里面的源碼等。
2. 添加啟動文件
啟動文件(.s文件)包含STM32的啟動代碼,其主要作用包括:1、堆棧(SP)的初始化;2、初始化程序計數(shù)器(PC);3、設置向量表異常事件的入口地址;4、調用main函數(shù)等,是每個工程必不可少的一個文件,我們在本書第九章會有詳細介紹。
啟動文件由ST官方提供,存放在STM32CubeH7軟件包的:DriversCMSISDevice STSTM32H7xxSourceTemplatesarm文件夾下。因為我們開發(fā)板使用的是STM32H750VBT6,對應的啟動文件為:startup_stm32h750xx.s,為了節(jié)省空間,在精簡版CMSIS文件夾里面我們把其他啟動文件都刪了。而且,為了更好的匹配寄存器版本代碼,我們對startup_stm32h750xx.s做了2處修改:
1,我們用不到編譯器的內存管理函數(shù),為節(jié)省內存,將Heap_Size改成 0,源碼如下:
;未用到編譯器自帶的內存管理(malloc,free等),設置Heap_Szie為0
Heap_Size EQU 0x00000000
2,寄存器代碼不需要調用SystemInit函數(shù),因此修改Reset_Handler函數(shù),去掉SystemInit調用,并且還加入了開啟 STM32H750 硬件 FPU 的代碼,具體源碼如下:
這段代碼,我們主要加入了開啟 STM32H750 硬件 FPU 的代碼,以使能 STM32H750 的浮點運算單元,并關閉硬件自動壓棧。其中,0xE000ED88 就是協(xié)處理器控制寄存器(CPACR)的地址,該寄存器的第 20~23 位用來控制是否支持浮點運算,這里我們全設置為 1,以支持硬件浮點運算。關于 CPACR 寄存器的詳細描述,見《STM32H7 編程手冊.pdf》第 4.7.1 節(jié)。另外,寄存器版本,我們還屏蔽了 SystemInit 函數(shù)的調用,如果是HAL庫版本,可以取消這個函數(shù)的注釋,并在外部實現(xiàn) SystemInit 函數(shù)。
特別注意:我們在匯編代碼里面使能了 FPU,所以在 MDK 里面,我們也要設置使用 FPU,否則可能代碼會無法運行,設置方法如下:選擇 Options for Target ‘Target1’,打開 Target 選項卡,在 Code Generation 里面,選擇 Double Precision,如圖6.1.3.4 所示:
圖6.1.3.4 MDK開啟浮點運算
關于啟動文件的說明,我們就介紹這么多,接下來我們看如何添加啟動文件到工程里面。我們有兩種方法給MDK的分組添加文件:1,雙擊Project下的分組名添加。2,進入工程管理界面添加。
這了我們使用方法1添加(路徑:實驗0-2,新建工程實驗-寄存器版本\Drivers\CMSIS
Device\ST\STM32H7xx\Source\Templates\arm),如圖6.1.3.5所示:
圖6.1.3.5 雙擊分組添加啟動文件(startup_stm32h750xx.s)
上圖中,我們也可以點擊Add按鈕進行文件添加。添加完后,點擊Close,完成啟動文件
添加,得到工程分組如圖6.1.3.6所示:
圖6.1.3.6 啟動文件添加成功
3. 添加SYSTEM源碼
這里我們在工程管理界面(方法2)進行SYSTEM源碼添加。點擊:按鈕,進入工程管理界面,選中Drivers/SYSTEM分組,然后點擊:Add Files,進入文件添加對話框,依次添加delay.c、sys.c和usart.c到該分組下,如圖6.1.3.6所示:
圖6.1.3.6 添加SYSTEM源碼
注意:這些源碼都是在第6.1.1小節(jié)的第二步拷貝過來的,如果之前沒拷貝,是找不到這些源碼的。添加完成后,如圖6.1.3.7所示:
圖6.1.3.7 SYSTEM源碼添加完成
6.1.4 魔術棒設置
為避免編寫代碼和編譯報錯,我們需要通過魔術棒對MDK工程進行相關設置。在MDK主界面,點擊:(魔術棒圖標,即Options for Target按鈕),進入工程設置對話框,我們將進行如下幾個選項卡的設置。
在魔術棒Target選項卡里面,我們進行如圖6.1.4.1所示設置:
圖6.1.4.1 Target選項卡設置
上圖中,我們設置芯片所使用的外部晶振頻率為8Mhz,選擇ARM Compiler版本為:Use default compiler version 5(即AC5編譯器)。
這里我們說明一下AC5和AC6編譯的差異,如表6.1.4.2所示:
表6.1.4.1 AC5&AC6簡單對比
由于AC5對中文支持比較好,且兼容性相對好一點,為了避免不必要的麻煩,我們推薦大家使用AC5編譯器。為了讓大家自由選擇,我們正點原子的源碼,也是支持AC6編譯器的,不過在選項卡設置上稍有差異,具體差異如表6.1.4.2所示:
表6.1.4.2 AC5&AC6設置差異
2. 設置Output選項卡
在魔術棒Output選項卡里面,進行如圖6.1.4.2所示設置:
圖6.1.4.2 設置Output選項卡
注意,我們勾選:Browse Information,用于輸出瀏覽信息,這樣就可以使用go to definition查看函數(shù)/變量的定義,對我們后續(xù)調試代碼比較有幫助,如果不需要調試代碼,則可以去掉這個勾選,以提高編譯速度。
3. 設置Listing選項卡
在魔術棒Listing選項卡里面,進行如圖6.1.4.3所示設置:
圖6.1.4.3 設置Listing選項卡
經(jīng)過Output和Listing這兩步設置,原來存儲在Objects和Listings文件夾的內容(中間文件)就都改為輸出到Output文件夾了。
4. 設置C/C++選項卡
在魔術棒C/C++選項卡里面,進行如圖6.1.4.4所示設置:
圖6.1.4.4 設置C/C++選項卡
在②處設置了全局宏定義:STM32H750xx,用于定義所用STM32型號,在stm32h7xx.h里面會用到該宏定義。
在③處設置了優(yōu)化等級為-O0,可以得到最好的調試效果,當然為了提高優(yōu)化效果提升性能并降低代碼量,可以設置-O1~-O3,數(shù)字越大效果越明顯,不過也越容易出問題。注意:當使用AC6編譯器的時候,這里推薦默認使用-O1優(yōu)化。
在④處勾選C99模式,即使用C99 C語言標準。
在⑤處,我們可以進行頭文件包含路徑設置,點擊此按鈕,進行如圖6.1.4.5所示設置:
圖6.1.4.5 設置頭文件包含路徑
上圖中我們設置了4個頭文件包含路徑,其中3個在Drivers文件夾下,一個在User文件夾下。為避免頻繁設置頭文件包含路徑,正點原子最新源碼的include全部使用相對路徑,也就是我們只需要在頭文件包含路徑里面指定一個文件夾,那么該文件夾下的其他文件夾里面的源碼,如果全部是使用相對路徑,則無需再設置頭文件包含路徑了,直接在include里面就指明了頭文件所在。
關于相對路徑,這里大家記住3點:
1,默認路徑就是指MDK工程所在的路徑,即.uvprojx文件所在路徑(文件夾)
2,“./”表示當前目錄(相對當前路徑,也可以寫做“.\”)
3,“…/”表示當前目錄的上一層目錄(也可以寫做“…\”)
舉例來說,上圖中:…\Drivers\CMSIS\Device\ST\STM32H7xx\Include,前面兩個“…\”,表示Drivers文件夾在當前MDK工程所在文件夾(MDK-ARM)的上2級目錄下,具體解釋如圖6.1.4.6所示:
圖6.1.4.6 …\Drivers\CMSIS\Device\ST\STM3H7xx\Include的解釋
上圖表示根據(jù)頭文件包含路徑:…\Drivers\CMSIS\Device\ST\STM32H7xx\Include,編譯器可以找到⑥處所包含的這些頭文件,即代碼里面可以直接include這些頭文件使用。
再舉個例子,在完成如圖6.1.4.5所示的頭文件包含路徑設置以后,我們在代碼里面編寫:
#include “./SYSTEM/sys/sys.h”
即表示當前頭文件包含路徑所指示的4個文件夾里面,肯定有某一個文件夾包含了:SYSTEM/sys/sys.h的路徑,實際上就是在Drivers文件夾下面,兩者結合起來就相當于:
#include “…/…/Drivers/SYSTEM/sys/sys.h”
這就是相對路徑。它既可以減少頭文件包含路徑設置(即減少MDK配置步驟,免去頻繁設置頭文件包含路徑的麻煩),同時又可以很方便的知道頭文件具體在那個文件夾,因此我們推薦在編寫代碼的時候使用相對路徑。
關于相對路徑,我們就介紹這么多,大家搞不明白的可以在網(wǎng)上搜索相關資料學習,也可以在后面的學習,分析我們其他源碼,慢慢體會,總之不難,但是好用。
最后,我們如果使用AC6編譯器,則在圖6.1.4.4的Misc Controls處需要設置:-Wno-invalid-source-encoding,避免中文編碼報錯,如果使用AC5編譯器,則不需要該設置!!
5. 設置Debug選項卡
在魔術棒Debug選項卡里面,進行如圖6.1.4.7所示設置:
圖6.1.4.7 Debug選項卡設置
圖中,我們選擇使用:CMSIS-DAP仿真器,使用SW模式,并設置最大時鐘頻率為10Mhz,以得到最高下載速度。當我們將仿真器和開發(fā)板連接好,并給開發(fā)板供電以后,仿真器就會找到開發(fā)板芯片,并在SW Device窗口顯示芯片的IDCODE、Device Name等信息(圖中⑤處),當無法找到時,請檢查供電和仿真器連接狀況。
6. 設置Utilities選項卡
在魔術棒Debug選項卡里面,進行如圖6.1.4.8所示設置:
圖6.1.4.8 Utilities選項卡設置
圖中⑥處下載算法STM32H750,是MDK默認添加的,針對STM32H750系列產(chǎn)品。除此之外,我們還要添加STM32H750VB_W25Q64@ALIENTEK.FLM算法,點擊⑦處按鈕添加即可。添加好算法后,設置算法使用的 RAM 地址和大小,這里設置的起始地址為:0X2000 0000(DTCM),大小為:0X3000。必須按這個大小設置,否則下載會出錯(無法加載算法)。
7. 添加分散加載文件
由于STM32H750VBT6芯片內部的FLASH的空間比較少(只有128KB)。對于大的工程,這個FLASH空間是不夠用的,為了解決這個問題,同時方便后續(xù)工程的新建,我們統(tǒng)一使用分散加載的方式來決定FLASH內存的分配,而不用MDK默認的設置。關于分散加載是什么?我們后面8.3小節(jié)會講解,請大家先跟著我們把新建工程完成。
分散加載的文件已經(jīng)為大家準備好了,可以在實驗0-2,新建工程實驗-寄存器版本\User\SCRIPT,或者在(A盤)/程序源碼/STM32啟動文件/分散加載_寄存器版本/SCRIPT中拷貝qspi_code.scf文件到我們的工程User\SCRIPT路徑下,如圖6.1.4.9所示。
圖6.1.4.9 拷貝分散加載文件到工程
注意:這里的分散加載文件寄存器跟HAL庫是不一樣的,我們建立寄存器工程,所以必需用寄存器版本的分散加載文件。
接下來我們需要對MDK進行配置,相當于把分散加載文件關聯(lián)到工程里。方法:點擊魔術棒, Linker選項卡取消勾選:Use Memory Layout from Target DialogScatter File路徑選擇SCRIPT文件夾 選擇qspi_code.scf文件,然后,在disable Warnings一欄,添加:6314,6329,屏蔽6314和6329這兩個警告。如不屏蔽,當分散加載里面有某些段(section)沒用到,則會報警告,所以我們需要屏蔽這兩個警告。如圖6.1.4.10所示。
圖6.1.4.10 添加分散加載文件
至此,添加分散加載文件的相應操作就完成了。
6.1.5 添加main.c,并編寫代碼
在MDK主界面,點擊:,新建一個main.c文件,并保存在User文件夾下。然后雙擊User分組,彈出添加文件的對話框,將User文件夾下的main.c文件添加到User分組下。得到如圖6.1.5.1所示的界面:
圖6.1.5.1 在User分組下加入main.c文件
至此,我們就可以開始編寫我們自己的代碼了。我們在main.c文件里面輸入如下代碼:
此部分代碼,在A盤4,程序源碼1,標準例程-寄存器版本 實驗0 基礎入門實驗實驗0-2,新建最工程實驗-寄存器版本Usermain.c里面有,大家可以自己輸入,也可以直接拷貝。強烈建議自己輸入,以加深對程序的理解和印象!!
注意,這里的include就是使用的相對路徑,關于相對路徑,請參考前面C/C++選項卡設置章節(jié)進行學習。
編寫完main.c以后,我們點擊:(Rebuild)按鈕,編譯整個工程,編譯結果如圖6.1.5.2所示:
圖6.1.5.2 編譯結果
編譯結果提示:代碼總大小(Porgram Size)為:FLASH占用4508字節(jié)(Code + RO + RW),SRAM占用2360字節(jié)(RW + ZI);并成功創(chuàng)建了Hex文件(可執(zhí)行文件,放在Output目錄下);編譯0錯誤,0警告。
注意:如果編譯提示有錯誤/警告,請根據(jù)提示,從第一個錯誤/警告開始解決,直到0錯誤0警告。如果出錯,很有可能是之前的操作存在問題,請對照教程找問題。
另外,我們在Readme分組下還沒有添加任何文件,由于只是添加一個說明性質的文件(.txt),并不是工程必備文件,因此這里我們就不添加了,開發(fā)板光盤的源碼我們是有添加的,大家可以去參考一下。
至此,新建寄存器版本MDK工程完成。
6.2 下載驗證
這里我們繼續(xù)使用DAP仿真器下載,在MDK主界面,點擊:(下載按鈕,也可以按鍵盤快捷鍵:F8),就可以將代碼下載到開發(fā)板,如圖6.2.1所示:
圖6.2.1 下載成功
上圖提示:Application running…,則表示代碼下載成功,且開始運行。此時,我們打開串口調試助手,并設置好端口號(COM號)和波特率(115200),就可以看到打印出來的t值,如圖6.2.2所示:
圖6.2.2 收到開發(fā)板發(fā)回來的數(shù)據(jù)
說明我們的程序運行正常,下載驗證無誤。
總結
以上是生活随笔為你收集整理的【正点原子STM32连载】第六章 新建寄存器版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 完成 Orange3 数据挖掘 汉化版
- 下一篇: 七:如何实现代理与日志清除技术