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

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

如何進(jìn)行單片機(jī)的串口調(diào)試詳細(xì)實(shí)例說(shuō)明

評(píng)論