【ESP32日记004】ESP32S3 上电一直重启报错分析之——rst:0x3 (RTC_SW_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

本文讲述了作者在调试ESP32S3项目时遇到的上电重启问题,涉及电源、SPI通信错误和EMI干扰。通过排查,发现是时钟线路电阻设置不当引发的SPI读写错误,最终解决了问题。作者强调了硬件设计和EMI防护在项目开发中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在调试ESP32S3的板子,打样回来调试,更新程序正常但是上电后一直重启,报错误信息如下:
rst:0x3 (RTC_SW_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT) Saved PC:0x403cd98e SPIWP:0xee


线路板布局如下:

正面:

反面:

异常说明:查了网上很多相关的贴子,很多人反馈是电源的问题,我项目是使用6V适配器供电的方案,硬件上开启wifi AP模式用于OTA,开启wifi STA 使用MQTT用于产品数据上报和参数下发设置使用,工作电流较大,因LDO一般电流较小、发热大,不利于产品散热,故采用DCDC降压3.3V给芯片供电。故我也怀疑是DCDC纹波较大,导致产品启动异常,一直报错重启。因此一直在调试DCDC部分,使用示波器抓波形,发现纹波确实比较大,100mV~300MV左右,相比LDO来说纹波确实大很多。于是尝试使用LDO供电,发现问题依旧,并未解决。
解决办法:于是陷入僵局,折腾了大半天换晶振、并1M电阻等等都无明显改善。后来认真看报错信息,“

<think>好的,用户的问题是关于SPI_FLASH_BLOCK_ERASE_64命令的使用或错误解决方案。我需要先理解这个命令的具体作用和常见应用场景。SPI Flash中的块擦除命令通常是用来擦除特定大小的存储块,比如64KB的块。常见的擦除命令可能有不同的块大小,比如32KB、64KB或更大的块,用户需要确认使用的是正确的命令代码。 接下来,用户可能遇到的问题是发送该命令后没有得到预期的结果,比如擦除失败或数据残留。这时候需要检查几个方面:命令代码是否正确,地址是否正确对齐,SPI通信是否正常,以及芯片是否处于写保护状态。例如,正确的64KB块擦除命令代码通常是0xD8,而地址必须对齐到64KB边界,如0x00000x10000等。 另外,硬件连接问题也可能导致擦除失败,比如时钟频率过高或不稳定,或者片选信号未正确拉低。软件配置方面,需要确保在发送擦除命令前取消了写保护,并且等待芯片就绪。例如,发送Write Enable命令(0x06)是必要的步骤。 用户提供的引用内容中提到SPI_BOOT_CRYPT_CNT eFuse的设置,这可能与Flash加密有关。如果启用了加密功能,擦除操作可能需要解密或特定的权限,否则会失败。因此,需要检查加密设置是否影响了擦除命令的执行。 最后,建议用户查阅具体Flash芯片的数据手册,确认命令代码和操作流程,以及使用逻辑分析仪或示波器检查SPI信号,确保通信正常。如果问题依然存在,可能需要检查芯片是否损坏或尝试重新初始化SPI接口。</think>### SPI_FLASH_BLOCK_ERASE_64 命令解析与问题排查 #### 1. 基本概念与命令用途 SPI_FLASH_BLOCK_ERASE_64 是用于擦除SPI Flash中64KB块大小的指令。其操作逻辑为: $$ \text{指令码} + \text{24位地址} $$ 地址需对齐到64KB边界(例如0x00000x10000)。擦除时间通常在100ms至2秒之间,具体取决于芯片型号[^1]。 #### 2. 常见错误及解决方案 | 错误现象 | 可能原因 | 解决方案 | |-------------------------|-----------------------------------|--------------------------------------------------------------------------| | 擦除失败(返回错误标志)| 地址未对齐64KB边界 | 检查地址是否为0x10000的整数倍 | | 数据残留 | 未等待擦除完成 | 发送指令后轮询状态寄存器BUSY位 | | 写保护触发 | 芯片处于硬件/软件写保护状态 | 发送Write Enable指令(0x06)前解除保护 | | 加密冲突 | Flash加密功能启用(SPI_BOOT_CRYPT_CNT=1)| 检查加密模式设置,必要时通过espefuse.py调整加密配置[^1] | #### 3. 典型操作流程 ```python # 示例代码框架(需适配具体硬件) def block_erase_64(spi, address): # 验证地址对齐 assert (address & 0xFFFF) == 0, "地址未对齐64KB边界" # 取消写保护 spi.write([0x06]) # WREN time.sleep(0.1) # 发送擦除指令 cmd = [0xD8, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF] spi.write(cmd) # 等待操作完成 while True: status = spi.read(1)[0] if not (status & 0x01): break ``` #### 4. 加密模式注意事项 当启用Flash加密(SPI_BOOT_CRYPT_CNT=1)时: - 所有擦除操作需在解密上下文执行 - 直接物理访问可能得到密文数据 - 开发阶段建议使用`Development (NOT SECURE)`模式
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值