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

Flash 模拟 EEPROM 初始化参数、软硬件例程与工程移植要点

10/26 15:05
53
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. 例程硬件设计说明

例程硬件由两部分构成:

  1. APM32F4xx 片内 Flash 存储;
  2. USART 串口电路,PA9 (TX)、PA10 (RX) 外接 ST3232ECTR 芯片,USB‑TTL 转换,用于打印测试结果。

测试串口配置参数:波特率 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

参数说明:

  1. FLASH_SECTOR_SIZE:选用扇区大小,本示例 16KB;
  2. FLASH_EE_TOTAL_SIZE:模拟 EEPROM 总容量,必须为扇区大小整数倍;示例取 2 个扇区;
  3. FLASH_EE_START_ADDR:起始地址,必须扇区边界对齐;
  4. RAM 缓冲区定义:uint8_t Flash_EE_Ram_Buffer[FLASH_SECTOR_SIZE];大小和扇区完全一致;
  5. Flash 参数数组通过__attribute__((section(".ARM....")))指定段地址,防止编译链接时应用代码占用模拟 EEPROM Flash 空间。

3. 软件例程整体执行流程

  1. 初始化 USART 串口;
  2. 填充测试写缓冲区;
  3. 调用Flash_EE_Write()写入测试数据;
  4. 调用Flash_EE_Read()读出数据;
  5. 比对写入、读出缓冲区内容;
  6. 串口打印:Test Successful!或者Test Error!。

4. 核心函数逻辑

  1. Flash_EE_Write 核心输入:写入地址、数据源指针、写入字节长度。 逻辑:计算扇区内偏移地址;区分地址是否扇区对齐;判断是否跨扇区;拆分调用单扇区写函数Flash_EE_WriteOneSector()。
  2. Flash_EE_WriteOneSector ① Flash 解锁 FMC_Unlock; ② 扫描扇区判断是否需要擦除; ③ 需要擦除:读取整个扇区到 RAM 缓冲区,修改缓冲区对应偏移,擦除 Flash 扇区,把缓冲区完整回写; ④ 不需要擦除:直接字节编程写入; ⑤ Flash 上锁 FMC_Lock。
  3. Flash_EE_Read / Flash_EE_ReadByte 直接指针解引用读取 Flash 地址字节,循环批量读取,无擦除操作。

5. 工程移植、链接脚本配置要点

  1. 扇区选择:仅允许扇区 1、2、3,禁止扇区 0、5‑11;
  2. 内存约束:RAM 必须预留等于扇区大小的全局缓冲区;使用 16KB 扇区,RAM 至少多出 16KB;
  3. 链接脚本 sct 修改:通过__attribute__((section))或者修改 scatter 文件,把模拟 EEPROM Flash 区域排除出代码编译区间,防止编译器把程序代码覆盖数据扇区;
  4. 起始地址必须严格扇区对齐,总容量必须是扇区尺寸整数倍;
  5. 不要使用 OTP、选项字节来存储业务参数。

6. 调试验证方法

  1. 编译下载例程;
  2. 串口工具配置 115200‑8‑1‑N;
  3. 观察打印输出;
  4. 可修改FLASH_EE_TEST_ADDR跨扇区地址,验证跨扇区读写稳定性。

相关推荐