您的位置:首页 > 其它

F4_Flash模拟EEPROM

2017-05-06 12:15 190 查看
1.FLASH存储器:不加电的情况下能长期保持存储的信息。Flash Memory属于EEPROM类型。它既有ROM的特点,又有很高的存取速度,而且易于擦除和重写, 功耗很小。

2.EEPROM(Electrically Erasable Programmable Read-Only Memory)电可擦可编程只读存储器,不加电的情况下同样能长期保持存储的信息。

3.Flash和EEPROM的主要区别是什么呢?

狭义的EEPROM:这种rom的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。因此目前的EEPROM都是几K到几百K的,绝少有超过512K的。

FLASH属于广义的EEPROM,因为它也是电擦除的ROM。但是为了区别于一般的按字节为单位的擦写的EEPROM,我们都叫它FLASH。FLASH做的改进就是擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。上M的ROM一般都是FLASH.

flash分为nor flash和nand flash。

nor flash数据线和地址线分开,可以实现ram一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块擦。

nand flash同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取(nandflash按块来擦除,按页来读,norflash没有页)

由于nandflash引脚上复用,因此读取速度比nor flash慢一点,但是擦除和写入速度比nor flash快很多。nand flash内部电路更简单,因此数据密度大,体积小,成本也低。因此大容量的flash都是nand型的。小容量的2~12M的flash多是nor型的。

使用寿命上,nand flash的擦除次数是nor的数倍。而且nand flash可以标记坏块,从而使软件跳过坏块。nor flash 一旦损坏便无法再用。

因为nor flash可以进行字节寻址,所以程序可以在nor flash中运行。嵌入式系统多用一个小容量的nor flash存储引导代码,用一个大容量的nand flash存放文件系统和内核。

4.为什么要用Flash来模拟EEPROM呢?

答:因为在许多应用场合下需要用EEPROM保存非易失性的数据,但是ST为了控制成本,没有在STM32F4系列芯片中集成EEPROM,所以我们就需要用其内部集成的FLASH通过软件模拟EEPROM来达到同样的效果。

5.FLASH闪存的读取:

STM32F4可以通过内部的D-CODE总线来访问内部闪存中存储的数据,访问数据就肯定得符合时序,为了准确读取 Flash 数据,必须根据CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)!

6.FLASH模块的构成



7.FLASH的写入流程

复位后, Flash 控制寄存器 (FLASH_CR) 不允许执行写操作,以防因电气干扰等原因出现对Flash 的意外操作,所以复位之后系统把FLASH_CR给“锁”住了。所以先要进行扇区的解锁,FLASH_CR(u32,地址:0x40023C00+0x10)的最高位为0时表示解锁成功,该位不能直接进行写0操作,需要用FLASH_KEYR(u32,地址:0x40023C04)来进行对FLASH_CR的解锁工作,方法为向FLASH_KEYR中依次写入ST提供的“密钥”来完成,“密钥”为KEY1和KEY2,具体数值见参考手册,见下图:



void FLASH_Unlock(void)
{
if((FLASH->CR &
8950
FLASH_CR_LOCK) != RESET)
{
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
}
}


当解锁完flash之后,flash就可以被写入用户所希望保存的数据了,但是在写入之前,我们必须先进行一次擦除操作(写1),为什么要进行一次擦除(写1)操作呢?因为我们并不能保证原来的存储区域中全是1,那么为什么我们又得要保证写入之前原来的存储区域里全是1呢?因为我们的写操作只能将1写为0,不能将0写为1,也就是说,如果原来的存储区域中事先已经有一个0xFE的“不干净”数据(干净指0XFF),那么如我们没有擦除就往里面写数据0x01的话,写完后读出来的数据就会是0x00(0XFE & 0X01)!

好了,那么我们想往flash里面写数据之前就先得擦除,但是擦除之前,还得做一件很重要的事情(怎么那么多xx事情。。),那就是要先禁止数据缓存。FLASH->ACR &= 0XFFFFFBFF。

向flash中写完数据之后,别忘了再打开数据缓存,并且再锁上FLASH_CR(为了安全)。

8.FLASH的读取流程

//func:从指定地址读取指定长度的数据
//param:ReadAddr起始地址
//      pBuffer数据指针(空盒子)
//      NumToRead字数(4位字)
void ST_FLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)
{
u32 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=ST_FLASH_ReadWord(ReadAddr);
ReadAddr+=4;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: