串口是MCU最重要的一個通信端口,幾乎所有的嵌入式產(chǎn)品都會用到串口,可能是產(chǎn)品預研的時候用來調(diào)試,可能是與某一個外設連接收發(fā)數(shù)據(jù),還可能用來對產(chǎn)品進行固件升級。這篇文章主要給大家介紹一下如何用串口進行調(diào)試,也就是打印log。
打印log最常用的方法是printf,所以要解決的問題是將printf的輸出重定向到串口,然后通過串口將數(shù)據(jù)發(fā)送出去。
首先要配置串口,串口的配置包括:
1、 開啟串口和GPIO時鐘
2、 GPIO引腳模式配置
3、 串口波特率、數(shù)據(jù)位、停止位、校驗位的配置
4、 使能串口
代碼如下(使用stm32 LL庫):
此時,已經(jīng)可以通過串口來收發(fā)數(shù)據(jù)了,但是只能通過庫函數(shù)一個一個從數(shù)據(jù)寄存器讀寫單個字符,非常的不方便。
下面說一下如何重定向printf。這里我在Ubuntu下用make編譯源碼,所以重定向的方式與用keil有所區(qū)別。
首先要在源碼文件開頭包含頭文件#include ,然后在串口初始化時調(diào)用setvbuf(stdout, NULL, _IONBF, 0),設置buffer緩存為0,這樣一有數(shù)據(jù)就發(fā)送,不然會等到緩存滿或有回車換行符才發(fā)送。如果沒有這句,你的printf又沒n,log就會打不出來。
接下來是重定向的代碼
這里有兩個地方需要注意,第一,用gcc編譯需要加_write()函數(shù),然后在函數(shù)內(nèi)部調(diào)用__io_putchar()函數(shù)將字符串一個一個發(fā)送出去。第二,使用LL庫發(fā)送數(shù)據(jù),要查看發(fā)送寄存器是否為空或者發(fā)送是否完成標志,否則發(fā)的太快會導致前面的數(shù)據(jù)還沒發(fā)完,后邊的數(shù)據(jù)又來了,后邊的覆蓋掉前面的,導致發(fā)送錯誤。
到此,就可以盡情使用printf調(diào)試了。
-
mcu
+關注
關注
146文章
17963瀏覽量
366343 -
時鐘
+關注
關注
11文章
1897瀏覽量
133181 -
調(diào)試
+關注
關注
7文章
612瀏覽量
34694 -
串口
+關注
關注
15文章
1588瀏覽量
79870 -
GPIO
+關注
關注
16文章
1280瀏覽量
54030
發(fā)布評論請先 登錄
如何用ESP32簡單進行藍牙串口調(diào)試!
如何對USB轉(zhuǎn)串口模塊進行調(diào)試
串口調(diào)試軟件下載

串口調(diào)試助手怎么用_串口調(diào)試助手使用方法

如何進行單片機的串口調(diào)試詳細實例說明

評論