获取更多技术资讯?点击页面右上角【注册】,加入开发者社区吧
前言
本文旨在分享在嵌入式开发中使用APM32系列芯片(如APM32F103、APM32F407、APM32F003)的实战经验。
近期在项目中频繁使用FMC(Flash Memory Control)模块,积累了一些关于Flash读写、擦除及读保护的关键理解,特此记录以供参考。
FMC模块技术概览
APM32的FMC模块全称为Flash Memory Control,即闪存控制器。它是芯片内部存储管理的核心,主要由三个部分组成:存储器(Main Memory)、信息块(System Memory、Option Bytes)以及FMC寄存器。


FMC核心功能开发详解
在实际开发中,FMC模块的操作主要集中在以下四个关键点:
1. Flash编程(写入)注意事项
进行Flash编程时,首要原则是在写入数据前必须保证目标区域已被擦除。此外,不同型号的APM32芯片支持的写入位宽不同,这是开发中容易忽视的细节:
- APM32F103:仅支持半字(16-bit)写入。
- APM32F407:支持字节、半字、字、双字写入操作,具体取决于电压范围和并行位数配置。

2. Flash擦除机制:页擦除 vs 扇区擦除
Flash的擦除操作具有“整体性”,只能擦除指定区域的全部内容。开发者必须明确当前芯片的物理结构:
- APM32F103:采用页擦除(Page Erase)机制。
- APM32F407:采用扇区擦除(Sector Erase)机制。
在进行批量数据更新或OTA升级时,如果不确定擦除的最小粒度(页或扇区),极易触发编程错误或破坏相邻数据。
3. Flash读保护等级与解锁策略
APM32提供三种安全保护等级(Level 0, 1, 2):
- 等级0:无保护,全开放。
- 等级1:读取保护。无法通过调试接口读取主存储区。从等级1降级回等级0时,芯片会自动执行全片擦除(Mass Erase)。
- 等级2:芯片级保护。一旦设置,无法回退到等级0或等级1,芯片将永久锁定。
如何解决误设读保护等级1的问题?
如果意外进入等级1,通常有以下解法:
- 预留后门:代码中预先写入了解除保护的逻辑。
- 工具解锁:使用J-Flash或STM32CubeProgrammer等工具执行解锁命令。
- SRAM启动解锁:通过SRAM运行解锁代码。
特殊案例:无BOOT引脚芯片(如APM32F003)的救砖方案
对于像APM32F003这样没有外部BOOT引脚,且BOOT配置受选项字节控制的芯片,可以通过IAR EWARM环境从SRAM启动来恢复:
打开工程配置(Options),指定使用自定义的.icf链接文件。

修改.icf文件,将.intvec start地址修改为SRAM的首地址。

调整ROM和RAM的映射区域,将程序完全映射到SRAM中运行(避开被保护的Flash)。

通过这种方式,将解除保护的代码下载到SRAM并运行,即可成功救回芯片。
4. 选项字节(Option Bytes)操作规范
选项字节控制着读写保护、看门狗配置等关键功能。操作时需遵循以下规范:
- 生效机制:每次修改选项字节后,必须进行系统复位(System Reset)才能生效。
- 补码机制:选项字节通常包含原码和补码。修改选项字节前必须先执行擦除操作。
- 错误示例:直接将0xFE修改为0xFD。
- 原因:虽然数据位看似只变了一位,但由于补码校验机制的存在,直接写入会导致校验失败从而触发编程错误。
以上是关于APM32 FMC模块的深度解析,如有遗漏或错误,欢迎在评论区交流指正。
