- 寄存器分类
一般寄存器分为只读存储器 (ROM) 随机存储器(RAM)
- 只读存储器
只读存储器也被称为ROM 在正常工作时只能读不能写。
只读存储器经历的阶段 ROM->PROM->EPROM->EEPROM ->Flash
优点:掉电不丢失,解构简单
缺点:只适用于固定数据的存储
- ROM
在出场的时候就进行数据的写入写入完后不能修改
- PROM
可以修改但是需要特定的编程器 , 采用熔丝工艺
- EPROM紫外线可擦除只读存储器
EPROM采用的是紫外线擦除 也是需要特定的编程器,才能修改
- 电可擦除只读存储器(EEPROM)
EEPROM采用了电压信号擦除,由于擦除和写入时需要加入高电压脉冲,而且擦除和写入的时间较长,一般只作为ROM来只用
可以进行某个存储单元进行擦除 成本高 容量小
- Flash 闪存
Flash吸收了EPROM结构简单编程可靠的优点 又保留了EEPROM的隧道效应擦除的快捷性 而且集成度可以做到很高
Flash只能擦除某个扇区 不能擦除存储单元
- 随机存取器RAM
随机存储器:可读可写但是掉电会丢失 他的最大的优点就是读写方便
RAM又分为静态随机存储SRAM和动态随机存储DRAM
可以看到Flash是1M
程序一般都是从Flash扇区0开始存储的 , 要是存储比较重要的数据一般我们都是从后面往前面存储
内部Flash的流程
如果用户打算对Flash空间进行编程或者擦除,对应的流程可以参考帮助手册以及文件注释
Flash解锁
Flash擦除
需要注意,在擦除扇区之前,需要设置编程/擦除的并行位数(字节、字、半字、双字),决定了擦除的时间。
然后,在进行扇区擦除的时候需要指定扇区号(扇区0~扇区11),扇区号可以通过扇区的地址进行计算
如果在擦除扇区的过程中打算跳转到下一个扇区,需要对扇区号进行计算和偏移(+8)
打算对扇区进行擦除操作,可以调用函数库中提供的函数接口来选择擦除某个扇区或者擦除所有扇区,如下图所示:
函数原型
FLASH_Status FLASH_EraseSector(uint32_tFLASH_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_tAddress, uint32_t Data)
函数参数
参数一: Address 指的是准备写入数据的扇区地址
参数二: Data 指的是准备写入的数据内容
返回值 返回lFlash的操作状态 如 FLASH_COMPLETE 标志操作完成
Flash上锁
如果已经完成Flash扇区的数据写入,为了防止出现意外状况导致扇区数据出现丢失等问题,则需要重新开启Flash寄存器的写保护功能。
Flash读取
如果已经把数据写入到Flash扇区的某个地址下,则可以通过访问扇区对应的地址空间来读取对应的数据,这里就设计到C语言的地址访问,可以通过指针进行操作。操作如下图所示:
注意:读取扇区地数据的时候扇区地址需要进行偏移,并且要访问符合扇区地址范围的空间。
思考:如果在对flash的某个扇区进行擦除之后,那这个扇区的地址下面的值默认是多少?
思考:如果在对flash的某个扇区进行数据写入时,如果扇区的起始地址中已经存在一些数 据,是否需要擦除扇区?? 答案:需要先擦除扇区再重新写入数据
思考:如果在对flash的某个扇区进行数据写入时,如果扇区的起始地址中已经存在一些数 据,那把需要写入的数据写在已经存在的数据的地址之后,是否需要擦除扇区?? 不需要