本文主要是针对国民N32G45x/G4FR系列MCU片内Flash模拟EEPROM的一种方法介绍。以便工程师快速的上手。下面,我们先看下如何对闪存进行读取、编程和擦除。
Flash 闪存的读取
系统可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读 写,即通过 D-Code 数据总线来访问内部闪存模块。
读 Flash 时,读的等待周期数可以通过寄存器配置。使用时,需要结合 AHB 接口时钟频率进行计算,等待 时间必须不小于 25ns。比如:
● 当 HCLK<=32MHz 时,等待周期数最小为 0;
● 当 32MHz
● 当 64MHz ● 当 96MHz ● 当 128MHz 在国民技术的 SDK 开发套件中,系统初始化文件提供的始终初始化函数已经对该参数进行了主频适配:
如后续用户希望对该参数进行修改,可调用库函数 API: “FLASH_SetLatency”
所以,在我们设置144Mhz 频率作为CPU时钟之前,必须先设置LATENCY为4,否则FLASH 读写可能出错,导致死机。
FLASH 的读取比较简单的。例如,我们要从地址 addr,读取一个字(32bit)可以使用如下方法来读取:
Data = *(vu32*)addr;
将 addr 强制转换为 vu32指针,然后取该指针所指向的地址的值,即得到了 addr 地址内的值。类似的, 将 上面的 vu32 改为 vu16 或者 vu8,即可读取指定地址的一个半字或字节。
解锁和锁定
在对 FLASH 进行擦写操作前必须先解锁, 以防因电气干扰等原因产生对 Flash 的意外操作。通过写入特定 的键值序列到解锁寄存器, 在 FLASH_KEYR 寄存器写入特定的序列( 0X45670123 和 0XCDEF89AB)。
固件库提供了解锁函数和锁定函数:
● void FLASH_Unlock(void);
● void FLASH_Lock(void);
其实就是封装了对FLASH_KEYR 寄存器的操作。 在操作 flash 之前调用解锁函数, 在对 FLASH 擦写操作完成 之后, 要锁定 flash 进行保护。
闪存的擦除
主存储区可以按页擦除,也可以整片擦除。
● 页擦除: 擦除一页应遵守下述过程:
❈ 检查 FLASH_ STS 寄存器的 BUSY位,以确认没有其他正在进行的闪存操作;
❈ 设置 FLASH_CTRL 寄存器的 PER 位为'1';
❈ 用 FLASH_ADD 寄存器选择要擦除的页;
❈ 设置 FLASH_CTRL 寄存器的 START 位为'1';
❈ 等待 BUSY 位变为'0';
❈ 读出被擦除的页并做验证。
固件库提供了操作 API 函数:
/**
输入参数: Page_Address 需要擦除的页地址, flash 每页大小为 2Kbyte,所以该地址要是 2K 的整数倍
返回: FLASH_STS 操作结果, 如操作成功, 则返回完成标志“ FLASH_COMPL”;如操作异常, 则返回相
应的异常标志
*/
FLASH_STS FLASH_EraseOnePage(uint32_t Page_Address)
● 整片擦除:可以用整片擦除功能擦除整个主存储区。建议使用下述过程:
❈ 检查 FLASH_ STS 寄存器的 BUSY位,以确认没有其他正在进行的闪存操作;
❈ 设置 FLASH_CTRL 寄存器的 MER 位为'1';
❈ 设置 FLASH_CTRL 寄存器的 START 位为'1';
❈ 等待 BUSY 位变为'0';
❈ 读出所有页并做验证。
固件库提供了操作 API 函数:
/**
输入参数:无
返回: FLASH_STS 操作结果, 如操作成功, 则返回完成标志“ FLASH_COMPL”;如操作异常, 则返回相
应的异常标志
*/
FLASH_STS FLASH_MassErase(void)
主存储区编程
对主存储区编程每次需要写入32位。当FLASH_CTRL寄存器的PG位为'1'时,在一个闪存地址写入一个字将 启动一次编程; 写入地址需要按字操作, 任何半字、字节的数据,都会产生总线错误。在编程过程中(BUSY
位为'1'),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。
主存储区编程过程:
● 检查 FLASH_ STS 寄存器的 BUSY位,以确认没有其他正在进行的闪存操作;
● 设置 FLASH_CTRL 寄存器的 PG 位为'1';
● 在指定的地址写入要编程的字;
● 等待 BUSY 位变为'0';
● 读出写入的地址并验证数据。
固件库提供了操作 API 函数:
/**
输入参数: Address 以字为单位的 Flash 地址,即需要被 4 整除
Data 需要被写入的 32bit 数据
返回: FLASH_STS 操作结果,如操作成功,则返回完成标志“ FLASH_COMPL”;如操作异常,则返回相
应的异常标志
*/
FLASH_STS FLASH_ProgramWord(uint32_t Address, uint32_t Data)
通过上面的介绍, 我们基本上知道了 Flash 的读写所要执行的步骤 ,并介绍了固件库中对应的操作函数, 用 户可以利用这些函数来实现应用层对于保存数据的功能。