1. 例程硬件设计说明
例程硬件由两部分构成:
测试串口配置参数:波特率 115200,8 位数据位,1 停止位,无校验,无硬件流控。
资料获取:AN1094_APM32F4xx Flash模拟EEPROM 应用笔记
2. 关键宏定义与初始化参数完整解析
文档示例配置(以扇区 1 作为模拟区域)
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /*16Kbytes*/
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /*16Kbytes*/
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /*16Kbytes*/
#define FLASH_SECTOR_SIZE ((uint32_t)(1024*16))
#define FLASH_EE_TOTAL_SIZE ((uint32_t)(1024*16*2)) //必须扇区大小整数倍
#define FLASH_EE_START_ADDR ADDR_FLASH_SECTOR_1 //扇区对齐起始地址
#define FLASH_EE_END_ADDR (ADDR_FLASH_SECTOR_1 + FLASH_EE_TOTAL_SIZE)
#define BUFFER_SIZE 64
#define FLASH_EE_TEST_ADDR (uint32_t)0x08007FF0
参数说明:
FLASH_SECTOR_SIZE:选用扇区大小,本示例 16KB;FLASH_EE_TOTAL_SIZE:模拟 EEPROM 总容量,必须为扇区大小整数倍;示例取 2 个扇区;FLASH_EE_START_ADDR:起始地址,必须扇区边界对齐;- RAM 缓冲区定义:
uint8_t Flash_EE_Ram_Buffer[FLASH_SECTOR_SIZE];大小和扇区完全一致; - Flash 参数数组通过
__attribute__((section(".ARM....")))指定段地址,防止编译链接时应用代码占用模拟 EEPROM Flash 空间。
3. 软件例程整体执行流程
- 初始化 USART 串口;
- 填充测试写缓冲区;
- 调用
Flash_EE_Write()写入测试数据; - 调用
Flash_EE_Read()读出数据; - 比对写入、读出缓冲区内容;
- 串口打印:
Test Successful!或者Test Error!。
4. 核心函数逻辑
- Flash_EE_Write 核心输入:写入地址、数据源指针、写入字节长度。 逻辑:计算扇区内偏移地址;区分地址是否扇区对齐;判断是否跨扇区;拆分调用单扇区写函数
Flash_EE_WriteOneSector()。 - Flash_EE_WriteOneSector ① Flash 解锁 FMC_Unlock; ② 扫描扇区判断是否需要擦除; ③ 需要擦除:读取整个扇区到 RAM 缓冲区,修改缓冲区对应偏移,擦除 Flash 扇区,把缓冲区完整回写; ④ 不需要擦除:直接字节编程写入; ⑤ Flash 上锁 FMC_Lock。
- Flash_EE_Read / Flash_EE_ReadByte 直接指针解引用读取 Flash 地址字节,循环批量读取,无擦除操作。
5. 工程移植、链接脚本配置要点
- 扇区选择:仅允许扇区 1、2、3,禁止扇区 0、5‑11;
- 内存约束:RAM 必须预留等于扇区大小的全局缓冲区;使用 16KB 扇区,RAM 至少多出 16KB;
- 链接脚本 sct 修改:通过
__attribute__((section))或者修改 scatter 文件,把模拟 EEPROM Flash 区域排除出代码编译区间,防止编译器把程序代码覆盖数据扇区; - 起始地址必须严格扇区对齐,总容量必须是扇区尺寸整数倍;
- 不要使用 OTP、选项字节来存储业务参数。
6. 调试验证方法
- 编译下载例程;
- 串口工具配置 115200‑8‑1‑N;
- 观察打印输出;
- 可修改
FLASH_EE_TEST_ADDR跨扇区地址,验证跨扇区读写稳定性。
阅读全文
53