STM32F1之FLASH闪存

目录

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.mzph.cn/bicheng/6799.shtml

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

相关文章

2024,AI手机“元年”? | 最新快讯

文 | 伯虎财经,作者 | 铁观音 2024年,小米、荣耀、vivo、一加、努比亚等品牌的AI手机新品如雨后春笋般涌现。因此,这一年也被业界广泛视为AI手机的“元年” 试想,当你轻触屏幕,你的手机不仅响应你的指令,更…

C++项目(通讯录管理系统)

系统需求 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统 系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多 记录1000人 显示联系人:显示通讯录中所有联系人…

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里,大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上,常用重点应用。所以车厂对应用性能的要求比较高。 主要包括: 应用冷启动达到***ms。应用热(温)启动达到***ms应…

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章,转载请注明原文出处。 此实验参考 《鲁班猫监控检测》,原代码有点BUG,已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

易语言IDE界面美化支持库

易语言IDE界面美化支持库 下载下来可以看到,是一个压缩包。 那么,怎么安装到易语言中呢? 解压之后,得到这两个文件。 直接将clr和lib丢到易语言安装目录中,这样子就安装完成了。 打开易语言,在支持库配置…

在营销的世界,你一定要记住:营满,则销

营销的世界中,有一个非常重要的一件事,这几个字一定要记住: 营满,则销;营未满,则不销。 你有没有把握,这是一个没办法可以复杂的东西,真得看营销人的直觉,营跟销是独立的两件事,营在营势,销是自然而然的。这里, 什么样的客户,看到什么样的产品。会有什么样的抗…

HCIP的学习(11)

OSPF的LSA详解 LSA头部信息 ​ [r2]display ospf lsdb router 1.1.1.1----查看OSPF某一条LSA的详细信息,类型以及LS ID参数。 链路状态老化时间 指一条LSA的老化时间,即存在了多长时间。当一条LSA被始发路由器产生时,该参数值被设定为0之后…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像,图像必须是CV 8U或者CV 32F的单通道…

Ansible——lookup,过滤器

文章目录 Ansible——lookup,过滤器lookup读取文件lookup生成随机密码lookup读取环境变量lookup读取Linux命令的执行结果lookup读取template变量替换后的文件lookup读取配置文件lookup读取DNS解析的值 过滤器过滤器使用的位置过滤器对普通变量的操作过滤器对文件路径的操作过滤…

QSqlDatabase的数据库路径或名称问题

在Qt的数据库编程中,先是设置数据库的类型,然后是设置数据库文件的路径,或者数据库名称。若有数据库的用户名、密码,则分别调用setUserName(“”)、setPassword(“”)来设置用户名和密码;若没有,则省略用户…

Maven 在项目的 pom.xml 文件中 指定 阿里云的景象仓库

配置 在 项目的 pom.xml 文件中添加如下配置即可 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【Unity】位图字体制作工具:蒲公英

一般来讲&#xff0c;如果需要制作位图字体&#xff0c;一般是使用 BMFont 这种第三方工具&#xff1a;BMFont - AngelCode.comhttp://www.angelcode.com/products/bmfont/ 然而这个工具对于非程序员来说&#xff0c;操作起来较为繁琐困难。每次美术修改了字体之后&…

解决git合并冲突

解决Git请求合并冲突通常涉及以下步骤&#xff1a; 了解冲突&#xff1a; 当Git在合并过程中无法自动解决文件差异时&#xff0c;它会产生冲突。 你可以通过查看Git的输出或检查冲突文件的特殊标记来识别冲突。 查看冲突文件&#xff1a; 打开Git告诉你存在冲突的文件。 你…

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起、切换、恢复函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…

linux手动安装es

docker下载 docker pull elasticsearch:7.9.3 docker pull kibana:7.9.3检查安装目录下存在文件夹/data/elasticsearch/data &#xff0c;如果缺少&#xff0c;请创建目录并设置权限&#xff0c;否则会因为无权限访问而启动失败。 # 创建目录 mkdir /data/elasticsearch/data…

SpringCloudAlibaba:4.1云原生网关higress的搭建

概述 简介 Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio Envoy为核心构建的下一代云原生网关&#xff0c; 实现了流量网关 微服务网关 安全网关三合一的高集成能力&#xff0c;深度集成Dubbo、Nacos、Sentinel等微服务技术栈 定位 在虚拟化时期的微服务架构…

【DevOps】Jenkins 集成Docker

目录 1. 安装 Docker 和 Jenkins 2. 在 Jenkins 中安装 Docker 插件 3. 配置 Docker 连接 4. 创建 Jenkins Pipeline 5. 示例 Pipeline 脚本 6. 运行 Jenkins Job 7. 扩展功能 8、docker配置测试连接的时候报错处理 将 Docker 与 Jenkins 集成可以实现持续集成和持续交…