当前位置: 首页 > 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的某个扇区进行数据写入时,如果扇区的起始地址中已经存在一些数           据,那把需要写入的数据写在已经存在的数据的地址之后,是否需要擦除扇区??            不需要

相关文章:

  • 3.4 爬虫实战-爬去智联招聘职位信息
  • 演示:基于WPF的DrawingVisual开发的频谱图和律动图
  • 【分布式微服务云原生】10分钟打造坚不可摧的系统:深入探索系统的鲁棒性
  • 在树莓派上基于 LNMP 搭建 Nextcloud
  • 图灵完备-奇数个信号
  • 百度智能体创建:情感领域的创新力量
  • 【大模型对话 的界面搭建-Open WebUI】
  • 【C++算法】5.双指针_乘最多水的容器
  • OIDC9-OIDC集成登录功能(SpringBoot3.0)
  • 【Linux网络】详解TCP协议(3)
  • GitLab CI/CD脚本入门
  • JAVA工具类——Collections
  • AI学习指南深度学习篇-丢弃法Python实践
  • FTP访问方式详解
  • 【JVM】JVM执行流程和内存区域划分
  • 【mysql】环境安装、服务启动、密码设置
  • Android单元测试 - 几个重要问题
  • js对象的深浅拷贝
  • LeetCode算法系列_0891_子序列宽度之和
  • LintCode 31. partitionArray 数组划分
  • ReactNativeweexDeviceOne对比
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • spring学习第二天
  • sublime配置文件
  • vue-cli3搭建项目
  • Yeoman_Bower_Grunt
  • 从伪并行的 Python 多线程说起
  • 对象管理器(defineProperty)学习笔记
  • 我感觉这是史上最牛的防sql注入方法类
  • - 转 Ext2.0 form使用实例
  • Spring第一个helloWorld
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #FPGA(基础知识)
  • (13)Hive调优——动态分区导致的小文件问题
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (pojstep1.1.2)2654(直叙式模拟)
  • (编译到47%失败)to be deleted
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • .Net Core和.Net Standard直观理解
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 中创建支持集合初始化器的类型
  • .NET开发人员必知的八个网站
  • .ui文件相关
  • /etc/fstab 只读无法修改的解决办法
  • /proc/vmstat 详解
  • @ConfigurationProperties注解对数据的自动封装
  • [ Linux ] Linux信号概述 信号的产生
  • [17]JAVAEE-HTTP协议
  • [AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
  • [BJDCTF2020]The mystery of ip
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C#]使用C#部署yolov8-seg的实例分割的tensorrt模型
  • [C/C++入门][ifelse]20、闰年判断
  • [CodeForces-759D]Bacterial Melee