本文主要是针对国民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 的读写所要执行的办法 ,,,,,,,并先容了固件库中对应的操作函数,,,,,,, 用 户可以使用这些函数来实现应用层关于生涯数据的功效。。。。。。。