在 STM32L4 系列(如 L433/L423/L413)做项目时,很多人会把校准参数、掉电记录、复位标志存在 SRAM2,希望软复位也能保持数据。但经常遇到一个诡异问题:软件复位后,SRAM2 里的数据莫名其妙被清零,查代码、改编译器、换 __no_init 都没用。
ST 官方 LAT1349 笔记直接给出标准答案:这不是代码问题,也不是硬件问题,而是选项字节 SRAM2_RST 配置不对。
本文把原因、定位、解决方法、量产注意事项一次性讲透,帮你彻底告别 SRAM2 掉数据。
资料获取:【应用笔记】LAT1349 STM32L4芯片软复位导致SRAM2的值被擦除话题
1. 典型故障现象(完全一致就是同款问题)
- 软复位(
NVIC_SystemReset)后 SRAM2 数据被擦除 - 两块硬件一样的板子,一块保持、一块清空
- 已用
__no_init/ 非初始化段,依旧被清 - 并非掉电,只是软件复位
- 硬件仅小幅改动(如拆 ESD、加串口),不影响 RAM
2. 根因:选项字节 SRAM2_RST 控制复位是否擦除
STM32L4 系列有一个关键选项字节:SRAM2_RST
它直接决定系统复位时 SRAM2 会不会被清零:
- SRAM2_RST = 1:复位不擦除 SRAM2(你想要的效果)
- SRAM2_RST = 0:复位自动擦除 SRAM2(问题根源)
客户两块板子表现不同,纯粹是这个选项字节不一样,和硬件电路无关。
3. 10 秒解决方法(STM32CubeProgrammer)
- 用 STM32CubeProgrammer 连接芯片
- 进入 Option Bytes
- 找到 User Configuration
- 将 SRAM2_RST 设为 1
- 点击 Apply 烧录选项字节
设置完成后:任何软复位、系统复位,SRAM2 数据都保持不变。
4. 为什么改 __no_init、链接脚本都没用?
LAT1349 明确说明:
- 编译器的
__no_init只控制启动代码是否清零 - 但如果 SRAM2_RST=0,硬件会在复位瞬间直接擦除 SRAM2
- 硬件擦除优先级 > 编译器设置
所以软件怎么改都没用,必须改选项字节。
5. 量产必须注意(避免产线批量出问题)
- 产线烧录时,选项字节要统一配置
- 烧录过程供电必须稳定,否则容易导致选项字节错乱
- 烧录后校验 SRAM2_RST=1
- 同一机型所有设备保持相同 OB 配置
6. LAT1349 最终结论(工程师记忆版)
- STM32L4 软复位清 SRAM2 = SRAM2_RST 设为 0
- 要保持数据 → SRAM2_RST 必须设为 1
- 这是硬件选项字节控制,与代码 / 编译器无关
- 两块板子不同表现 = OB 配置不一致
- 配置一次,永久保持,不再掉数据
STM32L4 想让 SRAM2 在软复位后保持数据,只需要做一件事:把选项字节 SRAM2_RST 设为 1。
阅读全文
302