在嵌入式專案中,uart介面的使用頻率很高,多種模組(2g通訊模組、藍芽模組,等等)都會通過uart介面與主控mcu相連。本文將梳理uart介面除錯流程,為除錯工作提供參考,解決除錯過程中可能遇到的問題,快速完成uart介面除錯,實現模組功能。
首先檢視原理圖確認串口號,比如uart1,同時檢視該串列埠引腳是否有復用功能,比如用作sd卡介面。如果有復用,需要在核心配置中取消復用功能的選項。然後選中串列埠功能,大致的路徑為
device drivers > character devices > serial drivers不同廠家提供的bsp有細微差別,具體路徑視情況而定。在核心根目錄輸入make menuconfig開啟核心配置介面,選中uart1。以nuc970 為例,配置如下:
編譯執行核心,如果uart1驅動載入成功會在/dev目錄下產生相應uart裝置節點。以高通mdm9x07為例:
系統啟動之後在/dev下有兩個ttyhsl裝置節點:ttyhsl0、ttyhsl1。
$ cat /proc/tty/driver/msm_serial_hsl輸入該命令可以顯示裝置節點詳細資訊,其中通過位址(0x078b3000)與data sheet對比即可確認uart1對應的裝置節點為/dev/ttyhsl1。
同時通過who命令可檢視當前終端tty資訊。
$ who發現/dev/ttyhsl0為除錯串列埠。root ttyhsl0 00:00 jan 6 00:02:00
如果uart裝置節點未產生,可在其相應驅動程式xx_probe函式中新增列印,檢視xx_probe函式是否被呼叫,進一步查詢原因。
如果成功產生了uart裝置節點,可通過軟體回環測試確認uart驅動程式功能是否正常。測試步驟:
進入loopback檔案所在目錄:
$ cd /sys/kernel/debug/msm_serial_hsl將loopback.1值設定為1,開啟uart1回環測試。
$ echo 1 > loopback.1回環測試程式**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int set_opt(int fd,int nspeed, int nbits, char nevent, int nstop)
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= clocal | cread;
newtio.c_cflag &= ~csize;
switch( nbits )
switch( nevent )
switch( nspeed )
if( nstop == 1)else
if ( nstop == 2 )
newtio.c_cc[vtime] = 0;
newtio.c_cc[vmin] = 0;
tcflush(fd,tciflush);
if((tcsetattr(fd,tcsanow,&newtio))!=0)
return0;}
int main(int argc,char *argv)
printf("open %s successfully!\n",tty);
ret_set = set_opt(fd, atoi(argv[2]), 8, 'n', 1);
if (ret_set == -1)
printf("set %s successfully!\n",tty);
printf("baud rate: %s\n",argv[2]);
printf("data: %s\n",argv[3]);
while (1)
else
ret_read = read(fd, buf_read, 100);
if(ret_read > 0)
sleep(3);
}close(fd);
}else
return
0;}
交叉編譯得到執行檔案uart:
$ arm-linux-gcc -g uart.c -o uart執行uart進行回環測試:
可以看到uart1成功收到了傳送的 hello字元。
軟體回環測試通過之後,將uart1的rx、tx管腳短接,關閉軟體回環,使用uart程式進行自收發測試。
關閉軟體回環:
$ echo 0 > loopback.1此時有可能出現的問題是tx管腳無訊號輸出,確認硬體線路無誤後最可能的原因是tx管腳被其他功能占用。
如果管腳訊號測試通過,則串列埠功能基本除錯成功。此方法的優點是無需上位機串列埠助手的配合,在串列埠模組到位之前提前完成介面除錯工作。
GDB除錯技巧,除錯命令
除錯時檢視依賴dsopidof tvm rpc server cat proc maps子程序除錯 1.vscode setupcommands output cpu simu dev bin ld library path ignorefailures false exec catch throw...
GDB除錯技巧
在公司工作了一段時間,發現 b s結構的 除錯很麻煩,經常用的手段是通過 printf 打一串訊息來進行跟蹤,然後估計問題出在 通過逐步新增 printf 語句,獲得越來越多的資訊最終確定問題的根源。我感覺這樣比較麻煩,如果能把 gdb的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...
xcode除錯技巧
有時程式崩潰根本不知錯誤發生在什麼地方。比如程式出現exec bad access的時候,雖然大部分情況使用設定nszombieenabled環境變數可以幫助你找到問題的所在,但少數情況下,即使設定了nszombieenabled環境變數,還是不知道程式崩潰在什麼地方。那麼就需要使用下列 進行幫助了...