天天看點

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

第四章TM32初體驗​

本章,我們不介紹如何編寫代碼,而是向大家介紹如何編譯、序列槽下載下傳、仿真器下載下傳、仿真調試開發闆例程,體驗一下STM32的開發流程,并介紹MDK5的一些使用技巧,通過本章的學習,将對STM32的開發流程和MDK5使用有個大概了解,為後續深入學習打好基礎。​

本章将分為如下幾個小節:​

4.1、使用MDK5編譯例程;​

4.2、使用ST LINK下載下傳與調試程式;​

4.3、MDK5使用技巧;​

4.4、DAP仿真器和無線調試器的使用;​

4.1 使用MDK5編譯例程​

我們在編寫完代碼以後,需要對代碼進行編譯,編譯成功以後,才能在開發闆上進行仿真驗證、調試等操作。STM32MP157開發闆M4裸機例程源碼路徑:開發闆CD光牒à1、程式源碼à3、M4裸機驅動例程àMP157-M4 HAL庫V1.1.zip,如圖4.1.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.1 STM32MP157開發闆M4裸機例程源碼​

對圖4.1.1中的“MP157-M4 HAL庫V1.1”壓縮包進行解壓,得到HAL庫版本的例程源碼如圖4.1.2所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.2 M4裸機HAL庫例程​

STM32MP157 M4裸機例程一共有40個,部分實驗有多個例程,比如:通用定時器實驗、進階定時器實驗、ADC實驗等。秉着簡單易懂的原則,我們選擇《實驗3 HAL庫跑馬燈實驗》作為STM32入門體驗,例程目錄如圖4.1.3所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.3 跑馬燈例程工程目錄結構​

工程目錄下有5個檔案夾,我們将在後續“HAL庫跑馬燈實驗”這一章給大家詳細介紹其作用(其實看檔案夾名字的字面意思基本就知道是做啥用的了),這裡我們不多說。此例程的MDK工程檔案的路徑為:ProjectsàMDK-ARMà atk_mp1_m4.uvprojx,如圖4.1.4所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.4 跑馬燈實驗例程MDK工程​

注意:一定要先安裝MDK5(詳見第三章),否則無法打開該工程檔案!​

輕按兩下atk_mp1_m4.uvprojx打開該工程檔案,進入MDK IDE界面,如圖4.1.5所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.5 MDK打開跑馬燈實驗例程​

①、是編譯按鈕,表示編譯目前工程項目檔案,如果之前已經編譯過了,則隻會編譯有改動的檔案。是以一般第一次會比較耗時間,後續因為隻編譯改動檔案,進而大大縮短了編譯時間。該按鈕可以通過F7快捷鍵進行操作。​

②、是重新編譯目前工程所有檔案按鈕,工程代碼較多時全部重新編譯會耗費比較多的時間,建議少用。​

按①處的按鈕,編譯目前項目,在編譯完成後,可以看到如圖4.1.6所示的編譯提示資訊:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.6 編譯提示資訊​

圖4.1.6中:​

Code:表示代碼大小,占用1984位元組。​

RO-Data:表示隻讀資料所占的空間大小,一般是指const修飾的資料大小。​

RW-Data:表示有初值(且非0)的可讀寫資料所占的空間大小,它同時占用FLASH(存放其初始值)和RAM空間。​

ZI-Data:表示初始化為0的可讀寫資料所占空間大小,它隻占用RAM空間。​

是以圖4.1.6的提示資訊表示:代碼總大小(Porgram Size)為:FLASH(對于STM32MP157 M4來說都是在RAM中,因為M4沒有可用的FLASH)占用2988位元組(Code + RO + RW),RAM占用33920位元組(RW + ZI)。編譯成功以後會建立對應的Hex檔案(可執行檔案,放在Output目錄下),編譯過程中有個0錯誤,0警告;編譯耗時50秒鐘。​

編譯完成以後,會生成.hex和.axf這兩個檔案,預設輸出在Output檔案夾下,如圖4.1.7所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.1.7 hex和axf可執行檔案​

注意:必須編譯成功,才會生成.hex和.axf這兩個檔案!​

.hex:此格式是帶有位址資訊的可執行檔案,對于那些内部有Flash的STM32單片機而言,通過MDK向單片機下載下傳程式的時候下載下傳的就是.hex檔案。對于STM32MP157的M4核心而言,由于内部沒有Flash,是以atk_mp1_m4.hex這個檔案沒用!​

.axf:此格式是帶有調試資訊的檔案,點選MDK的調試按鈕,用的就是此檔案,STM32MP157的M4核心在調試的時候隻能使用atk_mp1_m4.axf。​

.bin:圖4.1.7中并沒有此格式的檔案,因為MDK要經過配置才能使用.axf來生成.bin檔案。.bin是最原始的代碼鏡像檔案,STM32MP157的A7核心啟動M4核心的時候就要用到.bin檔案。​

Output檔案夾下除了.hex和.axf這兩個檔案以外還有很多其他檔案(.axf、.htm、.dep、.lnp、.o、.d、.lst等),這些檔案是編譯過程所産生的中間檔案,我們将在後續的.map檔案分析給大家詳細介紹這些檔案的作用。至此,例程編譯完成。其他實驗例程,大家可以用同樣的方法進行編譯。​

4.2使用ST LINK下載下傳與調試程式​

本節我們将給大家介紹如何使用仿真器給STM32下載下傳代碼,并調試代碼。這裡我們以ST LINK為例給大家進行講解,如果你用的是其他仿真器,基本上也是一樣的用法,隻是選擇仿真器的時候,選擇對應的型号即可。​

ST LINK與開發闆連接配接如圖4.2.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1 ST LINK與開發闆連接配接​

①、ST LINK通過USB線連接配接電腦,且仿真器的紅燈常亮(如果紅燈閃爍,說明沒有安裝驅動,請參考3.3節安裝仿真器驅動)。然後用10P的灰排線連接配接到開發闆的JTAG座上。​

②、確定開發闆已經正常供電,藍色電源燈亮起。​

③、BOOT設定為001,設定為MCU啟動,也就是M4核心啟動。BOOT的撥碼開關撥上去為1,撥下來為0。​

4.2.1 MDK工程調試設定​

在進行仿真之前,一般需要對MDK工程進行設定,雖然正點原子的所有例程都已經設定好了,不需要使用者再次設定,可以直接進行調試,但是這裡還是需要講解一下調試的時候如何設定MDK工程。​

在4.1節的跑馬燈例程MDK IDE界面下,點選

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

按鈕,打開Options for Target頁籤,在Debug欄選擇仿真工具為use:ST-Link Debugger,如圖4.2.1.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1.1頁籤設定​

①、選擇使用ST-Link Debugger仿真器仿真調試代碼。如果你使用的是其他仿真器,比如DAP、JLINK、ULINK等,請在這裡選擇對應的仿真器型号。​

②、該選項選中後,隻要點選仿真就會直接運作到main函數,如果沒選擇這個選項,則會先執行startup_stm32mp15xx.s檔案的Reset_Handler,再跳到main函數。​

然後我們點選圖4.2.1.1中Settings按鈕,設定ST LINK的一些參數,如圖4.2.1.2所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1.2 ST LINK模式設定​

①、表示MDK找到了ST-LINK/V2仿真器,如果這裡顯示為空,則表示沒有仿真器被找到,請檢查你的電腦是否接了仿真器?并安裝了對應的驅動?​

②、設定接口方式,這裡選擇SW(比JTAG省IO),通信速度設定為4Mhz(MDK會自動比對)。​

③、表示MDK通過仿真器的SW接口找到了目标晶片,ID為:0x6BA02477。如果這裡顯示:No target connected,則表示沒找到任何器件,請檢查仿真器和開發闆連接配接是否正常?開發闆是否供電了?如果一切都正常,但還是提示No target connected,點選圖4.2.1.2中的“Pack”标簽,如圖4.2.1.3所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1.3 Pack設定​

勾選圖4.2.1.3中的“Enable”,然後重新點選“Debug”标簽,檢視圖4.2.1.2中③的晶片ID有沒有識别出來。如果識别出來以後就重新點選“Pack”,然後取消圖4.2.1.3中剛剛勾選的 “Enable”,否則無法仿真,如圖4.2.1.4所示。​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1.4 Pack設定​

其他部分使用預設設定,設定完成以後單擊“确定”按鈕,完成此部分設定,接下來我們還需要在Utilities頁籤裡面設定下載下傳時的目标程式設計器,如圖4.2.1.5所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1.5 程式設計器選擇​

①、勾選“Use Debug Driver”,選擇ST LINK來調試、下載下傳。​

②、“Update Target before Debuggin”顧名思義,就是在調試之前先将代碼下載下傳到目标器件中,由于STM32MP157 M4沒有内部Flash,是以絕對不能勾選此選項!否則仿真就會失敗,對于那些内置Flash的STM32單片機需要勾選此選項。​

③、對于内置Flash的STM32單片機,還需要設定燒寫算法,STM32MP157 M4核心不需要設定這一步。​

這裡要注意的是,如果有将ST LINK放在STM32CubeIDE上使用的話,再将ST LINK放到MDK下使用時,這個時候要更新ST LINK的固件後才可以進行仿真調試,否則可能存在進入仿真界面時報如下的錯:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.1.6進入仿真界面提示的資訊​

解決辦法就是按照前面第3.4 更新ST LINK固件小節部分的操作步驟進行更新固件。​

至此,調試之前的工程設定就完成了,下面我們開始進入仿真界面。​

4.2.2 使用ST LINK仿真調試程式​

在正常編譯完例程以後(0錯誤,0警告),點選:

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

(開始/停止仿真按鈕)開始仿真,此時MDK會将代碼加載晶片的指定存儲區域,對于内置Flash的STM32單片機而言,就是代碼下載下傳到内部Flash中。對于STM3MP157而言就是将代碼加載到STM32MP157内部指定的SRAM記憶體空間,注意的是,不要點選keil的下載下傳按鈕

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,因為M4沒有Flash,是以是無法将程式下載下傳到Flash的,點選下載下傳按鈕後會報錯Error:Flash Download failed -"Cortex-M4"。​點選:

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

以後,如圖4.2.2.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.2.1開始仿真​

①、Register:寄存器視窗,顯示了Cortex-M4核心寄存器R0~R15的值,還顯示了内部的線程模式(處理者模式、線程模式)及特權級别(使用者級、特權級),并且還顯示了目前程式的運作時間(Sec),該頁籤一般用于檢視程式運作時間,或者比較進階的bug查找(涉及到分析R0~R14資料是否異常了)。​

②、Disassembly:反彙編視窗,将C語言代碼和彙編對比顯示(指令存放位址,指令代碼,指令,具體操作),友善從彙編級别檢視程式運作狀态,同樣也屬于比較進階别的bug查找。​

③、代碼視窗,在左側有黃綠色三角形,黃色的三角形表示将要執行的代碼,綠色的三角形表示目前光标所在代碼(C代碼 或 目前彙編行代碼對應的C代碼)。一般情況下,這兩個三角形是同步的,隻有在點選光标檢視代碼的時候,才可能不同步。​

④、Call Stack + Locals:調用關系&局部變量視窗,通過該視窗可以檢視函數調用關系,以及函數的局部變量,在仿真調試的時候,是非常有用的。​

開始仿真的預設視窗就給大家介紹這幾個,實際上還有一些其他的視窗,比如Watch、Memory、外設寄存器等也是很常用的,可以根據實際使用選擇調用合适的視窗來檢視對應的資料。​

圖4.2.2.1中,還有一個很重要的工具條:Debug工具條,其内容和作用如圖4.2.2.2所示​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.2.2 Debug工具條​

複位:其功能等同于硬體上按複位按鈕。相當于實作了一次硬複位。按下該按鈕之後,代碼會重新從頭開始執行。​

執行到斷點處:該按鈕用來快速執行到斷點處,有時候你并不需要觀看每步是怎麼執行的,而是想快速的執行到程式的某個地方看結果,這個按鈕就可以實作這樣的功能,前提是你在檢視的地方設定了斷點。​

停止運作:此按鈕在程式一直執行的時候會變為有效,通過按該按鈕,就可以使程式停止下來,進入到單步調試狀态。​

執行進去:該按鈕用來實作執行到某個函數裡面去的功能,在沒有函數的情況下,是等同于執行過去按鈕的。​

執行過去:在碰到有函數的地方,通過該按鈕就可以單步執行過這個函數,而不進入這個函數單步執行。​

執行出去:該按鈕是在進入了函數單步調試的時候,有時候可能不必再執行該函數的剩餘部分了,通過該按鈕就可以一步執行完該函數的餘部分,并跳出函數,回到函數被調用的位置。​

執行到光标處:該按鈕可以迅速的使程式運作到光标處,其實是挺像執行到斷點處按鈕功能,但是兩者是有差別的,斷點可以有多個,但是光标所在處隻有一個。​

反彙編視窗:通過該按鈕,就可以檢視彙編代碼,這對分析程式很有用。​

Call STACK視窗:通過該按鈕,顯示調用關系&局部變量視窗,顯示目前函數的調用關系和局部變量,友善檢視,對分析程式非常有用。​

觀察視窗:MDK5提供2個觀察視窗(下拉選擇),該按鈕按下,會彈出一個顯示變量的視窗,輸入你所想要觀察的變量/表達式,即可檢視其值,是很常用的一個調試視窗。​

記憶體檢視視窗:MDK5提供4個記憶體檢視視窗(下拉選擇),該按鈕按下,會彈出一個記憶體檢視視窗,可以在裡面輸入你要檢視的記憶體位址,然後觀察這一片記憶體的變化情況。是很常用的一個調試視窗​

序列槽列印視窗:MDK5提供4個序列槽列印視窗(下拉選擇),該按鈕按下,會彈出一個類似序列槽調試助手界面的視窗,用來顯示從序列槽列印出來的内容。 ​

系統分析視窗:該圖示下面有6個選項(下拉選擇),我們一般用第一個,也就是邏輯分析視窗(Logic Analyzer),點選即可調出該視窗,通過SETUP按鈕建立一些IO口,就可以觀察這些IO口的電平變化情況,以多種形式顯示出來,比較直覺。​

系統檢視視窗:該按鈕可以提供各種外設寄存器的檢視視窗(通過下拉選擇),選擇對應外設,即可調出該外設的相關寄存器表,并顯示這些寄存器的值,友善檢視設定的是否正确。​

Debug工具條上的其他幾個按鈕用的比較少,我們這裡就不介紹了。以上介紹的是比較常用的,當然也不是每次都用得着這麼多,具體看你程式調試的時候有沒有必要觀看這些東西,來決定要不要看。​

我們在圖4.2.2.1的基礎上:關閉反彙編視窗(Disassembly)、添加觀察視窗1(Watch1)。然後調節一下視窗位置,然後将全局變量:SystemCoreClock(HAL庫提供的,記錄核心時鐘頻率)加入Watch1視窗(方法:輕按兩下Enter expression,然後将變量名字填寫進去即可),如圖4.2.2.3所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.2.3開始仿真​

此時可以看到Watch1視窗的SystemCoreClock值為0X03D09000=64000000,說明此時STM32MP157 M4核心頻率為64MHz。我們把滑鼠光标放在第13行左側的灰色區域,然後按下滑鼠左鍵,即可放置一個斷點(紅色的實心點,也可以通過滑鼠右鍵彈出菜單來加入),這樣就在led_init函數處放置一個斷點,然後點選:

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,執行到該斷點處,然後再點選:

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,執行進入led_init函數,如圖4.2.2.4所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.2.4執行進入led_init函數​

然後我們再回到main.c,在第一個LED0(0)處放置一個斷點,運作到斷點處,如圖4.2.2.5所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.2.5 運作到LED0(0)代碼處​

此時,我們點選:

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,執行過這一行代碼,就可以看到開發闆上的DS0(紅燈)亮起來了,以此繼續點選

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,依次可以看到:DS0滅àDS1亮àDS0亮àDS1滅àDS0滅àDS1亮……,一直循環。這樣如果全速運作,就可以看到DS0,DS1交替亮滅,不過全速運作的時候,一般是看不出DS0和DS1全亮的情況的,而通過仿真,我們就可以很容易知道有DS0和DS1同時亮的情況!​

最後,我們在delay.c檔案中delay_short函數的第二行處設定一個斷點,然後運作到斷點處,如圖4.2.2.6所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.2.6 檢視函數調用關系及局部變量​

此時,我們可以從Call Stack + Locals視窗看到函數的調用關系,其原則是:從下往上看,即下一個函數調用了上一個函數,是以,其關系為:main函數調用了delay函數,然後delay函數調用了delay_short函數。這樣在一些複雜的代碼裡面(尤其是第三方代碼),可以很容易捋出函數調用關系并檢視其局部變量的值,有助于我們分析代碼解決問題。​

關于ST LINK的仿真調試,我們暫時就講這麼多。​

4.2.3 仿真調試注意事項​

1、由于MDK5.23以後對中文支援不是很好,具展現象是:在仿真的時候,當有斷點未清除時點選

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

結束仿真,會出現如圖4.2.3.1所示的報錯:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.2.3.1 仿真結束時報錯!​

此時我們點選确定,是無法關閉MDK的,隻能到電腦的任務管理器裡面強制結束MDK,才可以将其關閉,比較麻煩。​

該錯誤就是由于MDK5.23以後的版本對中文支援不太好導緻的,這裡提供2個解決辦法:​

(1)、仿真結束前将所有設定的斷點都清除掉,可以使用File工具欄的:

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

按鈕,快速清除目前工程的所有斷點,然後再結束仿真,就不會報錯;​

(2)、将工程路徑改淺,并改成全英文路徑(比如,将源碼拷貝到:E盤àSource Code檔案夾下。注意:例程名字一般可以不用改英文,因為隻要整個路徑不超過10個漢字,一般就不會報錯了,如果還報錯就再減少漢字數量)。通過這兩個方法,可以避免仿真結束報錯的問題。我們推薦大家使用第二種方法,因為這樣就不用每次都全部清除所有斷點,下回仿真又得重設的麻煩。​

2、關于STM32軟體仿真,老版本的教程,我們給大家介紹過如何使用MDK進行STM32軟體仿真,由于其限制較多(隻支援部分F1型号),而且仿真器越來越便宜,硬體仿真更符合實際調試需求,調試效果更好。是以後續我們隻介紹硬體仿真,不再推薦大家使用軟體仿真了!​

3、仿真調試找bug是一個軟體工程師必備的基本技能。MDK提供了很多工具和視窗來輔助我們找問題,隻要多使用,多練習,肯定就可以把仿真調試學好。這對我們後續的獨立開發項目,非常有幫助。是以極力推薦大家多練習使用仿真器查找代碼bug,學會這個基本技能。​

4、調試代碼不要淺嘗辄止,要想盡辦法找問題,具體的思路:先根據代碼運作的實際現象分析問題,确定最可能出問題的地方,然後在相應的位置放置斷點,檢視變量,檢視寄存器,分析運作狀态和預期結果是否一緻?進而找到問題原因,解決bug。特别提醒:一定不要淺嘗辄止,很多朋友隻跟蹤到最上一級函數,就說當機了,不會跟蹤進去找問題!是以一定要一層層進入各種函數,越是底層(甚至彙編級别),越好找到問題原因。​

4.3 MDK5使用技巧​

本節,我們将向大家介紹MDK5軟體的一些使用技巧,這些技巧在代碼編輯和編寫方面會非常有用,希望大家好好掌握,最好實際操作一下,加深印象。​

4.3.1 文本美化​

文本美化,主要是設定一些關鍵字、注釋、數字等的顔色和字型。如果你剛裝MDK,沒進行字型顔色配置,以跑馬燈例程為例,你的界面效果如圖4.3.1.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.1.1 MDK預設配色效果​

上圖是MDK預設的設定,可以看到其中的關鍵字和注釋等字型的顔色不是很漂亮,而MDK提供了我們自定義字型顔色的功能。我們可以在工具條上點選

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

配置對話框)彈出如圖4.3.1.2所示界面:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.1.2置對話框​

①、設定代碼編輯器字型使用:Chinese GB2312(Simplified),以更好的支援中文。​

②、設定編輯器的空格可見:View White Space,所有空格使用“.”替代,TAB使用“à”替代,這樣可以友善我們對代碼進行對齊操作。同時,我們推薦所有的對齊都用空格來替代,這樣在不同軟體之間檢視源代碼,就不會引起由于TAB鍵大小不一樣導緻代碼不對齊的問題,友善使用不同軟體檢視和編輯代碼。​

③、設定C/C++檔案,TAB鍵的大小為4個字元,且字元使用空格替代(Insert spaces for tabs)。這樣我們在使用TAB鍵進行代碼對齊操作的時候,都會用空格替代,保證不同軟體使用代碼都可以對齊。​

然後,選擇:Colors & Fonts頁籤,在該頁籤内,我們就可以設定自己的代碼的字型和顔色了。由于我們使用的是C語言,故在Window下面選擇:C/C++ Editor Files在右邊就可以看到相應的元素了。如圖4.3.1.3示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.1.3 Colors & Fonts頁籤​

然後點選各個元素(Element)修改為你喜歡的顔色(注意輕按兩下,且有時候可能需要設定多次才生效,MDK的bug),當然也可以在Font欄設定你字型的類型,以及字型的大小等。​

然後,點選User Keywords頁籤,設定使用者定義關鍵字,以便使用者自定義關鍵字也顯示對應的顔色(對應圖4.4.1.3中的User Keyword/Lable顔色)。在User Keywords頁籤對話框下面輸入你自己定義的關鍵字,如圖4.3.1.4示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.1.4使用者自定義關鍵字​

這裡我們設定了uint8_t、uint16_t和uint32_t等三個使用者自定義關鍵字,相當于unsigned char、unsigned short和unsigned int。如果你還有其他自定義關鍵字,在這裡添加即可。設定成之後,點選OK,就可以在主界面看到你所修改後的結果,例如我修改後的代碼顯示效果如圖4.3.1.5示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.1.5設定完後顯示效果​

這就比開始的效果好看一些了。字型大小,則可以直接按住:ctrl+滑鼠滾輪,進行放大或者縮小,或者也可以在剛剛的配置界面設定字型大小。​

同時,上圖中可以看到空白處有很淡的一些“……”顯示,這就是我們勾選了View White Space選項後展現出來的效果,可以友善我們對代碼進行規範對齊整理。一開始看的時候可能有點不習慣,看多了就習慣了,大家慢慢适應就好了。​

其實在這個編輯配置對話框裡,還可以對其他很多功能進行設定,比如動态文法檢測等,我們将4.3.2節介紹。 ​

4.3.2 文法檢測&代碼提示​

MDK4.70以上的版本,新增了代碼提示與動态文法檢測功能,使得MDK的編輯器越來越好用了,這裡我們簡單說一下如何設定,同樣,點選

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,打開配置對話框,選擇Text Completion頁籤,如圖4.3.2.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.2.1 Text Completion頁籤設定​

圖4.3.2.1中的“Show Code Completion List For”标簽中有4個選項:​

Strut / Class Members:用于開啟結構體/類成員提示功能。​

Function Parameters:用于開啟函數參數提示功能。​

Symbols after xx characters:用于開啟代碼提示功能,即在輸入多少個字元以後,提示比對的内容(比如函數名字、結構體名字、變量名字等),這裡預設設定3個字元以後,就開始提示。如圖4.3.2.2所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.2.2 代碼提示​

ENTER/TAB as fill-up character:使用回車和TAB鍵填充字元。​

圖4.3.2.1中左側下面的“Dynamic Syntax Checking”則用于開啟動态文法檢測,比如編寫的代碼存在文法錯誤的時候,會在對應行前面出現

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖示,如出現警告,則會出現

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖示,将滑鼠光标放圖示上面,則會提示産生的錯誤/警告的原因,如圖4.3.2.3所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.2.3 文法動态檢測功能​

這幾個功能,對我們編寫代碼很有幫助,可以加快代碼編寫速度,并且及時發現各種問題。不過這裡要提醒大家,文法動态檢測這個功能,有的時候會誤報(比如sys.c裡面,就有誤報),大家可以不用理會,隻要能編譯通過(0錯誤,0警告),這樣的文法誤報,一般直接忽略即可。​

4.3.3 代碼編輯技巧​

這裡給大家介紹幾個我常用的技巧,這些小技巧能給我們的代碼編輯帶來很大的友善,相信對你的代碼編寫一定會有所幫助。​

1、TAB鍵的妙用​

首先要介紹的就是TAB鍵的使用,這個鍵在很多編譯器裡面都是用來空位的,每按一下移空幾個位。如果你是經常編寫程式的對這個鍵一定再熟悉不過了。但是MDK的TAB鍵和一般編譯器的TAB鍵有不同的地方,和C++的TAB鍵差不多。MDK的TAB鍵支援塊操作。也就是可以讓一片代碼整體右移固定的幾個位,也可以通過SHIFT+TAB鍵整體左移固定的幾個位。​

假設現在有一段代碼如圖4.3.3.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.1 頭大的代碼​

上圖的代碼很不規範,這還隻是短短25來行代碼,如果你的代碼有幾千行,全部是這個樣子,不頭大才怪。這時我們就可以通過TAB鍵的妙用來快速修改為比較規範的代碼格式。​

選中一塊然後按TAB鍵,你可以看到整塊代碼都跟着右移了一定距離,如圖4.3.3.2所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.2 代碼整體偏移​

接下來我們就是要多選幾次,然後多按幾次TAB鍵就可以達到迅速使代碼規範化的目的,最終效果如圖4.3.3.3所示​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.3修改後的代碼​

圖4.3.3.3中的代碼相對于圖4.3.3.1中的要好看多了,經過這樣的整理之後,整個代碼一下就變得有條理多了,看起來很舒服。​

2、快速定位函數/變量被定義的地方​

上一節,我們介紹了TAB鍵的功能,接下來我們介紹一下如何快速檢視一個函數或者變量所定義的地方。​

大家在調試代碼或編寫代碼的時候,一定有想看看某個函數是在那個地方定義的,具體裡面的内容是怎麼樣的,也可能想看看某個變量或數組是在哪個地方定義的等。尤其在調試代碼或者看别人代碼的時候,如果編譯器沒有快速定位的功能的時候,你隻能慢慢的自己找,代碼量比較少還好,如果代碼量一大,那就郁悶了,有時候要花很久的時間來找這個函數到底在哪裡。型号MDK提供了這樣的快速定位的功能。隻要你把光标放到這個函數/變量(xxx)的上面(xxx為你想要檢視的函數或變量的名字),然後右鍵,彈出如圖4.3.3.4所示的菜單欄 :​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.4 快速定位​

在圖4.3.3.4中,我們找到Go to Definition Of‘led_init’,然後單擊左鍵就可以快速跳到led_init函數的定義處(注意要先在Options for Target的Output頁籤裡面勾選Browse Information選項,再編譯,再定位,否則無法定位!)。如圖4.3.3.5所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.5 定位結果​

對于變量,我們也可以按這樣的操作快速來定位這個變量被定義的地方,大大縮短了你查找代碼的時間。​

很多時候,我們利用Go to Definition看完函數/變量的定義後,又想傳回之前的代碼繼續看,此時我們可以通過IDE上的

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

按鈕(Back to previous position)快速的傳回之前的位置,這個按鈕非常好用!​

3、快速注釋與快速消注釋 ​

接下來,我們介紹一下快速注釋與快速消注釋的方法。在調試代碼的時候,你可能會想注釋某一片的代碼,來看看執行的情況,MDK提供了這樣的快速注釋/消注釋塊代碼的功能。也是通過右鍵實作的。這個操作比較簡單,就是先選中你要注釋的代碼區,然後右鍵,選擇AdvancedàComment Selection就可以了。​

以led_init函數為例,比如我要注釋掉下圖中所選中區域的代碼,如圖4.3.3.6所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.6 選中要注釋的區域​

我們隻要在選中了之後,選擇右鍵,再選擇AdvancedàComment Selection就可以把這段代碼注釋掉了。執行這個操作以後的結果如圖4.3.3.7所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.3.7 注釋完畢​

這樣就快速的注釋掉了一片代碼,而在某些時候,我們又希望這段注釋的代碼能快速的取消注釋,MDK也提供了這個功能。與注釋類似,先選中被注釋掉的地方,然後通過右鍵àAdvanced,不過這裡選擇的是Uncomment Selection。​

4.3.4 其他小技巧​

除了前面介紹的幾個比較常用的技巧,這裡還介紹幾個其他的小技巧,希望能讓你的代碼編寫如虎添翼。​

第一個是快速打開頭檔案。在将光标放到要打開的引用頭檔案上,然後右鍵選擇Open Document“XXX”,就可以快速打開這個檔案了(XXX是你要打開的頭檔案名字)。如圖4.3.4.1所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.4.1 快速打開頭檔案​

第二個小技巧是查找替換功能。這個和WORD等很多文檔操作的替換功能是差不多的,在MDK裡面查找替換的快捷鍵是“CTRL+H”,隻要你按下該按鈕就會調出如圖4.3.4.2所示界面:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.4.2 替換文本​

這個替換的功能在有的時候是很有用的,它的用法與其他編輯工具或編譯器的差不多,相信各位都不陌生了,這裡就不嗦了。​

第三個小技巧是跨檔案查找功能,先輕按兩下你要找的函數/變量名(這裡以系統時鐘初始化函數:led_init為例),然後再點選IDE上面的

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,彈出如圖4.3.4.3所示對話框:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.4.3 跨檔案查找​

點選Find All,MDK就會幫你找出所有含有Stm32_Clock_Init字段的檔案并列出其所在位置,如圖4.3.4.4所示:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.3.4.4 查找結果​

該方法可以很友善的查找各種函數/變量,而且可以限定搜尋範圍(比如隻查找.c檔案和.h檔案等),是非常實用的一個技巧。 ​

4.5 DAP仿真器和無線調試器的使用​

由于M4沒有可以用的Flash,是以一般在M4代碼調試階段我們會采用線上仿真的方式,即将代碼下載下傳到M4可用的SRAM中,對STM32MP1的M4進行仿真,我們可以使用ST-Link、Jlink、正點原子的DAP仿真器或者無線調試器來進行仿真調試。​

本節主要講解如何使用正點原子的DAP仿真器以及無線調試器在STM32MP1上進行仿真,正點原子的DAP仿真器和無線調試器分為高速版和普速版,關于以上仿真器的使用者手冊等相關資料,大家可以到正點原子資料下載下傳中心進行下載下傳。注意,使用仿真器前一定要先認真閱讀使用者手冊!使用者手冊中講解了仿真器的基本使用方法。​

資料連結:​​http://www.openedv.com/docs/tool/dap/index.html​​​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

4.5.1仿真器和調試器資料下載下傳​

4.5.1 DAP仿真器的使用​

1. 開發闆連接配接​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.1開發闆連接配接​

正常的情況是:開發闆上電以後,開發闆核心闆和底闆的電源訓示燈(藍燈)正常亮,DAP仿真器的燈顯示為藍色,如果DAP仿真器的燈始終是紅色或者不亮的話,說明仿真器沒正常連接配接,請檢查USB線是否已經接好,可以重新接好USB線。請注意,如果此前自己更新過DAP仿真器的固件的話,如果沒有配置好,也可能會導緻DAP仿真器的燈不亮,那麼請參考正點原子的DAP使用者使用手冊進行操作。​

2. MDK工程調試設定​

本節實驗使用了後面第十六章蜂鳴器實驗為例子來進行仿真(實驗前請打開此實驗的代碼,先成功編譯,再進行以下操作),當然,大家可以直接使用本章節的實驗來進行仿真,都是可以的。​

打開MDK工程的蜂鳴器實驗,先進行編譯,編譯成功後我們點選魔術棒

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

打開Options for Target頁籤,在Debug欄選擇仿真工具CMSIS-DAP Debugger,選項同時注意勾選Load Application at Startup 和 Run to main選項:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.2 選擇仿真器​

點選Utilities選項,按照如下步驟進行設定,注意,下圖②步驟的Use Debug Driver要勾選,切記不要勾選Update Target before Debugging此項,然後再點選③處的Settings:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.3 配置Utilities ​

進入CMSIS-DAP Cortex-M配置界面後,按照如下配置:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.4 Flash Download配置​

勾選Pack的Enable選項,我們勾選此項的目的是為了識别出開發闆的晶片,如果後面沒有識别開發闆的晶片,請注意此項是否已經選了。​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.5 勾選Pack​

如下圖,按照步驟設定後,SW Device處會識别出裝置号,如果沒有識别的話,請注意仿真器是否接觸良好,仿真器的燈是否是藍色的,開發闆的撥碼開關是否是MCU(001)啟動方式,開發闆是否已經上電,以及上圖中Pack的Enable是否已經勾選了。​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.6 配置Debug​

點選OK以後,傳回MDK界面,然後點選Start/Stop Debug Session按鈕

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

,進入仿真頁面,如下:​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.7 進入仿真界面​

點選運作

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

按鈕可以直接進行仿真,當然,也可以點選單步調試按鈕進行單步調試,接下來的操作與使用ST-LInk沒有什麼差别,調試方法可以參考《【正點原子】STM32MP1 M4裸機HAL庫開發指南V1.2》。​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

圖4.5.1.8 開始仿真​

成功運作後,蜂鳴器會間隔“嘀 嘀 嘀……”發聲,說明程式運作成功。​

4.5.2 無線調試器的使用​

無線調試器的使用步驟大部分和DAP仿真器的使用類似,隻不過硬體連接配接方式不一樣。​

開發闆連接配接​

如下圖,無線調試器的發送端和接收端通過USB線和電腦進行通信,無線調試器的接收端通過JTAG接口和開發闆連接配接,兩個調試器的燈顯示藍色,說明連接配接正常。如調試器的燈是紅色的或者燈不亮,說明連接配接不正常,請檢查USB線是否接好,可以重新接好試試。請注意,如果此前自己更新過DAP仿真器的固件的話,如果沒有配置好,也可能會導緻DAP仿真器的燈不亮,那麼請參考正點原子的DAP使用者使用手冊進行操作。​

《STM32MP1 M4裸機HAL庫開發指南》第四章 STM32初體驗

MDK工程調試設定​