1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子APM32E103最小系統(tǒng)板
2)平臺(tái)購(gòu)買地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套實(shí)驗(yàn)源碼+手冊(cè)+視頻下載地址: http://www.openedv.com/docs/boards/xiaoxitongban
第四章 APM32初體驗(yàn)
本章并不涉及程序代碼的編寫,而是介紹如何編譯工程、燒錄程序以及進(jìn)行程序的調(diào)試仿真,讓讀者體驗(yàn)APM32的開發(fā)流程,并會(huì)介紹一些MDK的使用技巧。通過本章的學(xué)習(xí),讀者將對(duì)APM32的開發(fā)流程及MDK的使用方法有一個(gè)大概的了解,為后續(xù)的深入學(xué)習(xí)打好基礎(chǔ)。
本章分為如下幾個(gè)小節(jié):
4.1 使用MDK編譯實(shí)驗(yàn)例程
4.2 使用串口燒錄程序
4.3 使用DAP燒錄及調(diào)試程序
4.4 MDK使用技巧
4.1 使用MDK編譯實(shí)驗(yàn)例程
在編寫完程序代碼后,需要對(duì)程序進(jìn)行編譯,只有在程序編譯成功后,才能將編譯出的二進(jìn)制文件燒錄至芯片中運(yùn)行以及進(jìn)行仿真調(diào)試等操作。
本書配套提供的實(shí)驗(yàn)例程在A盤4,程序源碼目錄中,如下圖所示:
圖4.1.1 配套提供的實(shí)驗(yàn)例程源碼
在上圖“標(biāo)準(zhǔn)例程”文件夾中,就包含了基于Geehy提供的標(biāo)準(zhǔn)庫(kù)編寫的各個(gè)實(shí)驗(yàn)例程,如下圖所示:
圖4.1.2 標(biāo)準(zhǔn)例程
從上圖中可以看到,除了“實(shí)驗(yàn)0 基礎(chǔ)入門實(shí)驗(yàn)”是用于創(chuàng)建MDK工程等MDK基礎(chǔ)使用例程外,共有33個(gè)實(shí)驗(yàn),其中部分實(shí)驗(yàn)內(nèi)有多個(gè)實(shí)驗(yàn)例程,總的實(shí)驗(yàn)例程多達(dá)47個(gè)。
秉承著簡(jiǎn)單易懂的原則,本章以跑馬燈實(shí)驗(yàn)例程(“實(shí)驗(yàn)1 跑馬燈實(shí)驗(yàn)”)作為示例例程,例程的根目錄如下圖所示:
圖4.1.3 跑馬燈實(shí)驗(yàn)例程根目錄
所有實(shí)驗(yàn)例程的目錄結(jié)構(gòu)都與上圖中的目錄結(jié)構(gòu)類似,這會(huì)在后續(xù)創(chuàng)建MDK工程相關(guān)的章節(jié)中進(jìn)行介紹(其實(shí)光看文件夾的名稱,就能知道文件夾大概的作用了)。
接下來打開MDK工程文件,其路徑為ProjectsMDK-ARMatk_e103.uvprojx,如下圖所示:
圖4.1.4 跑馬燈實(shí)驗(yàn)例程MDK工程文件
注意:打開MDK工程文件的前提是正確地安裝了MDK軟件。
使用MDK打開跑馬燈的MDK工程文件后,如下圖所示:
圖4.1.5 使用MDK軟件打開跑馬燈MDK工程
如上圖所示,在MDK軟件的左上方可以看到兩個(gè)快捷按鈕,這兩個(gè)按鈕都是用于編譯工程的,區(qū)別如下:
①:Build按鈕,快捷鍵F7,該按鈕用于編譯工程,并且該按鈕比較“聰明”,使用該按鈕編譯工程時(shí),只會(huì)編譯在上次編譯后被改動(dòng)或需要重新編譯的文件,并不會(huì)重新地編譯整個(gè)工程,從而可以大大地縮短編譯時(shí)間,推薦使用。
②:Rebuild按鈕,無快捷鍵,該按鈕會(huì)重新地編譯整個(gè)工程,因此整體上會(huì)比Build按鈕耗時(shí)。
雖然Build按鈕和Rebuild按鈕存在一些差別,但是對(duì)于沒有編譯過的工程,這兩個(gè)按鈕的作用都是一樣的,因此接下來按下任意一個(gè)編譯按鈕或直接點(diǎn)擊快捷鍵F7編譯跑馬燈工程,編譯完成后,MDK軟件底部的Build Output窗口會(huì)輸出編譯信息,如下圖所示:
圖4.1.6 編譯結(jié)果輸出信息
從上圖中,就可以查看到本次編譯的許多信息,這里介紹輸出信息的后四行,如下:
Code:程序代碼占用的空間大小(2924Bytes);
RO-data:只讀數(shù)據(jù)(一般是const關(guān)鍵字修飾的常量)占用的空間大?。?56Bytes);
RW-data:有初值(初值不為0)的可讀寫數(shù)據(jù)(Flash中存放初值,取出至RAM中被訪問)占用的空間(同時(shí)占用Flash和RAM)大小(12Bytes);
ZI-data:無初值(初值為0)的可讀寫數(shù)據(jù)占用的空間大?。?836Bytes);
從上面的信息就可以看出,在不考慮動(dòng)態(tài)內(nèi)存分配的情況下,編寫的程序?qū)⒄加?292Bytes(Code+RO-data+RW-data)的Flash空間和1848Bytes(RW-data+ZI-data)的RAM空間;
創(chuàng)建了Hex文件(能夠被單片機(jī)執(zhí)行的文件,可直接燒錄至單片機(jī)內(nèi)部的Flash執(zhí)行,使用串口燒錄程序時(shí)使用);
創(chuàng)建了AXF文件(不僅包含了能夠被單片機(jī)執(zhí)行的文件,還附加了其他的調(diào)試信息,能夠進(jìn)行仿真調(diào)試都靠它,使用調(diào)試器燒錄程序時(shí)使用);
編譯結(jié)果有0個(gè)錯(cuò)誤和0個(gè)警告;
編譯耗時(shí)為1秒鐘。
實(shí)驗(yàn)例程編譯出的文件默認(rèn)會(huì)輸出在Output文件夾下,如下圖所示:
圖4.1.7 編譯文件和編譯過程產(chǎn)生的中間文件
從上圖中可以看到,編譯成功后,不僅生成了Hex和AXF文件,還生成了許多中間文件,對(duì)此,本書將在后續(xù)的MAP文件分析時(shí)進(jìn)行介紹。
至此就完成了實(shí)驗(yàn)例程的編譯,對(duì)于其他的實(shí)驗(yàn)例程,讀者可以用同樣的方式進(jìn)行編譯。
4.2 使用串口燒錄程序
APM32燒錄程序有三種常見的方式,如下表所示:
表4.2.1 APM32常見程序燒錄方式對(duì)比
通過上表對(duì)比,推薦讀者在沒有仿真器的情況下使用串口方式燒錄程序,若有仿真器則使用SWD的方式燒錄程序,同時(shí)也強(qiáng)烈建議讀者購(gòu)買一個(gè)仿真器(如CMSIS-DAP仿真器),可以極大的方便學(xué)習(xí)和開發(fā)。
上表中BOOT0和BOOT1引腳時(shí)APM32E103上的兩個(gè)引腳,這兩個(gè)引腳可以用于配置APM32E103上電或復(fù)位時(shí)的啟動(dòng)模式,具體如下表所示:
表4.2.2 APM32E103啟動(dòng)模式配置
從上表中可以看出,通過設(shè)置BOOT[1:0]引腳,可以配置APM32E103從不同的地址運(yùn)行程序,其中Flash中的程序就是用戶燒錄至芯片的用戶程序,系統(tǒng)存儲(chǔ)器中的程序是芯片廠家在芯片出廠前被固化(不可修改)到芯片內(nèi)部的程序,也就是芯片內(nèi)嵌的BootLoader程序。
通過芯片內(nèi)嵌的BootLoader程序,用戶可以非常輕松地將用戶程序燒錄到Flash中,即使某些在使用Flash啟動(dòng)時(shí)無法燒錄程序的情況,例如,F(xiàn)lash中的用戶程序關(guān)閉了SWJ-DP(Serial Wire/JTAG Debug Poet,串行/JTAG調(diào)試端口)的情況。芯片內(nèi)嵌BootLoader提供了多種燒錄用戶程序至Flash的接口,如:USART1、USART3、CAN2、USB OTG_FS從設(shè)備模式,當(dāng)然,也可以在BootLoader程序運(yùn)行過程中通過仿真器燒錄程序至Flash。
本章就介紹如何使用串口1(USART1)實(shí)現(xiàn)APM32E103的程序燒錄。
從前文本小節(jié)的介紹中可知,若要使用串口1燒錄程序,則需讓APM32E103運(yùn)行在芯片內(nèi)嵌的BootLoader程序中,而進(jìn)入芯片內(nèi)嵌BootLoader的方法為:在芯片上電或復(fù)位時(shí)將BOOT0引腳置為高電平、BOOT1引腳置為低電平,進(jìn)入芯片內(nèi)嵌BootLoader后就能夠使用相關(guān)的上位機(jī)軟件將事先編譯出的Hex文件燒錄置Flash中,燒錄成功之后,還需要將BOOT0引腳置為低電平,然后重新上電或復(fù)位芯片,芯片才能運(yùn)行燒錄的用戶程序,在這整個(gè)過程中,至少需要手動(dòng)改變兩次BOOT0引腳的電平和進(jìn)行兩次復(fù)位,比較繁瑣。為此,APM32E103最小系統(tǒng)板利用串口的DTR和RST信號(hào),設(shè)計(jì)了一鍵下載電路。
一鍵下載電路使用串口的DTR信號(hào)控制APM32E103的BOOT0引腳,使用串口的RST信號(hào)控制APM32E103的NRST引腳(芯片復(fù)位引腳),再配合上位機(jī)軟件(ATK-XISP),設(shè)置“DTR的低電平復(fù)位,RST高電平進(jìn)BootLoader”,這樣就能夠由軟件自動(dòng)控制APM32E103芯片的BOOT0引腳和復(fù)位,從而實(shí)現(xiàn)一鍵下載。一鍵下載電路的原理圖級(jí)介紹,請(qǐng)參考《APM32E103最小系統(tǒng)板硬件參考手冊(cè).pdf》。
在使用串口燒錄程序之前,需要將芯片通過串口和和PC進(jìn)行連接,除了按照3.4小節(jié)中事先安裝好USB虛擬串口的驅(qū)動(dòng)并將板卡與PC進(jìn)行連接,還需保證板卡上的PA9和PA10端子通過跳線帽分別與RX和TX端子進(jìn)行連接,以保證板載CH340C芯片與APM32E103ZET6 MCU通過串口相連接,如下圖所示:
圖4.2.1 板卡設(shè)置
使用一鍵下載電路燒錄程序的時(shí)候,需要使用到的上位機(jī)軟件為ATK-XISP,讀者可以前往正點(diǎn)原子資料下載中心下載該軟件,也可以在A盤6,軟件資料1,軟件ATK-XISP中找到該軟件,如下圖所示:
圖4.2.2 ATK-XISP軟件
打開ATK-XISP軟件后,需先根據(jù)實(shí)際情況進(jìn)行一些配置,如下圖所示:
圖4.2.3 ATK-XISP配置
①:先在“串口”列表中根據(jù)實(shí)際的情況選擇連接至板卡的COM口,串口通信波特率可以選擇最大值(若后續(xù)程序燒錄失敗,再適當(dāng)降低串口通信波特率);
②:選擇4.1小節(jié)編譯出的Hex文件;
③:勾選“編程后運(yùn)行”和“校驗(yàn)”復(fù)選框,這樣可以保證燒錄程序的正確性,并在程序燒錄完成后自動(dòng)運(yùn)行程序,省去了手動(dòng)復(fù)位的操作;
④:務(wù)必正確設(shè)置為“DTR低電平復(fù)位 RST高電平進(jìn)BootLoader”,以保證能夠配合一鍵下載電路控制APM32E103進(jìn)入BootLoader燒錄程序并且控制器復(fù)位。
設(shè)置好ATK-XISP軟件之后,就能夠點(diǎn)擊“開始編程”按鈕,即可一鍵將程序燒錄至APM32E103,燒錄成功后,如下圖所示:
圖4.2.4 燒錄成功
從上圖中可以看到,ATK-XISP軟件會(huì)輸出燒錄過程中的相關(guān)操作信息,例如如何控制APM32E103進(jìn)入BootLoader、燒錄了多大的程序至Flash、耗時(shí)多久等信息。同時(shí),也能看到提示“運(yùn)行成功”,這就表明APM32E103已經(jīng)在運(yùn)行Flash中的用戶程序了,此時(shí)便可以看到APM32E103最小系統(tǒng)板上的LED0和LED1閃爍。
至此就完成了跑馬燈實(shí)驗(yàn)例程程序的燒錄,對(duì)于其他的實(shí)驗(yàn)例程,讀者也可以使用同樣的方式使用串口進(jìn)行程序燒錄。
4.3 使用DAP燒錄及調(diào)試程序
在上一節(jié)中介紹了使用串口給APM32燒錄程序,但僅通過串口,并不能很方便地進(jìn)行代碼調(diào)試和仿真,而只能觀看程序的運(yùn)行結(jié)果,因此在需要調(diào)試程序代碼的時(shí)候,最好還是使用仿真器進(jìn)行程序的燒錄和調(diào)試,本節(jié)就將介紹,如何使用正點(diǎn)原子DAP仿真器給APM32進(jìn)行程序的燒錄和調(diào)試,對(duì)于其他型號(hào)的仿真器,具體的操作步驟也都是類似的。
正點(diǎn)原子DAP仿真器與APM32E103最小系統(tǒng)板的連接步驟如下:
①:通過板卡USB_UART接口為板卡供電,也可以連接至PC,這樣可同時(shí)查看串口輸出的數(shù)據(jù);
②:通過USB接口將正點(diǎn)原子DAP仿真器與PC進(jìn)行連接,若連接正常,DAP仿真器的藍(lán)燈常亮;
③:通過4P排線將正點(diǎn)原子DAP的SWD接口與板卡的SWD接口相連。
4.3.1 使用DAP燒錄程序
同樣以第4.1小節(jié)中的跑馬燈實(shí)驗(yàn)例程為例,在MDK軟件界面下,點(diǎn)擊 按鈕(快捷鍵Alt+F7)打開“Options for Target”窗口,同時(shí)打開窗口頂部的“Debug”選項(xiàng)卡,如下圖所示:
圖4.3.1.1 Debug選項(xiàng)卡配置
如上圖所示,打開“Debug”選項(xiàng)卡后,在①處根據(jù)使用的仿真器型號(hào)選擇對(duì)應(yīng)的調(diào)式工具,本章使用DAP仿真器,因此選擇“CMSIS-DAP Debugger”,讀者若使用其他仿真器,則對(duì)應(yīng)選擇調(diào)試工具即可。勾選②處的“Run to main()”復(fù)選框可以在開啟調(diào)試后,程序自動(dòng)運(yùn)行到main()函數(shù),否則程序會(huì)從啟動(dòng)文件中的“Reset_Handler”(復(fù)位異常)標(biāo)號(hào)開始運(yùn)行,讀者可根據(jù)實(shí)際情況選擇勾選或不勾選改復(fù)選框。接著再打開③處的“Settings”按鈕,打開對(duì)應(yīng)調(diào)試器的配置窗口,如下圖所示:
圖4.3.1.2 DAP仿真器配置窗口
如上圖所示,若PC上連接了多個(gè)DAP仿真器,則需要在①處選擇對(duì)應(yīng)的DAP仿真器,若DAP仿真器與板卡連接正常,則會(huì)在②處顯示“IDCODE”和“Device Name”,若連接異常,則會(huì)顯示“Error”,此時(shí)應(yīng)該檢查接線和供電。接著在③處的“Port”下拉框選擇“SW”,該選項(xiàng)對(duì)應(yīng)4Pin的SWD接口,另外一個(gè)選項(xiàng)為“JTAG”,其對(duì)應(yīng)的是20Pin的JTAG接口。該窗口下的其他配置項(xiàng)保持默認(rèn),或根據(jù)實(shí)際情況進(jìn)行配置。接著打開④處的“Flash Download”選項(xiàng)卡,如下圖所示:
圖4.3.1.3 燒錄選項(xiàng)配置
如上圖所示,勾選①處的“Reset and Run”復(fù)選框,可以在燒錄完成后自動(dòng)完成復(fù)位并運(yùn)行程序,若不勾選,則需要手動(dòng)進(jìn)行復(fù)位,程序才能運(yùn)行。在②處可以選擇燒錄算法,程序代碼一般是燒錄到芯片內(nèi)部的Flash中的,在燒錄過程中,需要對(duì)芯片內(nèi)部的Flash進(jìn)行讀寫等操作,燒錄算法就是用來告訴MDK軟件,在燒錄程序的時(shí)候應(yīng)怎樣讀寫芯片內(nèi)部的Flash。燒錄算法一般有芯片廠商在芯片的設(shè)備包中提供,在安裝設(shè)備包時(shí),會(huì)一并安裝燒錄算法,在創(chuàng)建MDK工程時(shí)候,MDK會(huì)自動(dòng)選擇芯片對(duì)應(yīng)的燒錄算法,若②處沒有顯示燒錄算法,或燒錄算法不符合實(shí)際使用的芯片,則需點(diǎn)擊改窗口底部的“Add”按鈕,添加對(duì)應(yīng)的燒錄算法。至此,使用DAP燒錄程序的配置項(xiàng)均已配置完畢。
配置完成后,回到MDK軟件主界面對(duì)工程進(jìn)行編譯,編譯完成后,點(diǎn)擊按鈕(快捷鍵F8),隨后MDK會(huì)自動(dòng)將編譯好的程序通過仿真器燒錄到芯片上,同時(shí)會(huì)在“Build Output”窗口中提示燒錄信息,如下圖所示:
圖4.3.1.4 燒錄結(jié)果輸出信息
程序燒錄完成后,就能看到APM32E103最小系統(tǒng)板上的LED0和LED1閃爍。
4.3.2 使用DAP調(diào)試程序
本小節(jié)依然以第4.1小節(jié)中的跑馬燈實(shí)驗(yàn)例程為例,按照第4.3.1小節(jié)中的介紹配置好MDK軟件中仿真器相關(guān)的配置并成功編譯好程序后,點(diǎn)擊按鈕(快捷鍵Ctrl+F5)即可進(jìn)入調(diào)試界面,進(jìn)入調(diào)試界面前,若編譯好的程序還未進(jìn)行燒錄操作,MDK自會(huì)自動(dòng)進(jìn)行燒錄操作,然后進(jìn)入調(diào)試界面,調(diào)試界面如下圖所示:
圖4.3.2.1 MDK調(diào)試界面
上圖中各個(gè)窗口的作用如所示:
①:Registers窗口,該窗口顯示了Cortex-M3內(nèi)核寄存器R0~R15的值,并且還顯示了內(nèi)核當(dāng)前的模式(Handler模式或Thread模式)、當(dāng)前使用的堆棧指針(MSP或PSP)等等一系列信息。Registers窗口對(duì)查找Bug和掌握程序運(yùn)行窗臺(tái)有很大的幫助。
②:Disassembly窗口,該窗口顯示了反匯編代碼和C語言代碼的對(duì)比,包含了指令的保存地址、指令代碼和指令等一系列信息,并且窗口的左側(cè)有一個(gè)黃色的箭頭用于指示程序當(dāng)前將要執(zhí)行的位置。Disassembly窗口對(duì)查找Bug和優(yōu)化程序有很大的幫助。
③:文本窗口,該窗口主要用于展示代碼(C代碼或匯編代碼),窗口左側(cè)有一個(gè)青色和一個(gè)黃色的箭頭,其中青色箭頭用于指示當(dāng)前光標(biāo)所在的行,黃色箭頭用于指示程序當(dāng)前將要執(zhí)行的位置。
④:Call Stack + Locals窗口,該窗口用于顯示當(dāng)前函數(shù)的調(diào)用關(guān)系和函數(shù)局部變量的信息。該窗口在調(diào)試代碼的時(shí)候時(shí)非常有用的。
在調(diào)試界面中,還有一系列非常有用的工具,這些工具可通過Debug工具欄上的快捷按鈕進(jìn)行訪問,Debug工具欄,如下圖所示:
圖4.3.2.2 Debug工具欄
復(fù)位:其功能等同于硬件上按復(fù)位按鈕。按下該按鈕之后,代碼重新從頭開始執(zhí)行(跳轉(zhuǎn)到復(fù)位異常服務(wù)函數(shù))。
執(zhí)行到斷點(diǎn)處:該按鈕用來快速執(zhí)行到斷點(diǎn)處,有時(shí)候并不需要觀看每步是怎么執(zhí)行的,而是想快速的執(zhí)行到程序的某個(gè)地方看結(jié)果,這個(gè)按鈕就可以實(shí)現(xiàn)這樣的功能,但前提是在需要查看的地方設(shè)置了斷點(diǎn),否則程序?qū)⑷龠\(yùn)行。
停止運(yùn)行:該按鈕在程序執(zhí)行過程中變?yōu)橛行?,按下該按鈕,可以使程序停止運(yùn)行。
執(zhí)行進(jìn)去:該按鈕用于跳轉(zhuǎn)進(jìn)當(dāng)前將要執(zhí)行的函數(shù)中單步執(zhí)行。
執(zhí)行過去:該按鈕用于單步執(zhí)行過當(dāng)前將要執(zhí)行的函數(shù),而不跳轉(zhuǎn)進(jìn)函數(shù)里面。
執(zhí)行出去:該按鈕用于執(zhí)行出當(dāng)前函數(shù),跳轉(zhuǎn)到函數(shù)返回后的位置。
執(zhí)行到光標(biāo)處:該按鈕用于執(zhí)行到光標(biāo)所在的位置,相當(dāng)于在光標(biāo)處打了一個(gè)臨時(shí)的斷點(diǎn),當(dāng)然,如果在執(zhí)行到光標(biāo)處前遇到了斷點(diǎn),程序也是會(huì)停止運(yùn)行的。
Disassembly窗口:該按鈕用于打開或關(guān)閉Disassembly窗口。
Call Stack窗口:該按鈕用于打開或關(guān)閉Call Stack + Locals窗口。
Watch窗口:該按鈕用于打開或關(guān)閉Watch窗口,MDK提供了兩個(gè)Watch窗口,在調(diào)試界面,可以將想要觀察的變量或表達(dá)式添加到Watch窗口中,便可以實(shí)時(shí)地查看變量或表達(dá)式的值等信息。
Memory窗口:該按鈕用于打開或關(guān)閉Memory窗口,MDK提供了四個(gè)Memory窗口,在Memory窗口中可以查看一段指定起始地址內(nèi)存的值。
Serial窗口:該按鈕用于打開或關(guān)閉Serial窗口,MDK提供了四個(gè)Serial窗口,通過前三個(gè)Serial窗口可以查看MCU串口輸出的數(shù)據(jù),通過最后一個(gè)Serial窗口可以查看MDK提供的Event Recorder等工具標(biāo)準(zhǔn)輸出的數(shù)據(jù)。
系統(tǒng)分析窗口:該按鈕可以使用MDK提供的一些工具來查看系統(tǒng)運(yùn)行的狀態(tài),不過部分功能對(duì)仿真器有一定要求。
系統(tǒng)查看窗口:該按鈕可以用來查看MCU各個(gè)外設(shè)的寄存器值。
以上就介紹了Debug工具欄中比較常用的幾個(gè)快捷按鈕,這些快捷按鈕對(duì)調(diào)試程序是很有幫助的。接下來就實(shí)際地演示一下簡(jiǎn)單的調(diào)試。
首先打開Watch 1窗口,并雙擊“Enter expression”添加一個(gè)變量名為“g_fac_us”的表達(dá)式,該變量是在delay.c中定義的全局變量,主要用于微秒級(jí)延時(shí),此時(shí)可以看到這個(gè)變量的值顯示為“”,意思是無法計(jì)算,這時(shí)可以單擊main()函數(shù)中調(diào)用的delay_init()函數(shù)(第30行)左側(cè)灰色的部分來添加斷點(diǎn),如下圖所示:
圖4.3.2.3 添加觀察表達(dá)式和斷點(diǎn)
隨后點(diǎn)擊Debug工具欄中的按鈕(快捷鍵F5),即可運(yùn)行到delay_init()函數(shù)調(diào)用前(斷點(diǎn)處),然后點(diǎn)擊Debug工具欄中的按鈕(快捷鍵F11),即可跳轉(zhuǎn)到delay_init()函數(shù)中,如下圖所示:
圖4.3.2.4 執(zhí)行進(jìn)入delay_init()函數(shù)
因此函數(shù)delay_init()會(huì)對(duì)變量g_fac_us進(jìn)行初始化,因此可以看到Watch 1窗口中的表達(dá)式已經(jīng)顯示了具體的值,接下來可以連續(xù)單擊Debug工具欄上的按鈕(快捷鍵F10),讓程序單步執(zhí)行到變量g_fac_us被賦值的地方(大概第139行),此時(shí)再次單擊Debug工具欄上的按鈕,隨后便可在Watch 1窗口中看到變量g_fac_us被賦值后的結(jié)果,也可將鼠標(biāo)光標(biāo)放置在變量g_fac_us上停留一會(huì),MDK可會(huì)自動(dòng)的提示該變量當(dāng)前的值,如下圖所示:
圖4.3.2.5 觀察變量或表達(dá)式的值
接下來可以單擊Debug工具欄上的按鈕(快捷鍵Ctrl+F11),跳出delay_init()函數(shù)回到main()函數(shù),然后在main()函數(shù)中while循環(huán)的第一個(gè)“LED0(0)”語句前打上斷點(diǎn)單擊Debug工具欄上的按鈕,讓程序執(zhí)行到該斷點(diǎn)處,如下圖所示:
圖4.3.2.6 執(zhí)行到“LED0(0)”語句處
此時(shí),不斷點(diǎn)擊Debug工具欄上的按鈕,便可以看到板卡上的LED0和LED1依次閃爍(執(zhí)行到LED0()語句和LED1()語句時(shí),需多次單擊按鈕才能跳到下一行并看到對(duì)應(yīng)的板載LED狀態(tài)發(fā)生變化,這是因?yàn)長(zhǎng)ED0()語句和LED1()語句是兩個(gè)宏定義,這兩個(gè)宏定義由多條語句組成,因此需要多次單擊按鈕才能執(zhí)行到下一行)。
此時(shí),單擊“LED0(0)”語句前的斷點(diǎn),將其取消掉,然后點(diǎn)擊Debug工具欄上的按鈕,使程序全速執(zhí)行,則可以看到板載LED自動(dòng)地交替閃爍,隨后打開delay.c文件并定位到delay_us函數(shù)(大概221行),并在該函數(shù)左側(cè)任意有灰色的地方打上斷點(diǎn),可以看到程序馬上停在了斷點(diǎn)的位置,如下圖所示:
圖4.3.2.7 執(zhí)行進(jìn)入delay_us()函數(shù)
此時(shí),便可在Call Stack + Locals窗口查看到函數(shù)的調(diào)用情況,如下圖所示:
圖4.3.2.8 Call Stack + Locals窗口
如上圖所示,可以很清楚地查看到delay_us()函數(shù)是如何被調(diào)用的,從下往上看,main()函數(shù)調(diào)用了delay_ms()函數(shù),然后delay_ms()函數(shù)調(diào)用了delay_us()函數(shù)。
以上就是使用DAP調(diào)試程序的全部?jī)?nèi)容,這方便的內(nèi)容也是比較重要的,掌握好調(diào)試程序的方法,對(duì)解決程序Bug是很有幫助的,并且對(duì)了解第三方庫(kù)等的代碼也很有幫助。
4.4 MDK使用技巧
本小節(jié)將介紹MDK的一些使用技巧,這些技巧對(duì)提供開發(fā)效率是很有幫助的,讀者可以實(shí)際操作一下,加深印象。
4.4.1 自定義編輯器
點(diǎn)擊MDK軟件頂部的按鈕,打開MDK配置窗口,并切換到頂部的Editor選項(xiàng)卡,如下圖所示:
圖4.1.1.1 Editor選項(xiàng)卡配置
①:“Encoding”用于設(shè)置在MDK中新建文件保存時(shí)使用的編碼格式,推薦使用“Chinese GB2312(Simplified)”,該編碼格式對(duì)中文的支持比較好。
②:勾選“View White Space”復(fù)選框可以在文本編輯器中以一個(gè)淺灰色的“·”代替一個(gè)空格進(jìn)行顯示,有助于代碼對(duì)齊。
③:勾選“Insert spaces for tabs”復(fù)選框可以設(shè)置在文本編輯器輸入時(shí),使用空格來代替TAB,TAB鍵常用于代碼對(duì)齊,但由于不同的文本編輯器對(duì)TAB長(zhǎng)度的定義各不相同,因此使用TAB對(duì)齊可能在不同的文本編輯器中會(huì)出現(xiàn)不對(duì)其的情況,因此可以使用空格來代替TAB,以解決這個(gè)問題,同時(shí)可以設(shè)置使用多少個(gè)空格來代替一個(gè)TAB,正點(diǎn)原子的編寫代碼均是以四個(gè)空格代替一個(gè)TAB,建議讀者進(jìn)行相同的設(shè)置。
接著是Colors & Fonts選項(xiàng)卡,如下圖所示:
圖4.1.1.2 Colors & Fonts選項(xiàng)卡配置
①:“Window”窗口用于選擇要修改的窗口對(duì)象,例如要修改的對(duì)象為C/C++文本編輯器窗口,則選擇“C/C++ Editor files”。
②:“Element”窗口用于選擇窗口對(duì)象中要修改的元素,例如要修改的對(duì)象為C/C++文本編輯器窗口中的文本,則選擇“Text”。
③:“Font”和“Colors”用于修改被選中窗口對(duì)象中元素的字體、字號(hào)、樣式、前景色和背景色等參數(shù),讀者可以根據(jù)自己的喜好進(jìn)行修改。
接著是User Keywrds選項(xiàng)卡,如下圖所示:
圖4.1.1.3 User Keywords選項(xiàng)卡配置
該選項(xiàng)卡用于添加一些自定義的關(guān)鍵字,例如,在C語言中大約有37個(gè)關(guān)鍵字(C99標(biāo)準(zhǔn)),MDK在C/C++文本編輯器可以高亮顯示這些關(guān)鍵字(可以在Colors & Fonts選項(xiàng)卡C/C++ Editor filesKeyword中進(jìn)行自定義高亮的顏色),讓用戶更容易地閱讀代碼,但是在代碼中用typedef定義的變量類型名稱或struct定義的結(jié)構(gòu)體名稱等,MDK默認(rèn)并不會(huì)高亮顯示這些用戶自定義的“關(guān)鍵字”,因此可以在User Keyword選項(xiàng)卡中添加自定義的“關(guān)鍵字”,如上圖所示,就添加了三個(gè)自定義的關(guān)鍵字,以上文提到的delay_init()函數(shù)為例,該函數(shù)如使用到上述被添加的三個(gè)關(guān)鍵字,則都會(huì)被高亮,如下圖所示:
圖4.1.1.4 自定義關(guān)鍵字效果
4.4.2 動(dòng)態(tài)語法檢測(cè)&代碼自動(dòng)補(bǔ)全
在Configuration窗口的Text Completion選項(xiàng)卡中可以配置動(dòng)態(tài)語法檢測(cè)和代碼自動(dòng)補(bǔ)全功能,如下圖所示:
圖4.4.2.1 Text Completion選項(xiàng)卡配置
①:用于使能代碼自動(dòng)補(bǔ)全功能,并可以配置在手動(dòng)輸入多少個(gè)字符后提示匹配自動(dòng)補(bǔ)全的內(nèi)容,實(shí)際的使用效果,如下圖所示:
圖4.4.2.2 代碼自動(dòng)補(bǔ)全功能
②:用于使能動(dòng)態(tài)語法檢測(cè),這可以幫助用戶在編寫代碼時(shí),實(shí)時(shí)地觀察代碼語法的問題,實(shí)際的使用效果,如下圖所示:
圖4.4.2.3 動(dòng)態(tài)語法檢測(cè)功能
如上圖所示,動(dòng)態(tài)語法檢測(cè)功能可以對(duì)編寫的代碼進(jìn)行提示,沒有語法錯(cuò)誤的代碼則不會(huì)有任何提示,若語法有誤,則會(huì)有警告()和錯(cuò)誤()兩種提示,如第33行有警告提示,是因?yàn)閐elay_ms()函數(shù)的形參是16位無符號(hào)整型,但實(shí)際傳入的參數(shù)已經(jīng)超出了16位無符號(hào)整型的范圍,因此給出了警告的提示,警告并不會(huì)導(dǎo)致編譯出錯(cuò),但是在程序?qū)嶋H運(yùn)行過程中可能會(huì)有意料之外的結(jié)果;再如第34行有錯(cuò)誤提示,是因?yàn)閐elay_ms()函數(shù)調(diào)用后面少了一個(gè)分號(hào)(“;”),錯(cuò)誤提示會(huì)直接到時(shí)程序編譯失敗。
4.4.3 代碼編輯技巧
本小節(jié)介紹幾個(gè)常用的MDK代碼編輯技巧,希望對(duì)讀者提高M(jìn)DK代碼編輯效率有所幫助。
- TAB鍵的妙用
在前面的章節(jié)中也提到了可以使用TAB鍵來進(jìn)行代碼對(duì)齊,那具體的使用方法呢?按下TAB鍵可以使被選中的代碼段或光標(biāo)后的代碼向右側(cè)對(duì)齊,同時(shí)也可以按下Shift+TAB鍵使被選中的代碼段或光標(biāo)后的代碼向左側(cè)對(duì)齊,如下圖所示:
圖4.4.3.1 未對(duì)齊的代碼
如上圖所示,未對(duì)齊的代碼一看就令人頭大,若在每一行需要對(duì)齊的代碼前手動(dòng)敲入多個(gè)空格,那效率是非常低的,此時(shí)可以多行選中需要對(duì)齊的代碼段,然后按以下TAB鍵,即可使被選中的代碼段向右對(duì)齊,如下圖所示:
圖4.4.3.2 用TAB鍵進(jìn)行對(duì)齊
接著對(duì)于while語句塊中的代碼再進(jìn)行一次TAB鍵對(duì)齊,最終對(duì)齊效果,如下圖所示:
圖4.4.3.3 使用TAB鍵的最終對(duì)齊效果
2. 快速定位函數(shù)/變量被定義的地方
在編寫或調(diào)試代碼的時(shí)候,經(jīng)常會(huì)需要查看函數(shù)或變量的定義,如果每個(gè)都手動(dòng)查找,那效率就太低了,MDK軟件提供了一鍵跳轉(zhuǎn)到函數(shù)或變量定義地方的功能,但該功能是可選的,需要開啟該功能后才能使用,開啟方式也很簡(jiǎn)單,在Options for Target窗口的Output選項(xiàng)卡中勾選Browse Information復(fù)選框即可開啟該功能,如下圖所示:
圖4.4.3.4 開啟Browse Information功能
開啟Browse Information功能后,還需進(jìn)行一次編譯才能使用跳轉(zhuǎn)功能,使用方式也很簡(jiǎn)單,僅需單擊或自定義選中函數(shù)或變量名,然后點(diǎn)擊快捷鍵F12即可進(jìn)行跳轉(zhuǎn),在查看完相關(guān)定義后,可以直接點(diǎn)擊工具欄上的按鈕(快捷鍵Ctrl±),即可一步一步地返回。
3. 快速注釋/取消注釋
MDK提供了一鍵注釋或取消注釋代碼段的功能,使用方法也很簡(jiǎn)單,若要注釋或取消一段代碼,則先選中代碼段,然后點(diǎn)擊工具欄上的(注釋)或(取消注釋),即可一鍵對(duì)代碼段進(jìn)行注釋或取消注釋。
4.4.4 其他小技巧
本小節(jié)再介紹幾個(gè)MDK軟件使用的小技巧。
①:右鍵#include包含的頭文件,彈出的菜單中有“Open document “xxx””的選項(xiàng),可以快速地在文本編輯器中打開頭文件,如下圖所示:
圖4.4.4.1 快速打開頭文件
②:“Ctrl+H”、“Ctrl+F”和“Ctrl+Shift+F”的組合快捷鍵可一鍵打開替換、查找和跨文件查找的功能窗口,如下圖所示:文章來源:http://www.zghlxwxcb.cn/news/detail-831609.html
圖4.4.4.2 替換、查找和跨文件查找的功能窗口
MDK軟件是一個(gè)非常強(qiáng)大的代碼編輯和編輯工具,熟悉MDK的使用方法還是很有必要的。文章來源地址http://www.zghlxwxcb.cn/news/detail-831609.html
到了這里,關(guān)于【正點(diǎn)原子STM32連載】第四章 APM32初體驗(yàn) 摘自【正點(diǎn)原子】APM32E103最小系統(tǒng)板使用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!