第四章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所示:

圖4.1.1 STM32MP157開發闆M4裸機例程源碼
對圖4.1.1中的“MP157-M4 HAL庫V1.1”壓縮包進行解壓,得到HAL庫版本的例程源碼如圖4.1.2所示:
圖4.1.2 M4裸機HAL庫例程
STM32MP157 M4裸機例程一共有40個,部分實驗有多個例程,比如:通用定時器實驗、進階定時器實驗、ADC實驗等。秉着簡單易懂的原則,我們選擇《實驗3 HAL庫跑馬燈實驗》作為STM32入門體驗,例程目錄如圖4.1.3所示:
圖4.1.3 跑馬燈例程工程目錄結構
工程目錄下有5個檔案夾,我們将在後續“HAL庫跑馬燈實驗”這一章給大家詳細介紹其作用(其實看檔案夾名字的字面意思基本就知道是做啥用的了),這裡我們不多說。此例程的MDK工程檔案的路徑為:ProjectsàMDK-ARMà atk_mp1_m4.uvprojx,如圖4.1.4所示:
圖4.1.4 跑馬燈實驗例程MDK工程
注意:一定要先安裝MDK5(詳見第三章),否則無法打開該工程檔案!
輕按兩下atk_mp1_m4.uvprojx打開該工程檔案,進入MDK IDE界面,如圖4.1.5所示:
圖4.1.5 MDK打開跑馬燈實驗例程
①、是編譯按鈕,表示編譯目前工程項目檔案,如果之前已經編譯過了,則隻會編譯有改動的檔案。是以一般第一次會比較耗時間,後續因為隻編譯改動檔案,進而大大縮短了編譯時間。該按鈕可以通過F7快捷鍵進行操作。
②、是重新編譯目前工程所有檔案按鈕,工程代碼較多時全部重新編譯會耗費比較多的時間,建議少用。
按①處的按鈕,編譯目前項目,在編譯完成後,可以看到如圖4.1.6所示的編譯提示資訊:
圖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所示:
圖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所示:
圖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界面下,點選
按鈕,打開Options for Target頁籤,在Debug欄選擇仿真工具為use:ST-Link Debugger,如圖4.2.1.1所示:
圖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所示:
圖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所示:
圖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所示。
圖4.2.1.4 Pack設定
其他部分使用預設設定,設定完成以後單擊“确定”按鈕,完成此部分設定,接下來我們還需要在Utilities頁籤裡面設定下載下傳時的目标程式設計器,如圖4.2.1.5所示:
圖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的固件後才可以進行仿真調試,否則可能存在進入仿真界面時報如下的錯:
圖4.2.1.6進入仿真界面提示的資訊
解決辦法就是按照前面第3.4 更新ST LINK固件小節部分的操作步驟進行更新固件。
至此,調試之前的工程設定就完成了,下面我們開始進入仿真界面。
4.2.2 使用ST LINK仿真調試程式
在正常編譯完例程以後(0錯誤,0警告),點選:
(開始/停止仿真按鈕)開始仿真,此時MDK會将代碼加載晶片的指定存儲區域,對于内置Flash的STM32單片機而言,就是代碼下載下傳到内部Flash中。對于STM3MP157而言就是将代碼加載到STM32MP157内部指定的SRAM記憶體空間,注意的是,不要點選keil的下載下傳按鈕
,因為M4沒有Flash,是以是無法将程式下載下傳到Flash的,點選下載下傳按鈕後會報錯Error:Flash Download failed -"Cortex-M4"。點選:
以後,如圖4.2.2.1所示:
圖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所示
圖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所示:
圖4.2.2.3開始仿真
此時可以看到Watch1視窗的SystemCoreClock值為0X03D09000=64000000,說明此時STM32MP157 M4核心頻率為64MHz。我們把滑鼠光标放在第13行左側的灰色區域,然後按下滑鼠左鍵,即可放置一個斷點(紅色的實心點,也可以通過滑鼠右鍵彈出菜單來加入),這樣就在led_init函數處放置一個斷點,然後點選:
,執行到該斷點處,然後再點選:
,執行進入led_init函數,如圖4.2.2.4所示:
圖4.2.2.4執行進入led_init函數
然後我們再回到main.c,在第一個LED0(0)處放置一個斷點,運作到斷點處,如圖4.2.2.5所示:
圖4.3.2.5 運作到LED0(0)代碼處
此時,我們點選:
,執行過這一行代碼,就可以看到開發闆上的DS0(紅燈)亮起來了,以此繼續點選
,依次可以看到:DS0滅àDS1亮àDS0亮àDS1滅àDS0滅àDS1亮……,一直循環。這樣如果全速運作,就可以看到DS0,DS1交替亮滅,不過全速運作的時候,一般是看不出DS0和DS1全亮的情況的,而通過仿真,我們就可以很容易知道有DS0和DS1同時亮的情況!
最後,我們在delay.c檔案中delay_short函數的第二行處設定一個斷點,然後運作到斷點處,如圖4.2.2.6所示:
圖4.3.2.6 檢視函數調用關系及局部變量
此時,我們可以從Call Stack + Locals視窗看到函數的調用關系,其原則是:從下往上看,即下一個函數調用了上一個函數,是以,其關系為:main函數調用了delay函數,然後delay函數調用了delay_short函數。這樣在一些複雜的代碼裡面(尤其是第三方代碼),可以很容易捋出函數調用關系并檢視其局部變量的值,有助于我們分析代碼解決問題。
關于ST LINK的仿真調試,我們暫時就講這麼多。
4.2.3 仿真調試注意事項
1、由于MDK5.23以後對中文支援不是很好,具展現象是:在仿真的時候,當有斷點未清除時點選
結束仿真,會出現如圖4.2.3.1所示的報錯:
圖4.2.3.1 仿真結束時報錯!
此時我們點選确定,是無法關閉MDK的,隻能到電腦的任務管理器裡面強制結束MDK,才可以将其關閉,比較麻煩。
該錯誤就是由于MDK5.23以後的版本對中文支援不太好導緻的,這裡提供2個解決辦法:
(1)、仿真結束前将所有設定的斷點都清除掉,可以使用File工具欄的:
按鈕,快速清除目前工程的所有斷點,然後再結束仿真,就不會報錯;
(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所示:
圖4.3.1.1 MDK預設配色效果
上圖是MDK預設的設定,可以看到其中的關鍵字和注釋等字型的顔色不是很漂亮,而MDK提供了我們自定義字型顔色的功能。我們可以在工具條上點選
配置對話框)彈出如圖4.3.1.2所示界面:
圖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示:
圖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示:
圖4.3.1.4使用者自定義關鍵字
這裡我們設定了uint8_t、uint16_t和uint32_t等三個使用者自定義關鍵字,相當于unsigned char、unsigned short和unsigned int。如果你還有其他自定義關鍵字,在這裡添加即可。設定成之後,點選OK,就可以在主界面看到你所修改後的結果,例如我修改後的代碼顯示效果如圖4.3.1.5示:
圖4.3.1.5設定完後顯示效果
這就比開始的效果好看一些了。字型大小,則可以直接按住:ctrl+滑鼠滾輪,進行放大或者縮小,或者也可以在剛剛的配置界面設定字型大小。
同時,上圖中可以看到空白處有很淡的一些“……”顯示,這就是我們勾選了View White Space選項後展現出來的效果,可以友善我們對代碼進行規範對齊整理。一開始看的時候可能有點不習慣,看多了就習慣了,大家慢慢适應就好了。
其實在這個編輯配置對話框裡,還可以對其他很多功能進行設定,比如動态文法檢測等,我們将4.3.2節介紹。
4.3.2 文法檢測&代碼提示
MDK4.70以上的版本,新增了代碼提示與動态文法檢測功能,使得MDK的編輯器越來越好用了,這裡我們簡單說一下如何設定,同樣,點選
,打開配置對話框,選擇Text Completion頁籤,如圖4.3.2.1所示:
圖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所示:
圖4.3.2.2 代碼提示
ENTER/TAB as fill-up character:使用回車和TAB鍵填充字元。
圖4.3.2.1中左側下面的“Dynamic Syntax Checking”則用于開啟動态文法檢測,比如編寫的代碼存在文法錯誤的時候,會在對應行前面出現
圖示,如出現警告,則會出現
圖示,将滑鼠光标放圖示上面,則會提示産生的錯誤/警告的原因,如圖4.3.2.3所示:
圖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所示:
圖4.3.3.1 頭大的代碼
上圖的代碼很不規範,這還隻是短短25來行代碼,如果你的代碼有幾千行,全部是這個樣子,不頭大才怪。這時我們就可以通過TAB鍵的妙用來快速修改為比較規範的代碼格式。
選中一塊然後按TAB鍵,你可以看到整塊代碼都跟着右移了一定距離,如圖4.3.3.2所示:
圖4.3.3.2 代碼整體偏移
接下來我們就是要多選幾次,然後多按幾次TAB鍵就可以達到迅速使代碼規範化的目的,最終效果如圖4.3.3.3所示
圖4.3.3.3修改後的代碼
圖4.3.3.3中的代碼相對于圖4.3.3.1中的要好看多了,經過這樣的整理之後,整個代碼一下就變得有條理多了,看起來很舒服。
2、快速定位函數/變量被定義的地方
上一節,我們介紹了TAB鍵的功能,接下來我們介紹一下如何快速檢視一個函數或者變量所定義的地方。
大家在調試代碼或編寫代碼的時候,一定有想看看某個函數是在那個地方定義的,具體裡面的内容是怎麼樣的,也可能想看看某個變量或數組是在哪個地方定義的等。尤其在調試代碼或者看别人代碼的時候,如果編譯器沒有快速定位的功能的時候,你隻能慢慢的自己找,代碼量比較少還好,如果代碼量一大,那就郁悶了,有時候要花很久的時間來找這個函數到底在哪裡。型号MDK提供了這樣的快速定位的功能。隻要你把光标放到這個函數/變量(xxx)的上面(xxx為你想要檢視的函數或變量的名字),然後右鍵,彈出如圖4.3.3.4所示的菜單欄 :
圖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所示:
圖4.3.3.5 定位結果
對于變量,我們也可以按這樣的操作快速來定位這個變量被定義的地方,大大縮短了你查找代碼的時間。
很多時候,我們利用Go to Definition看完函數/變量的定義後,又想傳回之前的代碼繼續看,此時我們可以通過IDE上的
按鈕(Back to previous position)快速的傳回之前的位置,這個按鈕非常好用!
3、快速注釋與快速消注釋
接下來,我們介紹一下快速注釋與快速消注釋的方法。在調試代碼的時候,你可能會想注釋某一片的代碼,來看看執行的情況,MDK提供了這樣的快速注釋/消注釋塊代碼的功能。也是通過右鍵實作的。這個操作比較簡單,就是先選中你要注釋的代碼區,然後右鍵,選擇AdvancedàComment Selection就可以了。
以led_init函數為例,比如我要注釋掉下圖中所選中區域的代碼,如圖4.3.3.6所示:
圖4.3.3.6 選中要注釋的區域
我們隻要在選中了之後,選擇右鍵,再選擇AdvancedàComment Selection就可以把這段代碼注釋掉了。執行這個操作以後的結果如圖4.3.3.7所示:
圖4.3.3.7 注釋完畢
這樣就快速的注釋掉了一片代碼,而在某些時候,我們又希望這段注釋的代碼能快速的取消注釋,MDK也提供了這個功能。與注釋類似,先選中被注釋掉的地方,然後通過右鍵àAdvanced,不過這裡選擇的是Uncomment Selection。
4.3.4 其他小技巧
除了前面介紹的幾個比較常用的技巧,這裡還介紹幾個其他的小技巧,希望能讓你的代碼編寫如虎添翼。
第一個是快速打開頭檔案。在将光标放到要打開的引用頭檔案上,然後右鍵選擇Open Document“XXX”,就可以快速打開這個檔案了(XXX是你要打開的頭檔案名字)。如圖4.3.4.1所示:
圖4.3.4.1 快速打開頭檔案
第二個小技巧是查找替換功能。這個和WORD等很多文檔操作的替換功能是差不多的,在MDK裡面查找替換的快捷鍵是“CTRL+H”,隻要你按下該按鈕就會調出如圖4.3.4.2所示界面:
圖4.3.4.2 替換文本
這個替換的功能在有的時候是很有用的,它的用法與其他編輯工具或編譯器的差不多,相信各位都不陌生了,這裡就不嗦了。
第三個小技巧是跨檔案查找功能,先輕按兩下你要找的函數/變量名(這裡以系統時鐘初始化函數:led_init為例),然後再點選IDE上面的
,彈出如圖4.3.4.3所示對話框:
圖4.3.4.3 跨檔案查找
點選Find All,MDK就會幫你找出所有含有Stm32_Clock_Init字段的檔案并列出其所在位置,如圖4.3.4.4所示:
圖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
4.5.1仿真器和調試器資料下載下傳
4.5.1 DAP仿真器的使用
1. 開發闆連接配接
圖4.5.1.1開發闆連接配接
正常的情況是:開發闆上電以後,開發闆核心闆和底闆的電源訓示燈(藍燈)正常亮,DAP仿真器的燈顯示為藍色,如果DAP仿真器的燈始終是紅色或者不亮的話,說明仿真器沒正常連接配接,請檢查USB線是否已經接好,可以重新接好USB線。請注意,如果此前自己更新過DAP仿真器的固件的話,如果沒有配置好,也可能會導緻DAP仿真器的燈不亮,那麼請參考正點原子的DAP使用者使用手冊進行操作。
2. MDK工程調試設定
本節實驗使用了後面第十六章蜂鳴器實驗為例子來進行仿真(實驗前請打開此實驗的代碼,先成功編譯,再進行以下操作),當然,大家可以直接使用本章節的實驗來進行仿真,都是可以的。
打開MDK工程的蜂鳴器實驗,先進行編譯,編譯成功後我們點選魔術棒
打開Options for Target頁籤,在Debug欄選擇仿真工具CMSIS-DAP Debugger,選項同時注意勾選Load Application at Startup 和 Run to main選項:
圖4.5.1.2 選擇仿真器
點選Utilities選項,按照如下步驟進行設定,注意,下圖②步驟的Use Debug Driver要勾選,切記不要勾選Update Target before Debugging此項,然後再點選③處的Settings:
圖4.5.1.3 配置Utilities
進入CMSIS-DAP Cortex-M配置界面後,按照如下配置:
圖4.5.1.4 Flash Download配置
勾選Pack的Enable選項,我們勾選此項的目的是為了識别出開發闆的晶片,如果後面沒有識别開發闆的晶片,請注意此項是否已經選了。
圖4.5.1.5 勾選Pack
如下圖,按照步驟設定後,SW Device處會識别出裝置号,如果沒有識别的話,請注意仿真器是否接觸良好,仿真器的燈是否是藍色的,開發闆的撥碼開關是否是MCU(001)啟動方式,開發闆是否已經上電,以及上圖中Pack的Enable是否已經勾選了。
圖4.5.1.6 配置Debug
點選OK以後,傳回MDK界面,然後點選Start/Stop Debug Session按鈕
,進入仿真頁面,如下:
圖4.5.1.7 進入仿真界面
點選運作
按鈕可以直接進行仿真,當然,也可以點選單步調試按鈕進行單步調試,接下來的操作與使用ST-LInk沒有什麼差别,調試方法可以參考《【正點原子】STM32MP1 M4裸機HAL庫開發指南V1.2》。
圖4.5.1.8 開始仿真
成功運作後,蜂鳴器會間隔“嘀 嘀 嘀……”發聲,說明程式運作成功。
4.5.2 無線調試器的使用
無線調試器的使用步驟大部分和DAP仿真器的使用類似,隻不過硬體連接配接方式不一樣。
開發闆連接配接
如下圖,無線調試器的發送端和接收端通過USB線和電腦進行通信,無線調試器的接收端通過JTAG接口和開發闆連接配接,兩個調試器的燈顯示藍色,說明連接配接正常。如調試器的燈是紅色的或者燈不亮,說明連接配接不正常,請檢查USB線是否接好,可以重新接好試試。請注意,如果此前自己更新過DAP仿真器的固件的話,如果沒有配置好,也可能會導緻DAP仿真器的燈不亮,那麼請參考正點原子的DAP使用者使用手冊進行操作。