当前位置: 首页 > news >正文

STM32F407之Flash

  • 寄存器分类

一般寄存器分为只读存储器 (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的某个扇区进行数据写入时,如果扇区的起始地址中已经存在一些数           据,那把需要写入的数据写在已经存在的数据的地址之后,是否需要擦除扇区??            不需要

http://www.lryc.cn/news/448686.html

相关文章:

  • 优化 Go 语言数据打包:性能基准测试与分析
  • 【SQL】未订购的客户
  • Qt(9.28)
  • javascript-冒泡排序
  • 第九届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)
  • MATLAB云计算集成:在云端扩展计算能力
  • 基于BeagleBone Black的网页LED控制功能(flask+gpiod)
  • 【C语言】单片机map表详细解析
  • Java中的继承和实现
  • uniapp云打包
  • 端口安全技术原理与应用
  • 数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall
  • 数字乡村解决方案-3
  • WPF文本框无法输入小数点
  • R开头的后缀:RE
  • Vue2配置环境变量的注意事项
  • 机器学习:探索未知边界,解锁智能潜力
  • 万户OA-ezOFFICE fileUpload.controller 任意文件上传漏洞复现
  • Time-MoE : 时间序列领域的亿级规模混合专家基础模型
  • Spring Boot入门指南
  • MYSQL(学习笔记)
  • 学校周赛(1)
  • 人生苦短,我用Python✌
  • uniapp js判断key是否在json中?
  • Codeforces Round 975 (Div. 2) C. Cards Partition
  • Qt 首次配置 Qt Creator 14.01 for Python
  • 【python】代码发布前检查- vulture:查找死代码
  • Yolov10环境配置
  • iOS 提取图片的主题色,并支持灵活提取
  • 语雀笔记使用记录