本文章 來自原創專欄《ESP32教學專欄 (基于ESP-IDF)》,講解如何使用 ESP-IDF 構建 ESP32 程式,發布文章并會持續為已發布文章添加新內容! 每篇文章都經過了精打細磨!
↓↓↓通過下方對話框進入專欄主頁↓↓↓
CSDN 請求進入專欄 _ O x
是否進入ESP32教學專欄(基于ESP-IDF)?
確定
文章目錄
- 一、JTAG 除錯簡介
- 二、準備階段
- 1. Windows
- 2. Linux
- 3. 錯誤排除
- 三、使用 Clion 進行 JTAG 除錯
- 1. 使用 JTAG 介面進行除錯
- (1) 添加配置
- (2) 配置 GDB 服務器實參
- 2. 使用 JTAG 介面燒錄程式
- 四、使用命令列進行除錯
一、JTAG 除錯簡介

先看一張效果圖,Clion成功為ESP32程式打上了斷點,而且能觀測變數值,并能對其修改!
JATG 是一種可用于在線除錯單片機運行狀態和資源的介面,相對于常用的idf.py monitor來說,JTAG 除錯是一種在線除錯的手段,它能更加底層地監測單片機的運行,它能通過斷點來檢查程式執行的位置,相關變數的值,甚至直接對這些變數值進行修改,相對于傳統的離線除錯,在線除錯能更容易地發現程式的問題,提高開發效率,
下圖為使用JTAG和idf.py monitor除錯的區別

二、準備階段
如果你使用的是安裝esp-idf開發環境時自動安裝的openocd-esp32,則它支持如下14種配接器
ftdi (如 ESP_Prog )
usb_blaster
esp_usb_jtag
esp_usb_jtag
ft232r
jlink
vsllink
ulink
hla
osbdm
opendous
aice
xds110
jtag_esp_remote
官方發售的 ESP-WROVER-KIT開發板上板載了 FT2232芯片,與ESP-Prog除錯器上的核心芯片等同,可以理解為ESP-WROVER-KIT開發板上自帶 ESP-Prog 除錯器
注意:請確保你使用的
OpenOCD是安裝esp-idf開發環境時 自動安裝 的openocd-esp32(即樂鑫官方提供的OpenOCD-ESP32【Github頁面】),或經其他用戶修改 并已說明支持ESP32的OpenOCD,否則無法對ESP32等進行除錯,
OpenOCD官方版本暫時無法對ESP32進行除錯
關于
CMSIS-DAP除錯器:雖然官方版本OpenOCD支持CMSIS-DAP,但是樂鑫在ESP-IDF開發環境搭建時自動安裝的OpenOCD并未支持此除錯器,
如果想要使openocd-esp32支持CMSIS-DAP請參考《從原始碼構建 OpenOCD》檔案,從樂鑫提供的原始碼編譯一份openocd-esp32,編譯時打開支持CMSIS-DAP的選項即可,但并不保證CMSIS-DAP一定能在除錯ESP32等時能正常作業
本文以ESP-Prog除錯器為例,探究 ESP32 JTAG 除錯的方法,其他除錯器以此類推,如圖為 ESP-Prog 除錯器
| ESP32 管腳 | JTAG 信號 |
|---|---|
| MTDO / GPIO15 | TDO |
| MTDI / GPIO12 | TDI |
| MTCK / GPIO13 | TCK |
| MTMS / GPIO14 | TMS |
| GND | GND |
ESP-Prog 的 JTAG 介面如下(從板子的背面也可以看)
這里建議將ESP32的monitor串口接到另一邊的變成介面上,monitor介面請通過idf.py menuconfig進行配置,默認為 UART0 ,這樣可以讓你的ESP32能在JTAG除錯時同時觀察串口的輸出,
注意
ESP-Prog上標注的ESP_TXD和ESP_RXD表示這兩個介面接入 ESP32 的TXD和RXD,并不是指此介面是下載器的TXD和RXD,因此不要想當然地反接,這里需要正接,
如果你只接入了TXD、RXD兩條資料線,確保使用idf.py時要進行手動燒錄復位(即IO0在低電平的時候完成一次芯片復位)部分開發板上的BOOT按鍵即為IO0,在此按鍵被按下的時候按開發板上的EN鍵即可)
如果你想使用 ESP-Prog 板載的自動編程介面(6針)來下載程式,請確保EN和IO0也接入,這樣即可通過自動燒錄電路進行程式下載,(無需手動燒錄復位)
1. Windows
請先閱讀上方的說明文字,選擇合適的除錯器
ESP-Prog使用了 FT2232 芯片實作了 JTAG 配接器,所以以下說明同樣適用于其他基于 FT2232 的 JTAG 配接器,
-
將
ESP-Prog接入電腦 -
等待 Windows 識別出
ESP-Prog或ESP-WROVER-KIT并且為其安裝驅動,如果驅動沒有被自動安裝,請前往 官網 下載并手動安裝, -
從 Zadig 官網 下載 Zadig 工具(Zadig_X.X.exe)并運行,
-
在 Zadig 工具中,進入 “
Options” 選單中選中 “List All Devices”, -
檢查設備串列,其中應該包含兩條與
ESP-Prog相關的條目:“Dual RS232-HS (Interface 0)” 和 “Dual RS232-HS (Interface 1)”,驅動的名字應該是 “FTDIBUS (vxxxx)” 并且 USB ID 為:0403 6010, -
第一個設備 “
Dual RS232-HS(Interface 0)” 連接到了ESP32的JTAG埠,此設備原來的 “FTDIBUS (vxxxx)” 驅動需要替換成 “WinUSB (v6xxxxx)”,為此,請選擇 “Dual RS232-HS (Interface 0)” 并將驅動重新安裝為 “WinUSB (v6xxxxx)”,如圖,

注意:請勿更改第二個設備 “
Dual RS232-HS(Interface 1)” 的驅動,它被連接到 ESP32 的串口(UART),用于上傳應用程式映像給 ESP32 進行燒寫,
- 最后步驟
之后參考本專欄環境搭建(一)文章,執行export.bat之后,在PowerShell或cmd中執行xtensa-esp32-els-gdb
PS D:\> xtensa-esp32-elf-gdb
如果看到
Open On-Chip Debugger v0.10.0-esp32-20210401 (2021-04-01-15:45)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32.cpu0: Debug controller was reset.
Info : esp32.cpu0: Core was reset.
Info : esp32.cpu1: Debug controller was reset.
Info : esp32.cpu1: Core was reset.
Info : Listening on port 3333 for gdb connections
沒有錯誤資訊,則證明配置成功
2. Linux
請先閱讀上方的說明文字,選擇合適的除錯器
ESP-Prog使用了 FT2232 芯片實作了 JTAG 配接器,所以以下說明同樣適用于其他基于 FT2232 的 JTAG 配接器,
- 將
ESP-Prog接入電腦 - 打開終端,輸入
ls -l /dev/ttyUSB*命令檢查作業系統是否能夠識別板子的 USB 埠,類似識別結果如下:
local@augtons:~/esp$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 Jul 10 19:04 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Jul 10 19:04 /dev/ttyUSB1
- 設定兩個 USB 埠的訪問權限
OpenOCD 官方檔案提供了這樣一段資訊
For USB devices on GNU/Linux you should use the contrib/60-openocd.rules
file. It probably belongs somewhere in /etc/udev/rules.d, but
consult your operating system documentation to be sure. Do not forget
to add yourself to the “plugdev” group.
對于大多數Linux發行版(如Ubuntu等),我們需要將openocd-esp32提供的rules檔案放到/etc/udev/rules.d/下(具體請參考自己作業系統的檔案)
之后需要將你的用戶添加到plugdev組中
usermod -a -G plugdev 你的用戶名
- 重啟電腦,然后重新插拔
ESP-Prog的電源使之前的改動生效,在終端再次輸入ls -l /dev/ttyUSB*命令進行驗證,查看這兩個設備的組所有者是否已經從dialout更改為plugdev:
local@augtons:~/esp$ ls -l /dev/ttyUSB*
crw-rw-r-- 1 root plugdev 188, 0 Jul 10 19:07 /dev/ttyUSB0
crw-rw-r-- 1 root plugdev 188, 1 Jul 10 19:07 /dev/ttyUSB1
如果看這樣的輸出結果,并且你也是 plugdev 組的成員, 那么設定作業就完成了,
具有較低編號的 /dev/ttyUSBn 介面用于 JTAG 通信,另一路介面被連接到 ESP32 的串口(UART),用于上傳應用程式映像給 ESP32 進行燒寫,
- 最后步驟
之后參考本專欄環境搭建(二)文章,執行export.sh之后,在終端中執行xtensa-esp32-els-gdb
xtensa-esp32-elf-gdb
如果看到
Open On-Chip Debugger v0.10.0-esp32-20210401 (2021-04-01-15:45)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32.cpu0: Debug controller was reset.
Info : esp32.cpu0: Core was reset.
Info : esp32.cpu1: Debug controller was reset.
Info : esp32.cpu1: Core was reset.
Info : Listening on port 3333 for gdb connections
沒有錯誤資訊,則證明配置成功,
如果看到有找不到Python2.7.so之類的錯誤,請安裝libpython2.7
對于Debain系作業系統如Ubuntu,可用如下命令列
sudo apt-get install libpython2.7
其余Linux發行版請自行查找系統檔案,安裝libpython2.7即可,
3. 錯誤排除
- 檢查硬體連接,JTAG 介面與 ESP32 連接是否正確,
- 使用 JTAG 除錯時,ESP32 JTAG 介面對應的 GPIO 不可被配置,
Linux下可能有無法使用ESP-Prog板載虛擬串口的情況,請參考如下文章解決:- 官方檔案-與ESP32創建串口連接 中有一個“FTDI”,請參考(下文2.和3.即為博主參考出來的東西,如仍未解決請繼續查閱資料)
- TN_101_Customising_FTDI_VID_PID_In_Linux(FT_000081).pdf中,第4頁的
2 Procedure,按照操作創建rules檔案 - 如果你的系統是
ubuntu等,檢查你的電腦是不是安裝了brltty(打開終端輸入brltty即可),如果有請卸載,(仍然參考1中的pdf檔案,第5頁末尾sudo apt-get remove brltty)
三、使用 Clion 進行 JTAG 除錯
1. 使用 JTAG 介面進行除錯
先看一張效果圖

Clion 成功為程式打上了斷點,并查看了程式變數,
(1) 添加配置
添加組態檔,選擇嵌入式 GDB 服務器


按照下圖和下方說明所示填寫內容:

- 目標和可執行檔案,選擇
*.elf即可 - GDB 一定不要選擇 Bundled GDB ,而是選擇搭建
esp-idf開發環境時自動安裝的xtensa-esp32-elf-gdb,其位置請參考本專欄環境搭建(一)或(二),在.espressif檔案夾中,
例如博主的Linux在/home/augtons/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin中,
Windows默認在C:\Users\用戶名\.espressif\...(參考我的Linux路徑)(除非你在安裝時有改動過) - 下載可執行檔案 一定要選擇無!!!(原因見后文)
- `target remot… 填寫
tcp:127.0.0.1:3333 - GDB 服務器,填寫安裝esp-idf開發環境時自動安裝的
openocd-esp32或自己部署的openocd-esp32路徑 - 下邊最重要的就是 GDB 服務器實參了,參考下一節
(2) 配置 GDB 服務器實參
這個實參本質上是在命令列中使用openocd時應附帶的引數,詳細內容請在終端中執行下述命令列來查看具體資訊,
openocd --help
這里只簡單介紹一點:
-s引數 +openocd的scripts檔案夾路徑,【可省略】,默認為openocd目錄下/share/openocd/scripts-f引數 +組態檔.cfg(可以是絕對路徑,也可以是相對于scripts的路徑)-c引數 需要讓openocd執行的命令,用雙引號引起,每個命令用分號隔開
對于ESP-Prog除錯器或 ESP-WROVER-KIT開發板,樂鑫官方已經為我們寫好了組態檔,在scripts下的board中,
如果你在用ESP-Prog除錯3.3V供電的ESP32或其模組,或在使用 ESP-WROVER-KIT等帶除錯器芯片的開發板,/board/esp32-wrover-kit-3.3v.cfg是最明智的選擇,如果為其他情況,可以先嘗試使用這個組態檔,如果不行,則要去script/board下找符合自己情況的組態檔,如果沒找到,則要自己撰寫cfg組態檔,
如果你選擇此組態檔,則在 GDB 服務器實參中填入如下內容
-f board/esp32-wrover-kit-3.3v.cfg -c "init;reset halt;"
script檔案夾下除了board檔案夾,還有interface、target兩檔案夾,其中interface下為除錯配接器的組態檔;target下為被除錯目標(如esp32)的組態檔,你可以將board檔案夾下的組態檔當作interface和target下兩兩組合得來,可能又配置了更貼近除錯目標的引數,當然,這里的“兩兩組合”不是簡單的復制粘貼而來,而是通過參考組合而來的,
全部填好后,選擇剛才你添加的 Clion 除錯配置,點擊“小蟲子”圖示就可以開始除錯了,除錯之前,一定要保證此程式已經被下載到了單片機內 ,使用idf.py flash即可,或者看下一小節使用 JTAG 燒錄程式,

2. 使用 JTAG 介面燒錄程式
點擊編輯配置,添加一個Shell Script


這里千萬不要選擇
OpenOCD 下載并運行(如上圖 Shell Script 往上數 3 個),因為 openocd 原生的燒錄命令program并不適用于ESP32等,而是要使用樂鑫官方提供的燒錄命令program_esp,必須使用自定義的命令來完成程式的燒錄
(下述的燒錄位置可以通過idf.py menuconfig更改,下方示例種的燒錄位置是默認值)program_esp <檔案名.bin> <燒錄位置> <其他引數>...例如,向
0x10000燒錄編譯后的 主程式 的bin檔案 (build/xxx.bin按具體情況更改)program_esp build/xxx.bin 0x10000 verify reset exit再如,向
0x1000燒錄編譯后 二級引導程式 的bootloader.bin檔案program_esp build/bootloader.bin 0x1000 verify reset exit再如,向
0x8000燒錄編譯后的 磁區表partition-table.bin檔案program_esp build/partition-table.bin 0x8000 verify reset exit

執行選擇腳本文本,腳本文本填入參考如下文本,改成符合自己的命令,
1. Linux下
. ~/esp/esp-idf-v4.3.1/export.sh && openocd -f board/esp32-wrover-kit-3.3v.cfg -c "program_esp cmake-build-debug/Hello.bin 0x10000 verify reset exit"
另外,如果你按照我在本專欄發布的文章搭建的環境,給執行export.sh的命令起過別名,則可以把&&之前的內容換成別名,例如在我的文章中用的get-idf
get-idf && openocd -f board/esp32-wrover-kit-3.3v.cfg -c "program_esp cmake-build-debug/Hello.bin 0x10000 verify reset exit"
需要注意的是,命令中
cmake-build-debug/Hello.bin是我的工程下的bin檔案路徑,你要根據自己實際情況,改成自己工程的bin檔案路徑,
至于燒錄地址為什么是
0x10000,請參考 官方檔案 -> API 指南 -> 磁區表,除非更改過,否則默認就是0x10000,
如需更改磁區表、bootloader 等,請使用
idf.py flash進行徹底燒錄
2.Windows下
參考Linux下,請用填入能完成下方任務的命令列:
(兩條命令連接依然是&&)
- 執行
export.bat或export.ps1- 執行
openocd -f board/esp32-wrover-kit-3.3v.cfg -c "program_esp cmake-build-debug/Hello.bin 0x10000 verify reset exit",
參考上文對此命令的解釋,更改為適合自己工程的命令,
四、使用命令列進行除錯
參考樂鑫提供的官方檔案 使用命令列的除錯示例
本文不再贅述
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/399658.html
標籤:其他
上一篇:【STC15系列】SYK-0806-A2S1 工業自動化控制之【16-自定義協議通信】
下一篇:如何獲得3點之間的角度?
