文章目录[隐藏]
本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!
↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录 _ O x
是否进入ESP32教学导航(基于ESP-IDF)?
一、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"
。参考上文对此命令的解释,更改为适合自己工程的命令。
四、使用命令行进行调试
参考乐鑫提供的官方文档 使用命令行的调试示例
本文不再赘述
版权声明:本文为CSDN博主「Augtons正(单片机)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_50064262/article/details/122214860
暂无评论