STM32WL MCU中SRAM2全局变量上电初始化异常问题求助
解决STM32WL SRAM2变量上电初始化0、低功耗保留值的问题
你的核心矛盾是:NOLOAD段保证了低功耗唤醒后变量不被重置,但同时也导致上电复位时变量没有初始值(随机值)。解决思路是通过判断复位类型,仅在上电复位时手动初始化变量为0,具体步骤如下:
1. 保留现有链接器配置
当前的.ram2 (NOLOAD)段配置是正确的,它确保SRAM2区域的变量不会在任何复位后被编译器自动覆盖,这是低功耗唤醒保留值的基础,无需修改。
链接器配置回顾:
MEMORY { RAM1 (xrw) : ORIGIN = 0x20000000, LENGTH = 32K RAM2 (xrw) : ORIGIN = 0x20008000, LENGTH = 16K FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K } .ram2 (NOLOAD): { _sram2 = .; *(.ram2*) . = ALIGN(4); _eram2 = .; } >RAM2
变量定义也保持不变:
volatile uint32_t rfWaterCnt __attribute__((section(".ram2")));
2. 代码中判断复位类型,手动初始化
利用STM32的RCC复位状态寄存器(RCC->CSR)判断复位原因,仅在上电复位时将变量初始化为0,其他复位(如低功耗唤醒、看门狗复位)则保留原有值。
在程序初始化阶段(比如main函数开头)添加以下代码:
// 检查是否为上电复位 if (RCC->CSR & RCC_CSR_PORRSTF) { // 上电复位时初始化变量为0 rfWaterCnt = 0; } // 清除所有复位标志,避免下次复位误判 RCC->CSR |= RCC_CSR_RMVF;
关键说明
RCC_CSR_PORRSTF:上电复位标志位,仅在上电复位(包括冷启动、掉电恢复)时会被置位。RCC_CSR_RMVF:复位标志清除位,写入1即可清除所有复位标志位,必须执行,否则后续复位检测会出错。- 低功耗模式唤醒时,触发的是低功耗复位(对应
RCC_CSR_LPWRRSTF位),此时不会进入上电复位的初始化分支,变量会保留SRAM2中的原有值。
内容的提问来源于stack exchange,提问作者Fasset
相关产品推荐
相关产品推荐

