MCU 异常复位时用户数据持久化方案
一、需求与背景
在很多应用中,需要在系统出现异常复位(非完全掉电)的情况下,保留一部分关键的用户数据。
- 挑战: 针对 L 系列等不支持 PowerDown 模式的芯片,需要采用特殊方式实现用户数据的存储。
- 理想状态: 在支持 PowerDown 模式的 MCU 中,通常通过 REGFILE 模块实现数据的保留。
二、几种可行的数据存储方式
存储方式 | 适用场景 | 优点/特点 | 限制/注意事项 |
---|---|---|---|
REGFILE 模块 | 支持 PowerDown 模式的 MCU | 专为低功耗数据保留设计。 | 仅限于支持 PowerDown 模式的芯片。 |
SRAM | 适用于电压保持稳定的功能性复位场景 | 数据在不掉电情况下可以保持。 | 上电复位(POR)时需要初始化,可能需要额外的 ECC 逻辑处理。 |
芯片内部特殊模块 | 空间受限的临时存储 | 例如 DMA 寄存器、CAN 的 RAM 等。 | 空间受限;使用后可能影响模块的正常使用。 |
外部 EEPROM 或 内部 Flash | 适用于掉电情况下也需要保存数据的情况 | 数据可长期保留,即使掉电。 | 写入和读取时间相对较长;存在寿命(擦写次数)问题。 |
Export to Sheets
三、不同复位情况下的数据处理策略
MCU 的复位一般分为两种:
1. 上电复位 (POR - Power-On Reset)
- 特点: 最彻底的复位,保证 MCU 从一个完全确定的状态启动。
- 影响: SRAM 本身有 ECC 逻辑,此时必须进行必要的初始化(POR 初始化)。
- 数据保留策略(基于 SRAM): 可以通过配置,选择某一块 RAM 作为一个 POR 初始化 Only 的模式,实现在上电时进行初始化,而在正常功能情况下(非 POR)直接读取。
2. 功能性复位 (Functional Reset)
- 特点: 基本只复位 CPU、外设等工作状态和寄存器,不复位 RCU、SRAM 等模块。
数据保留策略(基于 SRAM):
- 复位过程电压保持稳定,SRAM 内容可以正常保留。
- 通过 RCU 模块(记录复位情况)对应的寄存器标志,判断是否为 POR。
- 如果不是 POR,可以直接读取 SRAM 的值,无需初始化。
四、云途YCT配置工具支持情况
云途YCT工具可以采用如下配置方式:
↑增加对应的POR SRAM区域,区域要配置仅POR初始化的属性。
定义初始化属性
定义Section名称
定义好初始化属性之后,可以按照如下形式定义section中的变量:
static uint32_t System_RapidResetCount __attribute__((section(".RETENTION")));
根据实际复位原因初始化变量并进行分支控制:
/*FUNCTION**********************************************************************
*
* Function Name : System_RapidReset
* Description : This function is used to reset the system with pin reset output
*
*END**************************************************************************/
void System_RapidReset(void)
{
if (RCU_RSSR_POR_BOR_MASK == (RCU->RSSR & RCU_RSSR_POR_BOR_MASK))
{
/* Clear flag */
RCU->RSSR |= RCU_RSSR_POR_BOR_MASK;
System_RapidResetCount = 0;
}
System_RapidResetCount++;
if (System_RapidResetCount <= 10)
{
/* Enable reset output */
RCU->RPFR |= RCU_RPFR_RSTPIN_OBEN_MASK;
SystemSoftwareReset();
}
else
{
/* Disable reset output */
RCU->RPFR &= ~RCU_RPFR_RSTPIN_OBEN_MASK;
}
}
最后更新于 2025-10-15 09:16:59 并被添加「MCU 系统 复位」标签,已有 71 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。