STM32F1之FLASH闪存

news2024/9/25 17:12:35

目录

1.  简介

2.  闪存模块组织

3.  FLASH基本结构

4.  FLASH解锁

5.  使用指针访问存储器

6.  程序存储器全擦除

7.  程序存储器页擦除

8.  程序存储器编程

9.  选项字节


 

1.  简介

        STM32F1系列的FLASH包含程序存储器系统存储器选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程。

读写FLASH的用途:     

利用程序存储器的剩余空间来保存掉电不丢失的用户数据;     

通过在程序中编程(IAP),实现程序的自我更新。

        在线编程(In-Circuit Programming – ICP)用于更新程序存储器的全部内容,它通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序。

JTAG调试接口(JTAG-DP)提供基于JTAG(Joint Test Action Group 联合测试行动小组)协议的5线标准接口。

SWD调试接口(SWD-DP)提供基于SWD(Serial Wire Debug 串行线调试)协议的2线标准接口。

        在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口下载程序。

2.  闪存模块组织

        小容量产品:是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。

        中容量产品:是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。

        大容量产品:是指闪存存储器容量在 256K 至 512K 字节之间的 STM32F101xx和STM32F103xx微控制器。

3.  FLASH基本结构

4.  FLASH解锁

FPEC共有三个键值:     

        RDPRT键 = 0x000000A5

        KEY1 = 0x45670123     

        KEY2 = 0xCDEF89AB

解锁:     

        复位后,FPEC被保护,不能写入FLASH_CR     

        在FLASH_KEYR先写入KEY1,再写入KEY2,解锁     

        错误的操作序列会在下次复位前锁死FPEC和FLASH_CR

加锁:     

        设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR

5.  使用指针访问存储器

使用指针读指定地址下的存储器:     

uint16_t Data = *((__IO uint16_t *)(0x08000000));

使用指针写指定地址下的存储器:   

 *((__IO uint16_t *)(0x08000000)) = 0x1234;

其中:   

 #define    __IO    volatile

6.  程序存储器全擦除

        可以用整片擦除功能擦除所有用户区的闪存,信息块不受此操作影响。

过程:

        ① 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;

        ② 设置FLASH_CR寄存器的MER位为’1’;

        ③ 设置FLASH_CR寄存器的STRT位为’1’;

        ④ 等待BSY位变为’0’;

        ⑤ 读出所有页并做验证。

7.  程序存储器页擦除

        闪存的任何一页都可以通过FPEC的页擦除功能擦除。

过程:

        ① 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;

        ② 设置FLASH_CR寄存器的PER位为’1’;

        ③ 用FLASH_AR寄存器选择要擦除的页;

        ④ 设置FLASH_CR寄存器的STRT位为’1’;

        ⑤ 等待BSY位变为’0’;

        ⑥ 读出被擦除的页并做验证。

8.  程序存储器编程

        对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为’1’),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。

过程:

① 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;

② 设置FLASH_CR寄存器的PG位为’1’;

③ 在指定的地址写入要编程的半字;

④ 等待BSY位变为’0’;

⑤ 读出写入的地址并验证数据。

        这种模式下CPU以标准的写半字的方式烧写闪存,FLASH_CR寄存器的PG位必须置’1’。FPEC先读出指定地址的内容并检查它是否被擦除,如未被擦除则不执行编程并在FLASH_SR寄存器的PGERR位提出警告(唯一的例外是当要烧写的数值是0x0000时,0x0000可被正确烧入且PGERR位不被置位);如果指定的地址在FLASH_WRPR中设定为写保护,则不执行编程并在FLASH_SR寄存器的WRPRTERR位置’1’提出警告。FLASH_SR寄存器的EOP为’1’时表示编程结束。

字(Word):32位长的数据或指令

半字(Half Word):16位长的数据或指令

字节(Byte):8位长的数据或指令

9.  选项字节

        选择字节共有8个字节,由用户根据应用的需要配置;例如:可以选择使用硬件模式的看门狗或软件的看门狗。

在选择字节中每个32位的字被划分为下述格式:

选择字节块中选择字节的组织结构如下:

RDP:写入RDPRT键(0x000000A5)后解除读保护

USER:配置硬件看门狗和进入停机/待机模式是否产生复位

Data0/1:用户可自定义使用

WRP0/1/2/3:配置写保护,每一个位对应保护4个存储页(中容量)

选项字节编程:

        ① 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作

        ② 解锁FLASH_CR的OPTWRE位

        ③ 设置FLASH_CR的OPTPG位为1

        ④ 写入要编程的半字到指定的地址

        ⑤ 等待BSY位变为0

        ⑥ 读出写入的地址并验证数据

选项字节擦除:

        ① 检查FLASH_SR的BSY位,以确认没有其他正在进行的闪存操作

        ② 解锁FLASH_CR的OPTWRE位

        ③ 设置FLASH_CR的OPTER位为1

        ④ 设置FLASH_CR的STRT位为1

        ⑤ 等待BSY位变为0

        ⑥ 读出被擦除的选择字节并做验证

STM32F1之I2C通信-CSDN博客

STM32学习笔记_时光の尘的博客-CSDN博客

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

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

相关文章

第 129 场 LeetCode 双周赛题解

A 构造相同颜色的正方形 枚举&#xff1a;枚举每个 3 3 3\times 3 33的矩阵&#xff0c;判断是否满足条件 class Solution {public:bool canMakeSquare(vector<vector<char>>& grid) {for (int i 0; i < 2; i)for (int j 0; j < 2; j) {int c1 0, c…

一款 NodeJS 版本管理工具 NVM (Windows)

一、简介 Node Version Manager&#xff08;NVM&#xff09;是一种用于管理多个 NodeJS 版本的工具。在日常工作中&#xff0c;我们可能同时在进行多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;依赖与不同版本的NodeJS 运行环境。这种情况下&#xff0c;维护…

通过DataGrip将mysql表结构信息转存excel 复制select结果的insert插入语句

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展&#xff0c;在这个系列专栏中记录了博主在学习期间总结的大块知识点&#xff0c;以及日常工作中遇到的各种技术点 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 查询表结构信息&#xff0c;并…

巴菲特称AI与核武器一样可怕,并调侃AI诈骗可能成下一个增长产业|钛媒体AGI | 最新快讯

总的来看&#xff0c;巴菲特对于 AI 有所知晓&#xff0c;希望它能够是件好事&#xff0c;而且认为AI会颠覆和改变这个世界&#xff0c;但是他并不是很了解&#xff0c;也言下之意表示&#xff0c;他并不会在 AI 领域进行投资。 &#xff08;图片来源&#xff1a;由 AI 生成的巴…

C++中的内存管理(上)

一、C中的内存分布 我们先来看下下面的代码&#xff1a; int globalvar 1; static int staticGlobalvar 1; void test() {static int staticVar 1;int localvar 1;int num1[10] { 1, 3, 2, 4 };char char2[] "abcd";const char* pChar3 "abcd";in…

常见的零拷贝技术

传统IO 基于传统的IO方式&#xff0c;底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区&#xff0c;再复制到用户缓冲区&#xff1b;然后再通过write()写入到socket缓冲区&#xff0c;最后写入网卡设备。整个过程发生了4次用户态和内核态的上…

【前端开发---Vue2】史上最详细的Vue入门教程(五) --- 细讲‘生命周期’

什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09;&#xff0c;本篇将详细讲解vue中的核心 --- 生命周期&#xff0c;并提供具体案例来让小伙伴们加深理解、彻底掌握…

# 从浅入深 学习 SpringCloud 微服务架构(九)

从浅入深 学习 SpringCloud 微服务架构&#xff08;九&#xff09; 一、微服务网关引入 1、在微服务架构中&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c; 如果让客户端直接与各个微服务通讯&#xff0c;可能会有很多问题&#xff0c;如&#xff1a; 1&#…

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你&#xff0c;一定会刷到过这样的直播间&#xff1a; 现在大家明白了&#xff0c;这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看&#xff0c;高大上&#xff0c;也想做一个这样的图像&#xff0c;来当自己的微信头像。 做这样的图像需要排队刷…

Jenkins自动化搭建记录

每一份努力都是有一份期盼&#xff0c;每一份付出都是为了有更多的收获。 本文记录一次搭建Jenkins自动参数化打包APK的实现过程和碰到的问题&#xff0c;实现了在Windows和Mac系统下的自动化打包流程。 因为Jenkins的安装过程在网上的教程很多&#xff0c;这里就不在赘述。 …

手动实现简易版RPC(三)

手动实现简易版RPC(三) 往期内容 手动实现简易版RPC&#xff08;一&#xff09;&#xff1a;RPC简介及系统架构 手动实现简易版RPC&#xff08;二&#xff09;&#xff1a;简单RPC框架实现 前言 接上两篇博客我们实现了最简易RPC框架&#xff0c;接下来的几期重点在简易版…

深入解析C#特殊字符:概念、分类与使用方法

文章目录 前言一、特殊字符的定义二、特殊字符的分类与作用1.转义字符2. 格式字符3. 逻辑运算符4. 运算符5. 字符串6. 注释 三、$&#xff1a;字符串内插&#xff08;String Interpolation&#xff09;四、&#xff1a;逐字字符串&#xff08;Verbatim Strings&#xff09;五、…

ai绘画的今天,新人还能入行吗?

现在24年了&#xff0c;大趋势已经很明显&#xff0c;ai绘画现阶段处于如日中天的时候&#xff0c;无论是绘画&#xff0c;电商&#xff0c;小说推文。等等一系列的行业都能用到ai绘画&#xff01; 说明一下&#xff0c;我自己就是23年初偶然间刷到了ai绘画这个赛道&#xff0c…

SpringDI方式及Redis应用场景的分享

1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示&#xff0c;在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)&#xff1b;但是使用Resource却不会…

Git笔记-常用指令

Git笔记-常用指令 一、概述二、仓库管理二、缓存区操作1. 添加文件到缓存区2. 取消缓存文件3. 忽略列表 三、日志状态信息四、分支操作五、六、 一、概述 这里记录一些git常用的指令。 二、仓库管理 # 本地仓库初始化 git init# 克隆仓库 git clone git_url # git clone ht…

wordpress子比主题给文章内容加上密码查看

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库2.读入数据第三步:文章内添加代码前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,…

三维重建(SFM)与实时定位建图(SLAM)的区分与联系

1、SLAM SLAM是Simultaneous Location and Mapping&#xff0c;同时定位与地图构建。是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。目的是解决自主机器人“定位”和“建图”两个问题…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…

Vue3+vite优化基础架构(3)--- 优化vue-i18n国际化配置

Vue3vite优化基础架构&#xff08;3&#xff09;--- 优化vue-i18n国际化配置 说明全部页面进行中英文使用测试中英文切换对ElementPlus里面的所有组件进行中英文切换 说明 这里记录下自己在Vue3vite的项目增加全局中英文切换按钮对页面进行中英文切换及同时对ElementPlus里面的…

stm32单片机开发五、I2C通信

I2C这部分的时序单元可以看我另外一篇博客I2C基本知识 I2C发送数据时是高位先行&#xff0c;也就是先发送高位的&#xff0c;比如一个字节有8位B0-B7&#xff0c;先发送B7高位 I2C用的是同步时序&#xff0c;它有一个好处&#xff0c;比如传输过程中&#xff0c;出现了中断&…