VSCode搭建ESP32开发环境
在Win10下搭建VSCode+ESP32开发调试环境,实现串口以及JTAG烧录调试,包含一键自动编译烧录调试,实现优雅地开发ESP32。本篇文章使用ESP32-S3模组进行测试,因为S3自带USB转JTAG调试功能;如果只使用串口烧录调试则所有ESP系列芯片通用。
1.硬件准备
ESP32-S3-WROOM开发板(双Type-C接口:一个USB转串口,一个USB转JTAG)- 示波器,测量引脚输出波形

2.VSCode安装ESP-IDF插件
2.1 根据ESP-IDF插件提示安装环境
完全按照ESP-IDF的提示进行安装即可,基本上全自动,全程开启代理确保下载速度最优
- 选择侧边栏
ESP-IDF选项卡 - 选择
Configure ESP-IDF Extension - 选择
EXPRESS(也可以根据个人实际情况选择安装模式) - 选择下载的服务器以及
ESP-IDF的版本,一般默认选择最新的,安装路径需要注意:将所有Administrator替换为自己的英文用户名,比如Orionxer,尽量避免权限问题 - 慢慢等待安装结束,大约需要30分钟左右,VSCode会提示下载安装过程


2.2 新建项目
- ESP-IDF选项卡侧边栏选择
Show Examples - 选择默认的
ESP-IDF环境 - 创建
blink项目,选择项目文件夹以保存

2.3 选择目标芯片
点击底部栏的Set Espressif Target(IDF_TARGET)选择目标芯片
- 选择工程
blink - 选择
esps3 - 选择
ESP32-S3 Chip (via built-in USB-JTAG)

2.4 编译项目
点击底部栏的编译按钮,第一次编译的时间会稍长,后续如果修改了项目的Configuration(即menuconfig)也会导致编译时间变长。编译成功后会输出RAM/ROM信息。

如果VSCode在c_cpp_properties.json文件中提示Cannot find "${env:IDF_TOOLS_PATH}等类似错误,
找到compilerPath键值对,将config:idf.toolsPath修改为config:idf.toolsPathWin即可
3.串口
3.1 烧录
使用串口烧录前需要将丝印COM接入电脑,正常情况下Win10会自动安装驱动,并识别出正确的端口、选择该端口,比如COM8,点击烧录。

3.2 监控
点击监控按钮,ESP-IDF启动串口监控命令行界面,可以观察到每秒打印一个日志。快捷键Ctrl + ]退出串口监控。

3.3 一键编译烧录监控
ESP-IDF针对串口方式,提供了一键编译烧录监控的按钮,方便快速调试验证。

3.4 提升烧录速度
在烧录过程中,如果不指定波特率,则烧录速度会默认为460800bps。可以通过settings.json文件修改键值对"idf.flashBaudRate"的值,提升烧录速度,最高速度取决于USB转串口芯片最大支持的波特率。
3.4.1 ESP32-S3
以ESP32-S3-WROOM开发板为例,板载CH343PUSB转串口芯片,根据该芯片的数据手册,理论波特率最高能设置为6Mbps[1],修改为4000000即4Mbps可以烧录。
1 | |
1 | |
实测修改为6000000即6Mbps,无法烧录,待验证…
3.4.2 ESP32
以ESP-WROOM-32开发板为例,板载CP2102的USB转串口芯片,根据该芯片的数据手册,理论波特率最高能设置为1Mbps[2]。实测修改为1000000即1Mbps,无法烧录,只是921600bps相当接近于1Mbps。
1 | |
保存并尝试烧录,可以看到终端提示烧录的速度是921600
4.JTAG
ESP32-S3模组自带USB转JTAG功能,配合OpenOCD能够实现烧录调试功能。调试功能一般用于不方便串口打印的场景,比如中断函数;另外定位HardFault原因比如指针越界访问等问题也会更加精准。
4.1 更换驱动
将丝印USB的TypeC接口接入电脑。
4.1.1 下载Zadig
进入Zadig软件官网下载,安装并打开。

4.1.2 选择接口
- 点击
Options,选择List All Devices - 选择
USB JTAG/serial debug unit(Interface 0)接口,注意一定要选择Interface 0接口 - 目的驱动选择
USB Serial CDC - 点击Replace Driver

更换驱动成功后,重新插拔TypeC接口。设备管理器界面中,Interface 0出现在端口(COM和LPT)处,说明驱动更换成功。

该驱动更换仅针对特定的USB端口,如果下次接入的其他的USB端口,则需要再次更换驱动。
4.2 修改优化等级
进入调试前,确保编译项目的优化等级为-OG,否则调试容易出现无法打断点以及断点位置偏移等问题。
- 点击底部栏配置按钮(menuconfig)
- 输入
optimization,将Size (-Os)修改为Size (-OG) - 点击
Save,重新编译

4.3 烧录
- 点击底部栏的烧录方式,选择
JTAG - 点击启动
OpenOCD。如果OpenOCD启动失败可以尝试重启电脑。 - 点击烧录,等待提示烧录成功。(启动
OpenOCD等待几秒之后再开始烧录)

修改代码后,进入调试前必须编译并且下载,否则调试容易出现异常。
4.4 启动调试
1 | |
重新编译烧录,在blink_example_main.c文件下按下F5尝试启动调试。一般VSCode会自动生成luanch.json文件配置,如果没有则复制以下的完整示例。

1 | |
1 | |
实测JTAG调试经常启动失败,失败报错原因:Debug adapter -> Extension: DEBUG_ADAPTER_READY2CONNECT。如果调试启动失败则多试几次,直至成功为止。暂未找到解决问题的办法。
4.5 波形测量
4.5.1 100Hz滴答
blink项目默认配置了GPIO48为GPIO输出引脚,且FreeRTOS的滴答频率是100Hz,即中断时间是10ms。修改Blink LED type为GPIO,编译烧录,示波器测量GPIO48引脚,波形如下:

根据上述代码分析,vTaskDelay(1);代表延迟一个滴答时间。理论上GPIO48在延迟10ms后会翻转电平。通过测量正脉宽参数可以验证该结论。
4.5.1 1KHz滴答
在不修改以上测试代码的前提下,修改项目配置的滴答频率为1000Hz,重新编译烧录,再次测量该引脚,此时正脉宽应该是1ms。此时vTaskDelay(1);依然代表延迟一个滴答时间,只是该滴答时间为1ms。


5.快捷键
合理使用快捷键能够有效提高效率,ESP-IDF的快捷键有点特殊,比如根据ESP-IDf的插件说明:编译项目快捷键是Ctrl E B,则按住Ctrl + E,松开,再按B,才能正确触发快捷键

常用的快捷键参考
| 快捷键 | 英文 | 中文 |
|---|---|---|
Ctrl + E + B |
Build your project | 编译 |
Ctrl + E + F |
Flash your project | 烧录 |
Ctrl + E + M |
Monitor your device | 监控 |
Ctrl + E + D |
Build, Flash and start a monitor on your device | 编译烧录监控 |