所有错误描述

[English]

[CPU-206] 写 LP SRAM 时指令执行乱序导致死锁

影响版本: v0.0 v0.1

描述

HP CPU 从 LP SRAM 取指运行时,若依次执行的两条指令 A 和 B 满足以下模式:

  • 指令 A 是写内存指令,例如 sw/sh/sb

  • 指令 B 是只访问指令总线的指令,例如 nop/jal/jalr/lui/auipc

  • 指令 B 的地址未四字节对齐

则仅当 B 指令执行完后,A 指令写的数据才会真实写入内存。这种情况可能带来风险:若在 A 指令写内存之后,B 指令存在无限循环的情况,则 A 指令的写操作永远无法完成。

变通方法

遇到该问题或汇编代码出现上述模式时,

  • 在指令 A 与无限循环间添加 fence 指令,在 ESP-IDF 中可使用 rv_utils_memory_barrier 接口。

  • 使用 wfi 指令替代无限循环,在 ESP-IDF 中可使用 rv_utils_wait_for_intr 接口。

  • 在编译 LP SRAM 中的程序时,禁用 RV32C(压缩)指令扩展,以避免产生非四字节对齐的指令。

解决方案

已在芯片版本 v1.2 中修复。

[CPU-863] 非对齐内存访问可能触发异常

影响版本: v0.0 v0.1 v1.2

描述

非对齐的 load 指令后紧跟 store 指令时,如果 load 地址和 store 地址所在区域通过物理存储器保护 (Physical Memory Protection, PMP) 或物理存储器属性 (Physical Memory Attributes, PMA) 配置了不同的访问权限,则可能触发加载访问错误异常(Load access fault,异常代码 5)。

例如,从 flash 或 ROM 拷贝非对齐字到 RAM 时,容易触发该问题:

lw  a0, 0(a1)   # 从只读 PMP 区域(如 ROM)加载非对齐 32 位地址
sw  a0, 0(a2)   # 存储到可读写 PMP 区域(例如 RAM)

根因:

非对齐的 load 如果跨越字边界,该指令在内部会被拆分为两次传输。由于设计中的时序对齐问题,非对齐 load 的第二次传输可能错误地按照 store 的访问权限检查,而非按照 load 的访问权限检查,从而触发异常。

变通方法

RISC-V 规范不保证硬件支持非对齐访问。通用代码应避免依赖非对齐访问。若因移植第三方库等原因无法避免非对齐访问,可以采用以下变通方法:

  • 在非对齐 load 与随后的 store 之间插入一条或多条 nop 指令,避免上述错误的权限检查。

    备注

    支持 --fix-esp-pmp-misalign 选项的链接器可在连续的 load 与 store 指令之间自动插入 nop 指令。该选项较为保守,即使指令不会触发异常(例如访问地址已对齐、或两次访问位于同一 PMP 区域),也可能插入多余的 nop。

  • 在内存拷贝时,仅对数据块首尾两个非对齐字使用非对齐 load/store,中间部分的数据则使用对齐的 load/store 拷贝。相比于全程插入 nop 指令的方法,该方法所需的 nop 指令更少,性能也更好。

  • 为非对齐 load 与随后 store 所访问的存储器区域配置相同的 PMP/PMA 权限。这可能需要在相关代码前后保存并恢复权限设置。

解决方案

暂无 修复计划。

[CLK-6996] RC_FAST_CLK 时钟无法校准

影响版本: v0.0 v0.1

描述

ESP32-H2 芯片 RC_FAST_CLK 时钟源的频率过于接近参考时钟 (32 MHz XTAL_CLK),导致无法校准,用户无法获取 RC_FAST_CLK 的准确时钟频率,进而对使用 RC_FAST_CLK 且对其准确时钟频率要求较高的外设产生影响。

使用 RC_FAST_CLK 的外设,详见 《ESP32-H2 技术参考手册》 > 章节 复位和时钟 [PDF]。

变通方法

使用 RC_FAST_CLK 之外的其他时钟源。

解决方案

已在芯片版本 v1.2 中修复。

[ADC-7227] SAR ADC1 通道 4 不可用

影响版本: v0.0 v0.1

描述

ESP32-H2 芯片 ADC1 的通道 4 (ADC1_CH4) 无法正常工作。

变通方法

请使用 ADC1_CH4 之外的其他通道。

解决方案

已在芯片版本 v1.2 中修复。

[ADC-1477] SAR ADC 低四位精度缺失

影响版本: v0.0 v0.1

描述

SAR ADC 数据位的低四位缺失,造成对应位的精度缺失。

变通方法

无。

解决方案

已在芯片版本 v1.2 中修复。

[I2C-308] 在分多次读操作中,主机无法正确读取从机数据

影响版本: v0.0 v0.1

描述

如果启用了 I2C 从机 non-FIFO 模式且主机多次对从机进行读操作时,主机无法正确从从机中读取正确的数据。

变通方法

配置从机的 I2C_FIFO_ADDR_CFG_EN 和 I2C_SLV_TX_AUTO_START_EN 为 1,并配置 I2C_FIFO_PRT_EN 为 0。

配置完成后,主机必须使用 RSTART -> WRITE (slave addr, fifo addr) -> RSTART -> WRITE (slave addr) -> READ (NACK) -> STOP 的命令序列对从机进行访问,每次读取仅限一个字节。

解决方案

已在芯片版本 v1.2 中修复。

[SPI-304] flash 自动暂停功能启用时,可能导致读出数据异常

影响版本: v0.0 v0.1

描述

启用 flash 自动暂停功能后,SPI0 总线的读取操作和 SPI1 总线的擦除、写入操作可以并发执行。软件通过 SPI1 擦除或写入 flash、且 cache 通过 SPI0 不定时读取 flash 时,如果先执行擦除或写入操作,预期的请求顺序是 擦除或写入 > 暂停或等待空闲 > 读取。

实际先执行擦除或写入操作时,出现的请求顺序是 擦除或写入 > 读取,可能导致读出数据异常,程序运行出现问题。

变通方法

禁用自动暂停功能。

解决方案

已在芯片版本 v1.2 中修复。

[LEDC-253] 分辨率设置成最大时,LEDC 无法达到 100% 占空比

影响版本: v0.0 v0.1

描述

定时器选择使用最大占空分辨率时,LEDC 无法达到 100% 占空比。强制将占空比设置成 2MAX_DUTY_RES 将会影响内部占空校准。

变通方法

无变通方法。

解决方法

已在芯片版本 v1.2 中修复。

[RMT-176] RMT 启用持续发送模式时,空闲信号电平可能出错

影响版本: v0.0 v0.1

描述

在 ESP32-H2 的 RMT 模块中,如果启用了持续发送模式,那么预期发送通道在发送 RMT_TX_LOOP_NUM_CHn 次数据后会停止数据传输,之后空闲状态的信号电平应由结束标志中的 level 段决定。

但在实际数据传输中,停止数据传输后,通道空闲状态的信号电平并不由结束标志中的 level 段决定,而是由回卷数据携带的电平决定,最终的电平不能确定。

变通方法

建议用户置位 RMT_IDLE_OUT_EN_CHn,从而仅使用寄存器来控制空闲状态的信号电平。

从首个支持持续发送模式的 ESP-IDF 版本 (v5.1) 开始已自动绕过该问题。在这些版本的 ESP-IDF 中,空闲状态的信号电平只能由寄存器控制。

解决方案

已在芯片版本 v1.2 中修复。

[BOOT-9537] 芯片上电启动时间过长,可能会误入 USB Download Boot 模式

影响版本: v0.0 v0.1

描述

上电时,电压从 0 V 逐渐上升至 3.3 V 的过程中,如果时间超过 12 ms,芯片可能会误入 USB Download Boot 模式。

变通方法

避免上电时长超过 12 ms。

解决方案

已在芯片版本 v1.2 中修复。

[AES-11401] 涉及 CPA 攻击的安全漏洞

影响版本: v0.0 v0.1

描述

芯片的 flash 加密功能基于 XTS-AES。攻击者通过结合运用功耗分析 (CPA)、故障注入 (FI) 和缓冲区溢出等攻击手段,可以绕过 flash 加密及安全启动。

变通方法

加密密钥如果与其他设备或制造批次相同,一定不能长期使用。建议同时开启 flash 加密和安全启动功能,最大限度减少攻击者重写固件的风险。

解决方案

已在芯片版本 v1.2 中修复。芯片版本 v1.2 中引入了抗攻击伪轮函数,可有效抵抗 CPA 攻击。

[ECC-11400] 涉及时间分析攻击的安全漏洞

影响版本: v0.0 v0.1

描述

ECC 执行点乘运算时,不同乘数的计算时间存在差异,因此 ECC 外设未能以恒定时间运行,导致其易受时间分析攻击。

变通方法

在 ECC 驱动中随机化功耗特征,使其成为恒定时间。注意,使用这一方法时,必须启用安全启动模式。

ESP-IDF 已在以下版本中自动绕过该问题:

表 5 ESP-IDF 发布版本

ESP-IDF Release 分支

已发布版本

release/v5.4 及以上

v5.4

release/v5.3

v5.3.2

release/v5.2

v5.2.5

release/v5.1

v5.1.5

解决方案

已在芯片版本 v1.2 中修复。芯片版本 v1.2 中引入恒时恒功耗模式。ECC 加速器在每次进行点乘计算时均会消耗相同的时间,消耗相同的功耗。

[ECDSA_DS-836] ECDSA_DS 异常接受无效 r 和 s 值签名

影响版本: v1.2

描述

当向 ECDSA_DS 外设提交带有无效 r 和 s 值的签名 {r = 0 或 n,s = 0 或 n} 进行任意消息和公钥验证时,该外设会错误地将此签名报告为 “valid”。

变通方法

使用 RSA_DS 安全启动替代 ECDSA_DS 安全启动。

解决方案

暂无 修复计划。

[ECDSA_DS-837] ECDSA_DS 异常接受无效 s 值签名

影响版本: v0.0 v0.1

描述

当向 ECDSA_DS 外设提交带有无效 s 值的签名 {r = (Qa + G).x,s = 0 或 n} 进行任意消息和公钥验证时,该外设会错误地将此签名报告为 “valid”。

变通方法

使用 RSA_DS 安全启动替代 ECDSA_DS 安全启动。

解决方案

暂无 修复计划。

[802.15.4-9538] RF 认证中有关发射功率的问题

影响版本: v0.0 v0.1

描述

在某些 RF 认证的特定射频信道下,旧版本芯片的发射功率存在略低于设计预期值的情况。但仍可满足认证要求。

变通方法

无变通方法。

解决方案

芯片版本 v1.2 对发射频谱边带进行了优化。 上述问题已在芯片版本 v1.2 中修复。

[PCNT-249] 无法触发步进中断

影响版本: v0.0 v0.1 v1.2

描述

如果启用了步进计数器 (step counter) 且计数达到配置的低限值或高限值时,步进中断未按预期触发。

变通方法

配置系统在计数器每增加或减少特定值 (x) 时通知应用程序。当满足此条件时,程序进入中断,读取当前计数器值,并调用用户的回调函数,将计数器值传递给调用方。

解决方案

暂无 修复计划。