使⽤stm32f4的flash模拟eeprom钟薛高疑似火烧不化
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。
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 & 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)!
7一9岁儿童画国庆节简单好了,那么我们想往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;
}
女星名单
}
发布评论