三分鐘學(xué)會(huì)國(guó)產(chǎn)低功耗華大單片機(jī)四(多種調(diào)試方法及printf輸出)
工程師做單片機(jī)軟件開(kāi)發(fā)的時(shí)候必然要對(duì)所寫的軟件進(jìn)行驗(yàn)證。其實(shí)就是我們讓寫的程序跑起來(lái)通過(guò)一定的手段來(lái)觀察MCU的CPU與寄存器是否與我們的理論值相同的操作。通常采用的手段有如下幾種:
- 仿真器(如J-link等)仿真;
- IO口指示;
- 液晶屏信息輸出;
- 串口輸出。
以上幾種方法中方法1仿真器仿真最直接,在仿真環(huán)境中可以清楚明確的看到自己想要的信息。但也有其局限性,如產(chǎn)品把芯片的引腳全部占滿在調(diào)試最后的功能時(shí)正好用到了仿真的引腳;有些芯片進(jìn)入低功耗模式為了降低功耗會(huì)關(guān)掉仿真接口等等。方法2最容易實(shí)現(xiàn),只需在調(diào)試的時(shí)候使用MCU某一引腳為輸出,程序中讀取想要的內(nèi)容做判斷后在這個(gè)引腳輸出即可。我們可以用示波器量這個(gè)引腳的電平,或直接接個(gè)指示燈來(lái)觀察就可以。方法3的使用比較受限,比較適合有LCD顯示的產(chǎn)品。方法4串口輸出的方法是我們今天的重點(diǎn)。
就像前面所說(shuō)的當(dāng)仿真接口不方便的時(shí)候可以用串口來(lái)調(diào)試,那有沒(méi)有什么情況下串口調(diào)試效率會(huì)比仿真器高呢?答案是肯定的。舉個(gè)例子,做平衡系統(tǒng)時(shí)調(diào)節(jié)PID參數(shù),我們是會(huì)選擇 修改參數(shù)–>編譯–>燒錄–>運(yùn)行–>修改…,還是做一個(gè)功能可以一邊運(yùn)行一邊修改參數(shù)呢?顯然一邊運(yùn)行一邊修改效率會(huì)高很多,而通常的仿真器仿真時(shí)都要設(shè)置斷點(diǎn)來(lái)觀察值,如果要修改參數(shù),則要重新編譯–>燒錄–>運(yùn)行,想要邊運(yùn)行邊修改很難,F(xiàn)在的應(yīng)用開(kāi)發(fā)都講究交互試設(shè)計(jì),我們?cè)谡{(diào)試程序的時(shí)候是否也可以呢?還用上面的例子,我們可以加下兩個(gè)按鍵分別定義為“加”和“減”用來(lái)修改參數(shù),當(dāng)然不要這兩個(gè)按鍵也是可以的,只要把參數(shù)按一定的規(guī)律做變化就可以,參數(shù)和運(yùn)行的結(jié)果都通過(guò)串口輸出,這樣我們就可以很直觀的看到哪組參數(shù)是合適的。
用串口輸出就要編寫串口代碼,大家知道如果用串口輸出的數(shù)據(jù)比較容易,但是不是很直觀,有沒(méi)有什么方法可以像我們學(xué)C語(yǔ)言時(shí)候直接用printf()。來(lái)輸出我們想要的內(nèi)容呢?這是個(gè)非常好的問(wèn)題,華大單片機(jī)實(shí)現(xiàn)起來(lái)十分簡(jiǎn)單,F(xiàn)在就以國(guó)產(chǎn)超低功耗華大單片機(jī)HC32F003為例向大家介紹如何來(lái)實(shí)現(xiàn)printf()的輸出。
還是用之前建立好的空工程,閑話少說(shuō)直接上代碼。
#define DEBUG #include "gpio.h"int main(){ Clk_SetPeripheralGate(ClkPeripheralUart0, TRUE); //開(kāi)UART0外設(shè)時(shí)鐘 Clk_SetPeripheralGate(ClkPeripheralBt, TRUE); //開(kāi)定時(shí)器外設(shè)時(shí)鐘 Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //開(kāi)GPIO外設(shè)時(shí)鐘#ifdef DEBUG Debug_UartInit(); //調(diào)試串口初始化#endif #ifdef DEBUG printf("This is a UART Test!"); //輸出調(diào)試內(nèi)容#endif while(1) { ; }}
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
本文旨在拋磚引玉,其余具體使用歡迎加群164973950交流。
?國(guó)產(chǎn)低功耗華大單片機(jī)主力型號(hào)如下:
HC32F003 HC32F005 HC32L110 HC32F030 HC32L136 HC32M140 HC32F146 HC32L150 HC32L156
芯片相關(guān)資料下載鏈接:https://blog.csdn.net/lvk/article/details/85260690
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
代碼很簡(jiǎn)單先打開(kāi)UART0,定時(shí)器,GPIO的外設(shè)時(shí)鐘,因?yàn)槲覀兪褂么谶@三個(gè)外設(shè)是必須用到的。
第二部分如果定義了DEBUG則對(duì)調(diào)試串口進(jìn)行初始化。初始化在ddl.c文件中完成。
可以看到串口用到了芯片的P35為TX引腳,特率為19200bps。
如果定義了DEBUG則輸出This is a UART Test!(這里的內(nèi)容根據(jù)實(shí)際需要自己來(lái)定義。)
通過(guò)USB轉(zhuǎn)TTL我們可以把數(shù)據(jù)傳到電腦上,在電腦中我們打開(kāi)串口調(diào)試工具可以看到程序跑起來(lái)后我們收到的數(shù)據(jù)與理論值相同。如下圖所示:
我們?cè)陂_(kāi)發(fā)的時(shí)候只要在我們想要觀察結(jié)果的位置加上以下語(yǔ)句就可以
#ifdef DEBUG printf(); ????????????????????????????//輸出調(diào)試內(nèi)容#endif
當(dāng)程序全部OK以后這部分語(yǔ)句也可以不進(jìn)行刪除,只要把程序最開(kāi)始的
#define DEBUG 語(yǔ)句注釋掉,程序中所有的調(diào)試語(yǔ)句都不參考最終程序的編譯,減小程序空間并提高程序運(yùn)行效率。
其實(shí)在程序的開(kāi)發(fā)過(guò)程中各種調(diào)試方法都有自己各自己的優(yōu)缺點(diǎn),要根據(jù)實(shí)際的情況綜合運(yùn)用最合適的調(diào)試方法,才能讓保證開(kāi)發(fā)最高效的進(jìn)行。 ???

編輯:admin 最后修改時(shí)間:2020-06-08