day13 flash
1. 存储器的概念
存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。
由于计算机的处理的数据量较大,并且运算速度都很快,就要求存储器的容量更大,并且存取数据的速度更快。
2. 存储器的分类
一般存储器按照功能划分可以分为两种: 只读存储器(ROM) 随机存储器(RAM)
只读存储器(ROM):内容只能读出不能写入
◦ 掩模ROM
◦ 可编程ROM(PROM)
◦ 可擦除PROM(EPROM)
◦ 电可擦除PROM(EEPROM)
◦ 闪存(Flash Memory)
随机存取存储器(RAM):可以随机读写,存取时间与存储位置无关
◦ 静态RAM(SRAM)
◦ 动态RAM(DRAM)
2.1只读存储区
只读存储器也被称为ROM(Read Only Memory),在正常工作时只可以读取数据,不能随意修改ROM中的数据。为了提供工作效率以及降低成本,所以只读存储器也经历几个阶段的发展:ROM ---> PROM--->EPROM--->EEPROM--->Flash
优点:结构简单,并且掉电不丢失 缺点:只适用于固定数据的存储
1. 掩模ROM(MASK ROM)
时间:1950年代
特点:数据在制造时固化,不可修改,灵活性差。
应用:早期计算机、游戏卡带等固定程序存储15。
2. 可编程ROM(PROM)
时间:1956年(由华裔科学家周文俊发明)
特点:允许用户编程一次,但无法擦除,写错则报废。
应用:导弹制导系统、工业控制设备15。
3. 可擦除可编程ROM(EPROM)
时间:1971年(英特尔推出C1702)
特点:可通过紫外线擦除并重新编程,但需要专用设备。
应用:早期微控制器、嵌入式系统开发16。
4. 电可擦除可编程ROM(EEPROM)
时间:1972年(日本电工实验室发明)
特点:支持电擦除,无需紫外线,可逐字节修改。
应用:BIOS存储、参数配置存储18。
5. 闪存(Flash Memory)
时间:1980年(舛冈富士雄发明)
特点:
NOR Flash:支持随机访问,适合存储代码(如BIOS)。
NAND Flash:高密度、低成本,适用于大容量存储(如SSD、U盘)。
应用:智能手机、固态硬盘、SD卡等18。
2.2随机存储器
随机存储器也称随机读/写存储器,简称RAM。在RAM工作时可以随时从任何一个指定地址读出数据,也可以随时将数据写人任何一个指定的存储单元中去。它的最大优点是读写方便,使用灵活。但是它也存在数据易失性的缺点(即一旦停电以后所存储的数据将随之丢失)。RAM又分为静态随机存储器SRAM和动态随机存储器DRAM两大类。
3. 内部Flash使用
STM32F407芯片内部的Flash容量具有512KB,必须要了解内部flash内存分布,如下图所示
需要注意:该芯片只有3个128KB的扇区可以使用,对扇区进行访问或者擦除时,需要计算出扇区的起始地址以及结束地址。
另外,用户程序一般都是下载到Flash闪存空间中的,一般从Flash闪存的扇区0开始存储。
注意,用户在存储自定义数据的时候,尽量先从Flash闪存的后面的扇区进行操作,避免对用户程序造成影响。
4、 内部Flash的流程
如果用户打算对Flash空间进行编程或者擦除,对应的流程可以参考帮助手册以及文件注释
• Flash解锁
• Flash擦除
需要注意,在擦除扇区之前,需要设置编程/擦除的并行位数(字节、字、半字、双字),决定了擦除的时间。
如果在擦除扇区的过程中打算跳转到下一个扇区,需要对扇区号进行计算和偏移(+8)
打算对扇区进行擦除操作,可以调用函数库中提供的函数接口来选择擦除某个扇区或者擦除所有扇区,如下图所示
函数原型
FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange) 函数参数
参数一:FLASH_Sector 需要擦除的扇区号 如 FLASH_Sector_0 ~ FLASH_Sector_11
参数二:VoltageRange 需要擦除的并行位数 如 VoltageRange_3 以字(32bit)为单位
返回值 返回lFlash的操作状态 如 FLASH_COMPLETE 标志操作完成
• Flash写入
需要注意,在写入扇区之前,需要设置编程/擦除的并行位数(字节、字、半字、双字),决定了写入的时间。
Flash闪存往某个扇区写入数据的操作流程如下
打算对扇区进行写入操作,可以调用函数库中提供的函数接口来选择把数据写入某个扇区
函数原型 FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
函数参数 参数一: Address 指的是准备写入数据的扇区地址
参数二: Data 指的是准备写入的数据内容
返回值 返回lFlash的操作状态 如 FLASH_COMPLETE 标志操作完成
• Flash上锁
如果已经完成Flash扇区的数据写入,为了防止出现意外状况导致扇区数据出现丢失等问题,则需要重新开启Flash寄存器的写保护功能。
• Flash读取
如果已经把数据写入到Flash扇区的某个地址下,则可以通过访问扇区对应的地址空间来读取对应的数据,这里就设计到C语言的地址访问,可以通过指针进行操作。操作如下图所示:
注意:读取扇区地数据的时候扇区地址需要进行偏移,并且要访问符合扇区地址范围的空间。