Flash的学习

Flash的学习

1 概述

2 特性

STM32 的内部FLASH 包含主存储器、系统存储器以及选项字节区域。
在这里插入图片描述

2.1 主存储器

主存储器分为256 页,每页大小为2KB,共512KB。这个分页的概念,实质就是FLASH 存储器
的扇区,与其它FLASH 一样,在写入数据前,要先按页(扇区)擦除。

2.2 系统存储区

系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责串口、USB以及 CAN 等 ISP 等烧录功能。

2.3 选项字节

选项字节用于配置 FLASH 的读写保护、待机、停机复位、软件/硬件看门狗等功能,这部分共 16 个字节。可以通过修改 FLASH 的选项控制寄存器修改。

3 Flash是如何工作的?

3.1 解锁

由于内部Flash空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会给控制寄存器 FLASH_CR 上锁,这个时候不允许设置 Flash 的控制寄存器,从而不能修改 FLASH 中的内容。

所有对 Flash 写入数据前,需要先给它解锁。解锁的操作步骤如下:

  1. 往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
  2. 再往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB

3.2 上锁

上锁的时候是对 FLASH_CR 寄存器的 FLASH_CR_LOCK 位置1。

3.3 页擦除

在写入新的数据前,需要先擦除存储区域, STM32 提供了页(扇区)擦除指令和整个 FLASH 擦除(批量擦除)的指令,批量擦除指令针对主存储区。
页擦除的过程如下:

  1. 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何 Flash 操作;
  2. 在 FLASH_CR 寄存器中,将 “激活页擦除寄存器位 PER ”置1;
  3. 用 FLASH_AR 寄存器选择要擦除的页;
  4. 将 FLASH_CR 寄存器中的”开始擦除寄存器 STRT“置1,开始擦除;
  5. 等待 BSY 位被清零时,表示擦除完成。

3.4 写入数据

擦除完毕后即可写入数据,写入数据的过程并不仅仅使用指针向地址赋值,赋值前还需要配置一系列的寄存器,步骤如下:

  1. 检查 FLASH_SR 中的BSY位 ,以确认当前未执行任何其他的内部 Flash 操作;
  2. 将 FLASH_CR 寄存器中的”激活编程寄存器位 PG“置1;
  3. 向指定的Flash存储器地址执行数据写入操作,每次只能以 16 位的方式写入;
  4. 等待 BSY 位被清零时,表示写入完成。

4 FLASH擦写代码配置流程

  1. 调用 FLASH_Unlock() 解锁;
  2. 根据起始地址及结束地址计算要擦除多少页;
  3. 调用 FLASH_ClearFlag() 清除各种标志位;
  4. 使用循环调用 FLASH_ErasePage() 擦除页,每次擦除一页;
  5. 使用循环调用 FLASH_ProgramWord() 函数向起始地址至结束地址的存储区域写入变量 ”Data“ 存储的数值;
  6. 调用 FLASH_Lock 上锁;
  7. 使用指针读取写入的数据内容并校验

5 相关寄存器

5.1 解锁

  1. FLASH_KEYR FPEC键寄存器
    作用:对FLASH写入数据前,需要先给它解锁,这些位用于输入 FPEC 的解锁键

5.2 擦除和写入

  1. FLASH_SR.BSY 忙碌寄存器位
    作用:该位指示闪存操作正在进行,在闪存操作开始时,该位被设置为“1”;在操作结束或发生错误时该位被清除为“0”。
  2. FLASH_CR.PER 激活页擦除寄存器位
    作用:激活页擦除
  3. FLASH_CR.STRT
    作用:开始擦除
  4. FLASH_AR
    作用:当进行编程时选择要编程的地址,当进行页擦除时选择要擦除的页。
    note:当 FLASH_SR 中的 BSY 位为“1”时,不能写这个寄存器
  5. FLASH_CR.PG 激活编程寄存器位
    作用:激活编程操作

5.3 上锁

  1. FLASH_CR.LOCK 锁寄存器位
    作用:只能被写“1”。当该位为“1”时表示 FPEC和 FLASH_CR 被锁住。在检测到正确的解锁序列后,硬件清除此位为“0”。
    note:在一次不成功的解锁操作后,下次系统复位前,该位不能被改变。

5.4 清除各种标志位

  1. FLASH_SR.EOP 操作结束寄存器位
    作用:当闪存操作(编程/擦除)完成时,硬件设置这位为‘1’,写入‘1’可以清除这位状态。
    note:每次成功的编程或擦除都会设置 EOP 状态
  2. FLASH_SR.WRPRTERR 写保护错误寄存器位
    作用:试图对写保护的闪存地址编程时,硬件设置这位为‘1’,写入‘1’ 可以清除这位状态
  3. FLASH_SR.PGERR 编程错误寄存器位
    作用:试图对内容不是‘0XFFFF’的地址编程时,硬件设置该位为‘1’,写入‘1’可以清除这位状态。
    note:在进行编程操作之前,必须先清除 FLASH_CR 寄存器的STRT位

Note

  1. 擦除地址需要满足内存对齐,只能是扇区内存空间的整数倍。
  2. FlashDrive只能在调用的时候使用,其余情况下保障其不会被运行
  3. FlashDrive不能放在实际运行代码中,否则可能被串改数据

参考资料

STM32读写内部Flash(介绍+附代码)_Ch_champion的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UWB定位模块

UWB定位模组是华星智控自研的小尺寸高集成度模组,模组长宽厚为30.1513.955.62毫米,天线采用IPEX接口分体式设计,方便集成于您的产品中,产品采用本安设计,可以用于煤矿等井下场景,通信距离>100米&#xf…

什么是API接口?API接口的类型,如何调用API接口?

当今互联网技术的发展越来越快,越来越多的网站和应用程序需要获取外部数据来提供更好的服务和用户体验,这就需要使用API接口。本文将会对API接口的概念、类型以及如何调用API接口进行简要介绍。 一、什么是API接口? API(Applica…

不可忽视的PG表膨胀优化

我是一个目录 案例1. 什么是表膨胀?2. 表膨胀危害是什么?3. 表膨胀是怎么产生的?4. 如何优化膨胀表? 案例 先来看一例公有云服务登录web页面端卡住案例: 故障现象:WEB端登录非常缓慢,需要耗时5…

【AD】【PCB封装规范计划】 -CON排针类

像这种CON,排针的。画PCB封装的时候,要把数字用丝印标出来!!!

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器 1. 准备工作1.1 安装Node.js 2. 安装express2.1 初始化package.json2.2 安装express2.3 Express 应用程序生成器 1. 准备工作 1.1 安装Node.js Node.js 是一个开源、跨平台的 JavaScript 运行时环境。 下载链接:Node.js官网下载 建议下…

Java面试常用函数

1. charAt() 方法用于返回字符串指定索引处的字符。索引范围为从 0 到 length() - 1。 map.getOrDefault(num, 0) :如果map存在num这个key,则返回num对应的value,否则返回0. Arrays.sort(nums); 数组排序 Arrays.asList("a","b",&q…

Xilinx ZYNQ 7000学习笔记五(Xilinx SDK 烧写镜像文件)

概述 前面几篇讲了ZYNQ7000的启动过程,包括BootRom和FSBL的代码逻辑,其中关于FSBL代码对启动模式为JTAG被动启动没有进行分析,本篇将通过将JTAG的功能和通过Xilinx SDK烧写镜像文件到flash来顺道把FSBL中的JTAG代码部分给讲解下。 1.JTAG …

NuttX实时操作系统介绍(最详细)

比起安卓、iOS、鸿蒙等,NuttX知名度不算高,该系统于2007年由Gregory Nutt先生正式开源。发展至今,NuttX以功能丰富、性能稳定、商业化成熟度高赢得了市场的认可。 NuttX是一个成熟的实时操作系统,于07年由Gregory Nutt先生正式开源…

学习笔记-接口测试(postman、jmeter)

目录 一、什么是接口测试 二、前端和后端 三、get请求和post请求的区别 四、cookie和session 五、接口测试的依据 六、HTTP状态码 七、通用接口用例 八、postman接口测试 九、Jmeter接口测试 一、什么是接口测试 通常做的接口测试指的是系统对外的接口,比…

机器学习:PCA(Principal Component Analysis主成分)降维

参考:PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识: 一、PCA的主要思想 PCA,即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想…

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

基于深度强化学习的四旋翼无人机航线跟随

源自&#xff1a;指挥与控制学报 作者&#xff1a;杨志鹏 李波 甘志刚 梁诗阳 “人工智能技术与咨询” 发布 摘 要 针对无人机在空中执行航线跟随任务时无法对未知环境作出合理应对措施等问题, 提出了一种基于深度强化学习的四 旋翼无人机航线跟随方法. 通过无人机受力…

SpringMVC之JSON数据返回与异常处理机制---全方面讲解

一&#xff0c;JSON数据返回的理解 在Spring MVC中&#xff0c;当需要将数据以JSON格式返回给客户端时&#xff0c;可以使用ResponseBody注解或RestController注解将Controller方法的返回值直接转化为JSON格式并返回。这使得开发者可以方便地将Java对象转换为JSON&#xff0c;并…

【C++】STL之vector操作

文章目录 简介vector中的成员类型模板参数头文件的包含构造函数vector的访问方式&#xff1a;下标[ ]迭代器范围for 交换swap 简介 vector是stl中的一种数组容器&#xff0c;vector在英文中有矢量的意思&#xff0c;但实际上在数据结构中就是一种类似于数组的结构&#xff1b;…

AI大模型服务应用场景

大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型通常在各种领域&#xff0c;例如自然语言处理、图像识别和语音识别等&#xff0c;表现出高度准确和广泛的泛化能力。伴随…

Jmeter系列-定时器Timers的基本介绍(11)

简介 JMeter中的定时器&#xff08;Timer&#xff09;是一种重要的元件&#xff0c;用于模拟用户在不同时间间隔内发送请求的场景。通过使用定时器&#xff0c;可以模拟负载、并发和容量等不同情况下的请求发送频率。 使用定时器 可以在取样器下添加定时器&#xff0c;这样定…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

持安科技孙维伯:零信任理念下的实战攻防:ISC2023数字小镇演讲

近日&#xff0c;在ISC 2023第十一届互联网安全大会上&#xff0c;持安科技联合创始人孙维伯作为零信任办公安全赛道代表&#xff0c;亮相数字小镇New50&#xff0c;并发表《全方位防御&#xff1a;零信任理念下的实战攻防》主题演讲。 以下是本次演讲实录&#xff1a; 这几年…

系统灰度随笔记

系统灰度随笔记 这段时间系统重构&#xff0c;负责重构的其中一个模块需要与四个上游系统对接进行切换&#xff0c;虽然自己在这个过程中也设计了一套灰度方案来承接&#xff0c;将灰度的主动权控制在下游&#xff0c;但是很难同时应对四个上游系统&#xff0c;因为每个上游系…

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…