一、Printf簡介
Printf是一個標準的C庫API,用來打印信息顯示的。Printf的底層輸出調用,在windows環境下是fputc函數,在GNUC環境下是__io_putchar函數。Printf主要做兩件事:第一件是將參數字符串以及可變參數進行解析,格式化成 一串字符串。第二件事就是將格式化的字符串一個字節一個字節的輸出出去(至于以什么樣的方式輸出那就得看底層的實現了,比如有OS的情況下就是輸出在命令行下的)。
二、Printf和串口
在嵌入式設備中一般有兩種調試方法,一種是硬件調試無需軟件干預(利用廠商提供的仿真器和應用軟件),另一種是軟件調試(利用串口發送調試)。一般在系統初始階段串口無法使用的情況下都是用的硬件進行調試但是這種方式不太靈活,限制很多,能用軟件調試盡量都用軟件,這種方式比較靈活。
串口設備本身只能將我們寫入數據寄存器的數據發送出來,無法支持更多的功能。比如將存放十進制的數據的變量轉換成字符形式再發出去,這樣我們人才識別。而標準庫的printf就是實現了這些功能。
printf的第一件事主要是軟件實現,這個已經由C標準實現了我們不用管;而第二件事就是將printf格式化好的字符串輸出到那個設備。所以我們只需要將fputc或者__io_putchar函數實現為串口的發送,然后通過USB轉串口硬件發送到上位機上,上位機再通過串口助手程序顯示出來。代碼如下:
除此之外,我們還要再做一點配置工作—禁用半主機模式,禁用了半主機模式才能使用標準庫函數printf()打印信息到串口,在程序中加入以下代碼即可。
那么什么是半主機模式?為什么不用它?半主機模式是ARM單片機的一種調試機制,跟串口調試不一樣的是,它需要通過仿真器來連接電腦和ARM單片機,并調用相應的指令來實現單片機向電腦顯示器打印信息(或者從電腦鍵盤讀取輸入)。簡而言之,這種方法比串口調試更復雜(需要進行更多的配置操作),也更不靈活(一定要用仿真器)。
上面的配置似乎有點麻煩,要加入這么一堆難懂的代碼,難道沒有更簡便點的方法嗎?有,但不推薦。
方法是使用微庫(MicroLIB),只要在Keil的“Options for Target -> Target ->Use MicroLIB”上打勾,即可使用串口打印(fputc()函數還是要實現,但上述的禁用半主機代碼不用加)。
微庫是區別于C標準庫的另一個庫,當使用微庫時,就默認關閉了半主機模式,也就不用添加上面的代碼。這樣雖然方便,但個人建議能不用就不用,原因:
第一,微庫是為小內存嵌入式設備而設計的,使用它可以減少代碼所占空間,但對現在STM32等單片機來說,內存一般都夠用,微庫并非必需。
第二,微庫相對于C標準庫而言,支持的功能更少,主要體現在對操作系統的支持上。總的來說,標準的東西總是相對更可靠,所以為了不必要的掉坑,還是用C標準庫,不用微庫。
-
STM32
+關注
關注
2289文章
11011瀏覽量
362353 -
函數
+關注
關注
3文章
4369瀏覽量
64187
發布評論請先 登錄
疑難雜癥,求高手解決
解決射頻電路的疑難雜癥的方法分享
飛控疑難雜癥解決方法匯總
DC/DC電源輸入輸出要隔離嗎
減少DC-DC輸出端紋波的方法
電源平面是否可以作為RF信號
3D打印康復輔具 為疑難雜癥的治療帶來新的可能
在vscode上用gcc征服debug過程中遇到的各種疑難雜癥
RF射頻信號,高速信號能將電源平面作為參考平面嗎?

DC/DC電源輸入輸出要隔離還是要保證短距離回路?

如何減少DC-DC輸出端的紋波?

評論