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