扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32L4 软复位后 SRAM2 数据被清空?一招搞定选项字节配置

03/17 11:41
302
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在 STM32L4 系列(如 L433/L423/L413)做项目时,很多人会把校准参数、掉电记录、复位标志存在 SRAM2,希望软复位也能保持数据。但经常遇到一个诡异问题:软件复位后,SRAM2 里的数据莫名其妙被清零,查代码、改编译器、换 __no_init 都没用。

ST 官方 LAT1349 笔记直接给出标准答案:这不是代码问题,也不是硬件问题,而是选项字节 SRAM2_RST 配置不对。

本文把原因、定位、解决方法、量产注意事项一次性讲透,帮你彻底告别 SRAM2 掉数据。

资料获取:【应用笔记】LAT1349 STM32L4芯片软复位导致SRAM2的值被擦除话题

1. 典型故障现象(完全一致就是同款问题)

  1. 软复位(NVIC_SystemReset)后 SRAM2 数据被擦除
  2. 两块硬件一样的板子,一块保持、一块清空
  3. 已用 __no_init / 非初始化段,依旧被清
  4. 并非掉电,只是软件复位
  5. 硬件仅小幅改动(如拆 ESD、加串口),不影响 RAM

2. 根因:选项字节 SRAM2_RST 控制复位是否擦除

STM32L4 系列有一个关键选项字节:SRAM2_RST

它直接决定系统复位时 SRAM2 会不会被清零:

  • SRAM2_RST = 1:复位不擦除 SRAM2(你想要的效果)
  • SRAM2_RST = 0:复位自动擦除 SRAM2(问题根源)

客户两块板子表现不同,纯粹是这个选项字节不一样,和硬件电路无关。

3. 10 秒解决方法(STM32CubeProgrammer)

  1. 用 STM32CubeProgrammer 连接芯片
  2. 进入 Option Bytes
  3. 找到 User Configuration
  4. 将 SRAM2_RST 设为 1
  5. 点击 Apply 烧录选项字节

设置完成后:任何软复位、系统复位,SRAM2 数据都保持不变。

4. 为什么改 __no_init、链接脚本都没用?

LAT1349 明确说明:

  • 编译器的 __no_init 只控制启动代码是否清零
  • 但如果 SRAM2_RST=0,硬件会在复位瞬间直接擦除 SRAM2
  • 硬件擦除优先级 > 编译器设置

所以软件怎么改都没用,必须改选项字节。

5. 量产必须注意(避免产线批量出问题)

  1. 产线烧录时,选项字节要统一配置
  2. 烧录过程供电必须稳定,否则容易导致选项字节错乱
  3. 烧录后校验 SRAM2_RST=1
  4. 同一机型所有设备保持相同 OB 配置

6. LAT1349 最终结论(工程师记忆版)

  1. STM32L4 软复位清 SRAM2 = SRAM2_RST 设为 0
  2. 要保持数据 → SRAM2_RST 必须设为 1
  3. 这是硬件选项字节控制,与代码 / 编译器无关
  4. 两块板子不同表现 = OB 配置不一致
  5. 配置一次,永久保持,不再掉数据

STM32L4 想让 SRAM2 在软复位后保持数据,只需要做一件事:把选项字节 SRAM2_RST 设为 1。

相关推荐