ESP32之 ESP-IDF + Clion 开发环境搭建(三)—— 使用 Clion 对 ESP32 进行 JTAG 调试

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏主页↓↓↓
CSDN 请求进入专栏       _ O x

是否进入ESP32教学专栏(基于ESP-IDF)?

       确定


一、JTAG 调试简介

在这里插入图片描述
先看一张效果图,Clion成功为ESP32程序打上了断点,而且能观测变量值,并能对其修改!

JATG 是一种可用于在线调试单片机运行状态和资源的接口。相对于常用的idf.py monitor来说,JTAG 调试是一种在线调试的手段,它能更加底层地监测单片机的运行。它能通过断点来检查程序执行的位置,相关变量的值,甚至直接对这些变量值进行修改。相对于传统的离线调试,在线调试能更容易地发现程序的问题,提高开发效率。

下图为使用JTAGidf.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-ESP32Github页面】),或经其他用户修改 并已说明支持ESP32OpenOCD。否则无法对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 接口如下(从板子的背面也可以看)

这里建议将ESP32monitor串口接到另一边的变成接口上,monitor接口请通过idf.py menuconfig进行配置,默认为 UART0 。这样可以让你的ESP32能在JTAG调试时同时观察串口的输出。

注意
ESP-Prog上标注的ESP_TXDESP_RXD表示这两个接口接入 ESP32 的TXDRXD。并不是指此接口是下载器的TXD和RXD。因此不要想当然地反接,这里需要正接。


如果你只接入了TXDRXD两条数据线,确保使用idf.py时要进行手动烧录复位(即IO0在低电平的时候完成一次芯片复位)部分开发板上的BOOT按键即为IO0,在此按键被按下的时候按开发板上的EN键即可)


如果你想使用 ESP-Prog 板载的自动编程接口(6针)来下载程序,请确保EN和IO0也接入,这样即可通过自动烧录电路进行程序下载。(无需手动烧录复位)

1. Windows

请先阅读上方的说明文字,选择合适的调试器

ESP-Prog使用了 FT2232 芯片实现了 JTAG 适配器,所以以下说明同样适用于其他基于 FT2232JTAG 适配器。

  1. ESP-Prog 接入电脑

  2. 等待 Windows 识别出 ESP-ProgESP-WROVER-KIT 并且为其安装驱动。如果驱动没有被自动安装,请前往 官网 下载并手动安装。

  3. Zadig 官网 下载 Zadig 工具(Zadig_X.X.exe)并运行。

  4. 在 Zadig 工具中,进入 “Options” 菜单中选中 “List All Devices”。

  5. 检查设备列表,其中应该包含两条与 ESP-Prog 相关的条目:“Dual RS232-HS (Interface 0)” 和 “Dual RS232-HS (Interface 1)”。驱动的名字应该是 “FTDIBUS (vxxxx)” 并且 USB ID 为:0403 6010

  6. 第一个设备 “Dual RS232-HS(Interface 0)” 连接到了 ESP32JTAG 端口,此设备原来的 “FTDIBUS (vxxxx)” 驱动需要替换成 “WinUSB (v6xxxxx)”。为此,请选择 “Dual RS232-HS (Interface 0)” 并将驱动重新安装为 “WinUSB (v6xxxxx)”,如图。

在这里插入图片描述

注意:请勿更改第二个设备 “Dual RS232-HS(Interface 1)” 的驱动,它被连接到 ESP32 的串口(UART),用于上传应用程序映像给 ESP32 进行烧写。

  1. 最后步骤

之后参考本专栏环境搭建(一)文章,执行export.bat之后,在PowerShellcmd中执行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 适配器,所以以下说明同样适用于其他基于 FT2232JTAG 适配器。

  1. ESP-Prog 接入电脑
  2. 打开终端,输入 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
  1. 设置两个 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 你的用户名
  1. 重启电脑,然后重新插拔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 进行烧写。

  1. 最后步骤

之后参考本专栏环境搭建(二)文章,执行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. 错误排除

  1. 检查硬件连接,JTAG 接口与 ESP32 连接是否正确。
  2. 使用 JTAG 调试时,ESP32 JTAG 接口对应的 GPIO 不可被配置。
  3. Linux下可能有无法使用ESP-Prog板载虚拟串口的情况,请参考如下文章解决:
    1. 官方文档-与ESP32创建串口连接 中有一个“FTDI”,请参考(下文2.和3.即为博主参考出来的东西,如仍未解决请继续查阅资料)
    2. TN_101_Customising_FTDI_VID_PID_In_Linux(FT_000081).pdf中,第4页的 2 Procedure,按照操作创建rules文件
    3. 如果你的系统是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

这里只简单介绍一点:

  1. -s 参数 + openocdscripts文件夹路径,【可省略】,默认为openocd目录下 /share/openocd/scripts
  2. -f 参数 + 配置文件.cfg(可以是绝对路径,也可以是相对于scripts的路径)
  3. -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文件夹,还有interfacetarget两文件夹。其中interface下为调试适配器的配置文件target下为被调试目标(如esp32)的配置文件。你可以将board文件夹下的配置文件当作interfacetarget下两两组合得来,可能又配置了更贴近调试目标的参数。当然,这里的“两两组合”不是简单的复制粘贴而来,而是通过引用组合而来的。

全部填好后,选择刚才你添加的 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下,请用填入能完成下方任务的命令行:
(两条命令连接依然是&&

  1. 执行export.batexport.ps1
  2. 执行openocd -f board/esp32-wrover-kit-3.3v.cfg -c "program_esp cmake-build-debug/Hello.bin 0x10000 verify reset exit"


    参考上文对此命令的解释,更改为适合自己工程的命令。

四、使用命令行进行调试

参考乐鑫提供的官方文档 使用命令行的调试示例

本文不再赘述

猜你喜欢

转载自blog.csdn.net/m0_50064262/article/details/122214860