APM32F427 MCU片内Flash驱动开发与测试报告

2026-05-20 11:00:28/ By Admin

  1.硬件平台与存储资源概览

  本项目基于APM32F427ZG TINY开发板进行开发。该芯片提供了丰富的存储资源,具体参数如下:

  SRAM容量:448KB+4KB

  Flash容量:最大1MB

  扇区分布:包含16KB、64KB和128KB三种不同大小的扇区。

  2.Flash驱动设计与封装

  为了方便应用层调用,驱动层对Flash的底层操作进行了封装,屏蔽了具体的扇区细节。核心操作包括擦除、写入和读取。

  2.1 Flash擦除操作(bsp_flash_erase)

  逻辑设计:根据起始地址自动计算所属扇区,并执行对应的扇区擦除动作。

  关键安全措施:

  在擦除期间,通过__disable_irq()禁止全局中断,防止中断触发导致系统异常。

  异常处理:若擦除失败,会自动清除状态标志并进行重试。

  扇区对齐处理:

  地址 <0x08010000:16KB扇区,按16KB对齐。

  地址 <0x08020000:64KB扇区。

  地址>=0x08020000:128KB扇区,按128KB对齐。

  2.2 Flash写操作(bsp_flash_write)

  前置条件:必须先调用擦除函数,确保目标区域数据全为0xFF。

  对齐处理:函数内部根据地址和剩余长度,自动判断并执行单字节(Byte)、半字(Half-Word)或字(Word)写入,解决了地址对齐问题。

  中断保护:写入期间同样禁止全局中断。

  2.3 Flash读操作(bsp_flash_read)

  实现方式:直接通过memcpy将指定地址的数据拷贝至缓存区,逻辑最为简单。

  3.调试环境配置(SRAM调试)

  为了完整测试所有Flash地址范围(包括运行程序所在的区域),必须将程序运行环境从Flash切换至SRAM。

  3.1内存布局规划

  基于编译结果(Code+RO-data占用约2KB+),SRAM分配策略如下:

  IROM1(程序区):SRAM前3KB。

  IRAM1(数据区):SRAM剩余部分。

  3.2 Keil调试配置

  Utilities设置:取消勾选“Update Target before Debugging”,因为程序无需下载到Flash。

  Initialization File(初始化脚本):这是最关键的一步,用于配置堆栈指针、中断向量表,并将程序加载至SRAM运行。

FUNC void Setup (void) {
    SP = _RDWORD(0x20000000);         // 设置堆栈指针
    PC = _RDWORD(0x20000004);         // 设置程序计数器
    _WDWORD(0xE000ED08, 0x20000000);  // 设置中断向量表
}
// LOAD %L INCREMENTAL
Setup(); 
g, main

  ⚠️注意事项:在SRAM调试模式下,点击Debug按钮即可运行,无需下载代码。此模式下仿真器的RESET功能无效,如需复位需退出Debug重新进入。

  4.Flash功能测试

  4.1测试策略

  采用“擦除-> 写入-> 读取-> 比较”的闭环测试逻辑。

  4.2测试流程

  擦除:从TEST_FLASH_ST_ADDR开始擦除指定大小的扇区。

  写入:填充递增的魔数(Magic Number),执行写入操作。

  读取与校验:读取数据至缓存,并与写入的数据进行memcmp比较。

  结果判定:若所有扇区均通过校验,标志位flag_flash_test_e_w_r置为2;若任一环节失败,置为-1。

  5.移植与注意事项

  SRAM划分:移植前需确认程序总大小,确保SRAM划分合理。

  程序检查:生成的hex文件可使用J-flash工具打开以检查程序大小。

icon_up
close_white