串口是MCU最重要的一個通信端口,幾乎所有的嵌入式產(chǎn)品都會用到串口,可能是產(chǎn)品預(yù)研的時候用來調(diào)試,可能是與某一個外設(shè)連接收發(fā)數(shù)據(jù),還可能用來對產(chǎn)品進(jìn)行固件升級。這篇文章主要給大家介紹一下如何用串口進(jì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),設(shè)置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ā)送是否完成標(biāo)志,否則發(fā)的太快會導(dǎo)致前面的數(shù)據(jù)還沒發(fā)完,后邊的數(shù)據(jù)又來了,后邊的覆蓋掉前面的,導(dǎo)致發(fā)送錯誤。
到此,就可以盡情使用printf調(diào)試了。
-
mcu
+關(guān)注
關(guān)注
146文章
16667瀏覽量
347764 -
時鐘
+關(guān)注
關(guān)注
10文章
1673瀏覽量
130955 -
調(diào)試
+關(guān)注
關(guān)注
7文章
551瀏覽量
33762 -
串口
+關(guān)注
關(guān)注
14文章
1533瀏覽量
75455 -
GPIO
+關(guān)注
關(guān)注
16文章
1175瀏覽量
51513
發(fā)布評論請先 登錄
相關(guān)推薦
評論