1
摘要
本篇应用笔记主要介绍如何使用 HC32F460 系列芯片的嵌入式 FLASH 读写数据。
2
FLASH 简介
什么是 FLASH?
FLASH 接口通过 FLASH ICODE、DCODE、MCODE 总线对 FLASH 进行访问,该接口可对 FLASH 执行编程、擦除和全擦除操作;通过缓存机制加速代码执行。
FLASH 的重要特征?
FLASH 读、编程、擦除和全擦除操作,支持引导交换,安全保护和数据加密。
3
HC32F460 系列的 FLASH
3.1
简介
FLASH 接口通过 FLASH ICODE、DCODE、MCODE 总线对 FLASH 进行访问,该接口可对FLASH 执行编程、擦除和全擦除操作;通过指令预取和缓存机制加速代码执行。
3.2
说明
FLASH 读、编程、扇区擦除和全擦除操作。CODE 总线 16Bytes 预取值,I_CODE 和 D-CODE 总线上共享 64 个缓存(128bit 宽)。支持 FLASH 低功耗读。支持引导交换。支持安全保护及数据加密。容量为 512Kbytes(其中有 32bytes 为功能保留位),分为 64 个扇区,每个扇区为 8KBytes。编程单位为 4Bytes,擦除单位为8KBytes。128bit 宽数据读取。OTP(One Time Program)区域共 1020Bytes,分为 960Bytes 数据区,并配有 60Bytes 的锁存区。
3.2.1 寄存器介绍
1)
EFM_FAPRT:访问 EFM 寄存器保护寄存器。
2)
EFM_FSTP:FLASH 停止寄存器。
3)
EFM_FRMC:读模式寄存器。可配置插入等待周期,缓存功能、预取指功能等。
4)
EFM_FWMC:擦写模式寄存器。配置编程擦除模式。
5)
EFM_FSR:状态寄存器。查看 FLASH 状态,结束标志、错误标志等。
6)
EFM_FSCLR:状态清除寄存器。
7)
EFM_FITE:中断许可寄存器。配置操作结束或错误中断许可。
8)
EFM_FSWP:引导交换状态寄存器。通过该寄存器可判断程序复位后从扇区 0 还是扇区 1 启动。
9) EFM_FPMTSW:FLASH 窗口保护起始地址寄存器。
10) EFM_FPMTEW:FLASH 窗口保护结束地址寄存器。
11) EFM_UQID1~3:Unique ID 寄存器。
3.2.2 工作流程介绍
3.2.2.1 寄存器解除保护和写保护
本模块的寄存器受 EFM_FAPRT 寄存器保护,当处于保护状态,屏蔽普通的写操作。
-
在实际应用中,发现寄存器值未写入成功,应首先检查 EFM 寄存器访问保护是否有效,
保护有效时,EFM_FAPRT 寄存器值读出为 0x00000000。
3.2.2.2 扇区擦除
EFM 提供扇区擦除和全擦除两种擦除方式。对 FLASH 进行扇区擦除操作后,该扇区内地址(8Kbytes 空间)数据刷新为全 1。
3.2.2.3 全擦除
EFM 提供扇区擦除和全擦除两种擦除方式。对 FLASH 进行全擦除操作后整个FLASH 区域素有地址数据刷新为全 1。
3.2.2.4 单次编程无回读
单编程无回读模式设定步骤如下:
3.2.2.5 单次编程回读
单编程回读模式是指编程结束后自动读取编程地址并和写入数据对比,输出判断一致标志位EFM_FSR.PGMISMTCH。
单编程回读模式设定步骤如下:
注意:
- EFM_FSR.PGMISMTCH 为 0,表示编程成功,为 1 表示该 FLASH 地址已遭破坏,永废弃。
3.2.2.6 连续编程
当连续对 FLASH 地址进行编程时,推荐使用连续编程模式。连续编程模式比单编程模式可以节约时间 50%以上。连续编程模式时,频率不能低于 12MHz。
3.2.2.7 总线保持/释放功能
通过设定寄存器 EFM_FWMC.BUSHLDCTL 位,可设定 FLASH 编程、擦除期间,总线处于保持还是释放状态。
FLASH 编程、擦除指令在 FLASH 上执行时,该控制位必须设定为 0。擦除指令在 FLASH 意外空间(例如 RAM)执行时,可根据需求自由设定。
当 EFM_FWMC.BUSHLDCTL 为 1(即 FLASH 编程、擦除期间,总线释放状态)时,在编程(连续编程除外)、擦除结束前(EFM_FSR.RDY=1)对 FLASH 的读写访问将会被保护,标志位 EFM_FSR.BUSCOLERR 位置位。
3.2.3 一次性可编程字节(OTP)
OTP(One Time Program)区域分为 15 个 64 字节的数据块,每块数据对应一个 4Bytes 的锁存地址。
锁存地址用于锁存对应的数据块。锁存地址数据全为 1 时,对应的 OTP 区域数据块可以编程;当锁存地址数据全为 0 时,对应的 OTP 区域数据不可编程。
所有 OTP 数据块和锁存地址均无法擦除。OTP 区域的编程已封装在 flashloader 中,用户可以直接操作 otp 对应地址。具体样例请参考EFM 模块下的 efm_otp 样例代码。
3.2.4 引导交换
EFM 提供引导交换功能,用户在升级引导程序的时候,对扇区 0(0x00000000~0x00001FFF)进行擦写,如擦写时遇到不可期的意外(掉电、复位),有可能会导致整个芯片不能正常启动。引导交换功能可以避免这种情况。
在对扇区 0 擦除前预先把新的引导程序写入扇区 1(0x00002000~0x00003FFF),然后对 EFM地址 0x0007FFDC 进行编程数据 0xFFFF4321,通过端子复位,实现 CPU 从扇区 1 启动新的引导程序,此时,再对扇区 0 进行擦除,重新编程用户程序。再次升级启动引导程序时,由于保存启动扇区交换信息的地址 0x0007FFDC 已经被编程过了(用户可以根据读 FLASH 地址或者 EFM_FSWP 寄存器判断是否使用过启动交换功能,EFM_FSWP.FSWP = 0,表明扇区 0 和扇区 1 已经交换,复位后从扇区 1 启动),需对扇区 63 (0x0007E000~0x0007FFFF)进行扇区擦除后再进行启动程序的升级。在对扇区 0 进行擦除前,预先把新的引导程序写入扇区 1,然后对扇区 63 进行擦除,通过端子复位,CPU 就从扇区 1 启动新的引导程序,此时再对扇区 0 进行擦除,重新编程新的引导程序。
4
样例代码
4.1
代码介绍
用户可根据上述的工作流程编写自己的代码来学习验证该模块,也可以直接通过华大半导体的网站下载到设备驱动库(Device Driver Library, DDL)的样例代码并使用其中的 FLASH 的样例进行验证。
4.2 代码运行
用户可以通过华大半导体的网站下载到 HC32F460 的 DDL 的样例代码(efm_simple),并配合评估用板(EV-HC32F460-LQFP100-050-V1.1)运行相关代码学习使用 FLASH 模块。以下部分主要介绍如何在评估板上运行 FLASH 样例代码并观察结果:
-
确认安装正确的 IAR EWARM v7.7 工具(请从 IAR 官方网站下载相应的安装包,并参考用户手册进行安装)。
-
从华大半导体网站下载 HC32F460 DDL 代码。
-
下载并运行 efm\ efm_simple\中的工程文件.