对于esp32c3裸机开发,用openocd结合gdb非常的有用,这是裸机开发的关键工具。
esp32c3的开发支持两种调试方式,分别是内置的USB调试接口,以及外扩的扩展调试接口。其内置一个USB-to-JTAG
的接口。
由于esp32c3芯片内置一个JTAG的调试器的引擎,所以不用外置的JTAG的调试器。其中的硬件连接可以参考下面的图示。
连接的线需要自己一个USB的插头,插入到电脑的USB口即可。
USB Signal | Typical wire color | ESP32-C3 Signal Name |
---|---|---|
D- | White | GPIO18 |
D+ | Green | GPIO19 |
V_BUS | Red | 5V |
GND | Black | GND |
当有JTAG可以使用这个外置的接口进行连接。
这里使用的是蜂鸟调试器接口。
由于目前手上只有这一个调试器,所以直接用这个来进行测试。
信号线的连接上图所示:
JTAG signal | JTAG20 pin | ESP32-C3 signal |
---|---|---|
TMS | 7 | IO4 |
TDI | 5 | IO5 |
TCK | 9 | IO6 |
TDO | 13 | IO7 |
GND | 4 | GND |
这里用nuttx这个rtos作为演示,首先需要编译出nuttx的程序出来。
编译过程如下:
准备环境,目前在ubuntu的环境下进行的编译。
sudo apt install \
bison flex gettext texinfo libncurses5-dev libncursesw5-dev \
gperf automake libtool pkg-config build-essential gperf genromfs \
libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \
libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
然后需要安装kconfig-frontends
。这是nuttx
编译需要的,不过可以自己编译。
apt install kconfig-frontends
下载代码
mkdir nuttx
cd nuttx
git clone https://github.com/apache/incubator-nuttx.git nuttx
git clone https://github.com/apache/incubator-nuttx-apps apps
通过nuttx目录下的
./tools/configure.sh -L | less
可以列出所有可以编译的程序。
在编译esp32c3之前,需要准备交叉编译工具链,这里采样sifive官网的工具链就可以。
https://www.sifive.com/software
另外通过
./tools/configure.sh esp32c3-devkit:nsh
来编译出可以指向的nuttx的程序。
正常情况下,编译出的esp32c3的nuttx程序。
启动esp32c3需要下面的固件
上面两个固件可以到下面的地址下载
https://github.com/espressif/esp-nuttx-bootloader
然后,nuttx则需要自己编译。
在烧录esp32c3程序时,需要在电脑上安装python3。
pip install esptool
安装esptool就可以进行烧录了。
通过下面的命令烧录nuttx
esptool.py --chip esp32c3 --port COM3 --baud 921600 write_flash 0x0 .\bootloader-esp32c3.bin 0x8000 .\partition-table-esp32c3.bin 0x10000 nuttx.bin
下面表示烧录成功。
然后启动串口调试助手,可以看到esp32c3可以正常启动nuttx。
当线路连接完成,并且程序下载进去后,就可以开始进行调试工作了。
设置使能JTAG。
espefuse.py -p COM3 burn_efuse JTAG_SEL_ENABLE
此时,芯片可以进行JTAG的调试了。
根据蜂鸟调试器,装好驱动,通过查看电脑的设备管理器,可以看到如下的驱动。
可以到官方的网站上下载对应版本的esp32c3的openocd程序。
https://github.com/espressif/openocd-esp32
下载最新版本即可。
找到openocd解压后的程序目录,找到可以执行的程序。
.\openocd.exe -c 'set ESP_RTOS none' -f board/esp32c3-ftdi.cfg
其中openocd-esp32\share\openocd\scripts\board
可以找到esp32c3的配置文件。
其中的builtin代表的内置的jtag的配置。而ftdi则是外置的jtag的配置。由于这里采用的是外置的jtag,所以需要esp32c3-ftdi.cfg
。
正常情况下,启动信息如下所示:
这样就可以启动gdb去连接openocd了。
对于esp32c3的程序,可以采用sifive提供的riscv交叉编译工具链中的gdb程序。
gdb正常的与芯片进行通信。
此时可以将编译好的nuttx的程序的符号表加载进来。
file ./nuttx
同时,可以通过telnet查看信息状态。
windows上启动telnet可以通过控制面板。
启动telnet控制端,这样就可以控制gdb的行为了。
$telnet localhost 4444
>reset
>halt
>reg
>step
>reg pc
>resume
当然gdb窗口中也能查看寄存器状态信息。
由于前面已经写好了一个基本的esp32c3裸机程序,所以可以通过gdb进行调试。
https://github.com/bigmagic123/esp32c3_bare_metal
编译完成后,首先打开openocd
.\openocd.exe -c 'set ESP_RTOS none' -f board/esp32c3-ftdi.cfg
另外开一个窗口,开启gdb的连接。
.\riscv64-unknown-elf-gdb.exe C:/work/example
这样可以正常看到代码执行的顺序了。