寫嵌入式代碼只是第一步,調(diào)試才是決定項(xiàng)目能不能順利推進(jìn)的關(guān)鍵。
MCU 不跑?外設(shè)不響應(yīng)?代碼跑飛?
沒(méi)有合適的調(diào)試手段,排查問(wèn)題就像摸黑找路。
本文帶你搞懂三大調(diào)試?yán)?——JTAG、SWD、串口打印。不僅對(duì)比優(yōu)缺點(diǎn),還提供實(shí)戰(zhàn)操作步驟 + 代碼示例,讓你學(xué)完就能上手。
一、JTAG —— 復(fù)雜系統(tǒng)的“放大鏡”
原理與特點(diǎn)
- 接口:4~5 根信號(hào)線(TDI、TDO、TCK、TMS,可選 TRST)
- 功能:?jiǎn)尾竭\(yùn)行、斷點(diǎn)、寄存器查看、內(nèi)存讀寫
- 應(yīng)用:Cortex-A、FPGA、復(fù)雜 SoC
Keil/MDK 操作步驟
- 接入 J-Link / ULINK 調(diào)試器
- 打開(kāi)Project → Options → Debug,選擇JTAG 調(diào)試
- 編譯工程,點(diǎn)擊Download燒寫固件
- 按F5進(jìn)入調(diào)試,支持:
- 單步運(yùn)行(F10/F11)
- 查看寄存器
- 內(nèi)存監(jiān)視
OpenOCD 命令行示例
- openocd-f interface/jlink.cfg-f target/stm32f4x.cfg
進(jìn)入 GDB 調(diào)試:
- arm-none-eabi-gdb build/firmware.elf
- (gdb)target remote localhost:3333
- (gdb)monitor reset halt
- (gdb)load
- (gdb)continue
小貼士:JTAG 引腳多,布線復(fù)雜,注意避免長(zhǎng)線和交叉走線導(dǎo)致信號(hào)干擾。
二、SWD —— MCU 調(diào)試的首選
原理與特點(diǎn)
- 接口:2 根線(SWDIO、SWCLK)
- 功能:斷點(diǎn)、寄存器訪問(wèn)、內(nèi)存修改
- 應(yīng)用:STM32、NXP、Nordic 等 Cortex-M
Keil/MDK 操作步驟
- 接入 ST-LINK
- Project → Options → Debug → ST-Link Debugger
- Utilities → 選擇Use ST-LINK作為編程器
- 按F5進(jìn)入調(diào)試,支持?jǐn)帱c(diǎn)、變量觀察
代碼斷點(diǎn)示例
- intmain(void){
- HAL_Init();
- MX_GPIO_Init();
- intcounter=0;
- while(1){
- counter++;// 在這里設(shè)置斷點(diǎn),調(diào)試時(shí)觀察 counter 值變化
- }
- }
小貼士:用 SWD 調(diào)試時(shí),可以結(jié)合ITM/SWO 輸出,打印實(shí)時(shí)日志而不占用 UART。
三、串口打印 —— 最接地氣的調(diào)試方式
原理與特點(diǎn)
- UART 將變量、狀態(tài)輸出到上位機(jī)
- 本質(zhì):調(diào)試日志(printf 調(diào)試)
- 應(yīng)用:邏輯驗(yàn)證、狀態(tài)監(jiān)控、無(wú)調(diào)試器場(chǎng)景
實(shí)現(xiàn)步驟
- MCU 初始化 UART(波特率 115200 常見(jiàn))
- 在fputc重定向printf
- 打開(kāi)串口調(diào)試助手(SSC/Putty/Termite),選擇對(duì)應(yīng) COM 口
- 查看輸出調(diào)試日志
代碼示例
- #include"stdio.h"
- intfputc(intch,FILE*f){
- HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY);
- returnch;
- }
- intmain(void){
- HAL_Init();
- MX_USART1_UART_Init();
- intvalue=42;
- printf("Debug: value = %d\r\n",value);
- while(1){
- HAL_Delay(1000);
- printf("Loop running...\r\n");// 在串口助手中觀察輸出
- }
- }
小貼士:打印過(guò)多可能改變程序時(shí)序(海森堡效應(yīng)),建議只保留關(guān)鍵日志。
四、三者對(duì)比表
| 調(diào)試方式 | 接口線數(shù) | 功能范圍 | 優(yōu)點(diǎn) | 缺點(diǎn) | 典型應(yīng)用 |
|---|---|---|---|---|---|
| JTAG | 4~5 根 | 全面(斷點(diǎn)、寄存器、內(nèi)存) | 功能齊全,標(biāo)準(zhǔn)化 | 引腳多,速度一般 | SoC、FPGA 調(diào)試 |
| SWD | 2 根 | MCU 調(diào)試 | 引腳少,速度快 | 僅限 Cortex-M | STM32、Cortex-M |
| 串口打印 | 2 根 | 程序流程、變量輸出 | 簡(jiǎn)單直觀 | 占資源,功能有限 | 基礎(chǔ)邏輯調(diào)試 |
五、如何選擇?
- 開(kāi)發(fā)初期邏輯驗(yàn)證→ 串口打印
- 常規(guī) MCU 調(diào)試→ SWD
- 復(fù)雜系統(tǒng)/SoC/FPGA→ JTAG
最佳實(shí)踐:組合使用
- SWD 斷點(diǎn)調(diào)試
- 串口打印關(guān)鍵日志
- JTAG 處理復(fù)雜系統(tǒng)問(wèn)題
總結(jié)
- JTAG功能最全,適合復(fù)雜系統(tǒng)
- SWD精簡(jiǎn)高效,MCU 調(diào)試首選
- 串口打印簡(jiǎn)單直接,快速驗(yàn)證邏輯
熟練掌握并靈活組合三者,能讓你的調(diào)試效率飛躍提升,少走彎路。
-
JTAG
+關(guān)注
關(guān)注
6文章
415瀏覽量
74951 -
嵌入式開(kāi)發(fā)
+關(guān)注
關(guān)注
18文章
1145瀏覽量
50110 -
SWD
+關(guān)注
關(guān)注
1文章
60瀏覽量
12644 -
串口打印
+關(guān)注
關(guān)注
0文章
11瀏覽量
3339
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式開(kāi)發(fā)調(diào)試經(jīng)驗(yàn)分享
嵌入式開(kāi)發(fā)putty串口打印亂碼編碼格式問(wèn)題
基于ARM的嵌入式開(kāi)發(fā)
嵌入式開(kāi)發(fā)
嵌入式軟件的打印調(diào)試信息的方法
嵌入式開(kāi)發(fā)的產(chǎn)品有哪些_嵌入式開(kāi)發(fā)的流程
下載調(diào)試接口SWD和JTAG的區(qū)別
嵌入式開(kāi)發(fā)(一):嵌入式開(kāi)發(fā)新手入門
嵌入式開(kāi)發(fā)資料免費(fèi)分享
嵌入式開(kāi)發(fā)過(guò)程中的一點(diǎn)調(diào)試經(jīng)驗(yàn)
嵌入式開(kāi)發(fā)putty串口打印亂碼
嵌入式開(kāi)發(fā)(一):嵌入式開(kāi)發(fā)新手入門(轉(zhuǎn)載后續(xù)需要修改補(bǔ)充)
嵌入式開(kāi)發(fā)調(diào)試神器全解析:JTAG、SWD、串口打印
評(píng)論