本文重要是针对国民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 的读写所要执行的步骤 ,并介绍了固件库中对应的操作函数, 用 户能够利用这些函数来实现利用层对于保留数据的职能。