ESP32忽略Strap引脚状态:无法激活1.8V内部稳压器排查
硬件与软件配置
- 硬件:ESP32S Dev Kit C2
- 软件:Windows 10 系统下的 Arduino IDE 2.0
- MCU:ESP32S
- 参考文档:ESP32技术参考手册PDF
需求目标
希望在启动或运行时激活1.8V内部稳压器,使部分GPIO工作在1.8V电平下。根据技术手册说明,上电时GPIO12(MTDI)为高电平即可激活该稳压器,优先选择运行时激活而非烧写熔丝方案。
测试操作与故障现象
上传仅用于每秒切换GPIO17电平的闪烁代码:
void setup() { pinMode(17, OUTPUT); } void loop() { digitalWrite(17, HIGH); delay(1000); digitalWrite(17, LOW); delay(1000); }
- 正常启动时,GPIO17在0-3.3V间切换,符合预期;
- 将GPIO12接3.3V后复位,ESP32无GPIO闪烁输出,且串口持续打印无意义信息(代码未包含串口逻辑),同时无法上传代码;断开GPIO12与3.3V连接后,设备恢复正常。串口输出内容如下:
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT) invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff etS Jul 29 2019 12:21:46
软件尝试与排查
在setup()中添加寄存器控制代码尝试运行时激活1.8V稳压器:
uint32_t SDIOConfReg = *(uint32_t*)(0x3FF48074); *(uint32_t*)(0x3FF48074) &= ~(1 << 31); // 软件控制稳压器输出1.8V(默认值,仅作显式测试) *(uint32_t*)(0x3FF48074) |= (1 << 22); // 启用软件控制稳压器
上电后串口仍打印无效头信息,推测Flash需要3.3V供电;修改寄存器强制3.3V后设备恢复正常。后续确认该开发板Flash为3.3V,需更换其他ESP32设备实现需求。
核心疑问解答
1. 为何GPIO12接3.3V启动时,设备会自动输出串口信息?
GPIO12是ESP32的启动配置引脚(MTDI),上电时该引脚电平会决定Flash的供电电压:高电平对应1.8V Flash,低电平对应3.3V Flash。你的开发板Flash为3.3V供电,当GPIO12接3.3V启动时,ESP32会误判Flash工作在1.8V模式,导致Flash通信时序不匹配,无法正确加载用户代码,进而进入启动故障状态。此时ESP32的bootloader会通过串口输出启动错误日志,这是bootloader的默认行为,和用户代码无关。
2. 如何在不烧写熔丝的前提下,正确激活ESP32的1.8V电压域?
- 首先确认设备Flash支持1.8V供电:如果Flash是3.3V专属类型,强行切换到1.8V会导致Flash通信失败,设备无法正常启动,这就是你遇到的问题。这种情况下必须更换搭载1.8V兼容Flash的ESP32设备。
- 若设备搭载兼容1.8V/3.3V的Flash,可按以下步骤操作:
- 启动时保持GPIO12为低电平,确保Flash以3.3V模式启动,正常加载用户代码;
- 在
setup()阶段通过寄存器配置切换到1.8V稳压器模式:uint32_t* sdio_conf_reg = (uint32_t*)0x3FF48074; *sdio_conf_reg &= ~(1 << 31); // 设置稳压器输出1.8V *sdio_conf_reg |= (1 << 22); // 启用软件控制稳压器 - 切换完成后,对应1.8V电压域的GPIO(如部分RTC GPIO,需参考技术手册确认具体范围)将工作在1.8V电平。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

