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…

统计十进制数的二进制表示中1的个数 ← 清华 邓俊辉

【题目描述】 统计十进制数的二进制表示中1的个数。【算法分析】 虽然曾在 https://blog.csdn.net/hnjzsyjyj/article/details/110148954 发过一篇关于“统计十进制数的二进制表示中1的个数”的博客,但本文实现了一种新的思路。此思路来源于清华大学邓俊辉版《数据结…

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

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

不可忽视的PG表膨胀优化

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

前馈神经网络(FFNN)和多层感知机(MLP)

多层感知器(MLP, Multi-Layer Perceptron)和前馈神经网络(Feed-Forward Neural Network, FFNN)是深度学习中两个经常被使用的术语,它们经常被互换使用。让我们详细地了解这两个术语: 多层感知器 (MLP): M…

刷题统计(蓝桥杯)

刷题统计 问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数 a,b 和 n. 输出格式 输出一个整数代表…

leetcode做题笔记146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -…

【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先生正式开源…

Python手写K均值算法

Python手写K均值算法 1. 算法思维导图 #mermaid-svg-AZJG7sRwopfGiqyx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AZJG7sRwopfGiqyx .error-icon{fill:#552222;}#mermaid-svg-AZJG7sRwopfGiqyx .error-text{fi…

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

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

Linux 驱动扫描所有线程调用栈

测试环境 root:curtis# uname -a Linux curtis-Aspire-E5-471G 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux root:curtis# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: …

leetcode做题笔记145. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 思路一:递归 c语言解法 void postorder(struct TreeNode *root, int *res, int *resSize) {if (root NULL) {return;}postorder(root->left, res, resSize);postorder(root->right, …

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

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

qt 6知识集

1.Use multi-arg instead [clazy-qstring-arg] 存在过个arg,连写形式如下: QString("%1 %2").arg(a).arg(b);QString("%1 %2").arg(a, b); // one less temporary heap allocation详见参考文献[1]。 参考文献 [1] qstring-arg

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