VSCode搭建ESP32开发环境

在Win10下搭建VSCode+ESP32开发调试环境,实现串口以及JTAG烧录调试,包含一键自动编译烧录调试,实现优雅地开发ESP32。本篇文章使用ESP32-S3模组进行测试,因为S3自带USB转JTAG调试功能;如果只使用串口烧录调试则所有ESP系列芯片通用

1.硬件准备

  • ESP32-S3-WROOM开发板(双Type-C接口:一个USB转串口,一个USB转JTAG)
  • 示波器,测量引脚输出波形

ESP32-S3-WROOM开发板

2.VSCode安装ESP-IDF插件

2.1 根据ESP-IDF插件提示安装环境

完全按照ESP-IDF的提示进行安装即可,基本上全自动,全程开启代理确保下载速度最优

  • 选择侧边栏ESP-IDF选项卡
  • 选择Configure ESP-IDF Extension
  • 选择EXPRESS(也可以根据个人实际情况选择安装模式)
  • 选择下载的服务器以及ESP-IDF的版本,一般默认选择最新的,安装路径需要注意:将所有Administrator替换为自己的英文用户名,比如Orionxer尽量避免权限问题
  • 慢慢等待安装结束,大约需要30分钟左右,VSCode会提示下载安装过程

选择安装模式
选择下载服务器以及ESP-IDF的版本

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],修改为40000004Mbps可以烧录。

1
"idf.flashBaudRate": "4000000"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"C_Cpp.intelliSenseEngine": "default",
"idf.adapterTargetName": "esp32s3",
"idf.openOcdConfigs": [
"board/esp32s3-builtin.cfg"
],
"idf.flashType": "UART",
"idf.portWin": "COM8",
"idf.flashBaudRate": "4000000",
"files.associations": {
"task.h": "c",
"freertos.h": "c",
"freertosconfig.h": "c"
}
}

实测修改为60000006Mbps,无法烧录,待验证…

3.4.2 ESP32

ESP-WROOM-32开发板为例,板载CP2102的USB转串口芯片,根据该芯片的数据手册,理论波特率最高能设置为1Mbps[2]。实测修改为10000001Mbps,无法烧录,只是921600bps相当接近于1Mbps

1
"idf.flashBaudRate": "921600"

保存并尝试烧录,可以看到终端提示烧录的速度是921600
修改波特率

4.JTAG

ESP32-S3模组自带USB转JTAG功能,配合OpenOCD能够实现烧录调试功能。调试功能一般用于不方便串口打印的场景,比如中断函数;另外定位HardFault原因比如指针越界访问等问题也会更加精准。

4.1 更换驱动

将丝印USB的TypeC接口接入电脑。

4.1.1 下载Zadig

进入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等待几秒之后再开始烧录)

JTAG烧录

修改代码后,进入调试前必须编译并且下载,否则调试容易出现异常。

4.4 启动调试

1
2
3
4
5
6
7
8
9
10
11
12
13
void app_main(void)
{
/* Configure the peripheral according to the LED type */
configure_led();
while (1) {
// ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
blink_led();
/* Toggle the LED state */
s_led_state = !s_led_state;
// vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
vTaskDelay(1);
}
}

重新编译烧录,在blink_example_main.c文件下按下F5尝试启动调试。一般VSCode会自动生成luanch.json文件配置,如果没有则复制以下的完整示例。

JTAG调试

1
2
3
4
5
6
7
8
9
{
"configurations": [
{
"name": "ESP-IDF Debug: Launch",
"type": "espidf",
"request": "launch"
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"C_Cpp.intelliSenseEngine": "default",
"idf.adapterTargetName": "esp32s3",
"idf.openOcdConfigs": [
"board/esp32s3-builtin.cfg"
],
"idf.flashType": "JTAG",
"idf.portWin": "COM8",
"idf.flashBaudRate": "4000000",
"files.associations": {
"task.h": "c",
"freertos.h": "c",
"freertosconfig.h": "c"
}
}

实测JTAG调试经常启动失败,失败报错原因:Debug adapter -> Extension: DEBUG_ADAPTER_READY2CONNECT。如果调试启动失败则多试几次,直至成功为止。暂未找到解决问题的办法。

4.5 波形测量

4.5.1 100Hz滴答

blink项目默认配置了GPIO48为GPIO输出引脚,且FreeRTOS的滴答频率是100Hz,即中断时间是10ms。修改Blink LED typeGPIO,编译烧录,示波器测量GPIO48引脚,波形如下:

100Hz滴答-翻转电平

根据上述代码分析,vTaskDelay(1);代表延迟一个滴答时间。理论上GPIO48在延迟10ms后会翻转电平。通过测量正脉宽参数可以验证该结论。

4.5.1 1KHz滴答

在不修改以上测试代码的前提下,修改项目配置的滴答频率为1000Hz,重新编译烧录,再次测量该引脚,此时正脉宽应该是1ms。此时vTaskDelay(1);依然代表延迟一个滴答时间,只是该滴答时间为1ms。

设置FreeRTOS的滴答频率为1KHz

1KHz滴答-翻转电平

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 编译烧录监控

6.参考链接


VSCode搭建ESP32开发环境
https://blog.gogo.uno/2024/01/26/vscode-esp32-develop/
作者
Orionxer
发布于
2024年1月27日
更新于
2024年8月3日
许可协议