STM32 Flash学习(一)

news2024/10/9 2:22:26

STM32 FLASH简介

不同型号的STM32,其Flash容量也不同。
MiniSTM32开发板选择的STM32F103RCT6的FLASH容量为256K字节,属于大容量产品。
在这里插入图片描述
STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等3部分组成。

主存储器,该部分用来存放代码和数据常量(如const类型的数据)。
对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。

主存储器的起始地址就是 0X08000000,B0和B1都接GND的时候,就是从 0X08000000开始运行代码的。

信息块,该部分分为2个小部分,其中启动程序代码,是用来存储ST自带的启动程序,用于串口下载代码,当B0接V3.3,B1接GND的时候,运行的就是这部分代码。用户选择字节,一般用于配置写保护、读保护等功能。

闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。

对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;

闪存的读取

内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。
读接口在闪存端包含一个读控制器,还包含一个AHB接口与CPU衔接。

注意闪存等待时间,因为CPU运行速度比FLASH快得多,STM32F103的FLASH最快访问速度≤24MHz,如果CPU频率超过这个速度,那么必须加入等待时间。
比如我们一般使用72MHz的主频,那么FLASH等待周期就必须设置为2,该设置通过FLASH_ACR寄存器设置。

要从地址addr,读取一个半字(半字为16位,字为32位),可以通过如下的语句读取:

data = *(vu16*)addr;

将addr强制转换为vu16指针,然后取该指针所指向的地址的值,即得到了addr地址的值。
将上面的vu16改为vu8,即可读取指定地址的一个字节。

闪存的编程和擦除

STM32的闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含7个32位寄存器,它们分别是:

  • FPEC键寄存器(FLASH_KEYR)
  • 选择字节键寄存器(FLASH_OPTKEYR)
  • 闪存控制寄存器(FLASH_CR)
  • 闪存状态寄存器(FLASH_SR)
  • 闪存地址寄存器(FLASH_AR)
  • 选择字节寄存器(FLASH_OBR)
  • 写保护寄存器(FLASH_WRPR)

其中FPEC键寄存器总共有3个键值:
RDPRT键=0x000000A5
KEY1=0X45670123
KEY2=0XCDEF89AB

STM32复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;
通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块(即写入KEY1和KEY2),只有在写保护被解除后,我们才能操作相关寄存器。

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

同样,STM32的FLASH在编程的时候,也必须要求其写入地址的FLASH是被擦除了的(其值必须是0xffff),否则无法写入,在FLASH_SR寄存器的PGERR位将得到一个警告。

在这里插入图片描述

  • 检查FLASH_CR的LOCK是否解锁,如果没有则先解锁。
  • 检查FLASH_SR寄存器的BSY位,以确认没有其它正在进行的编程操作。
  • 设置FLASH_CR寄存器的PG位为1.
  • 在指定的地址写入要编程的半字。
  • 等待BSY位变为0。
  • 读出写入的地址并验证数据。

在STM32的FLASH编程的时候,首先判断缩写地址是否被擦除。
STM32的闪存擦除分为两种:页擦除和整片擦除。

在这里插入图片描述

  • 检查FLASH_CR的LOCK是否解锁,如果没有则先解锁。
  • 检查FLASH_SR寄存器的BSY位,以确认没有其它正在进行的闪存操作。
  • 设置FLASH_CR寄存器的PER位为1。
  • 用FLASH_AR寄存器选择要擦除的页。
  • 设置FLASH_CR寄存器的STRT位为1.
  • 等待BSY位变为0.
  • 读出被擦除的页并做验证。

读写相关寄存器

FPEC键寄存器:FLASH_KEYR。
在这里插入图片描述
所有这些位都是只写的,读出时返回0。
位31~0:FKEYR:FPEC键,这些位用于属于FPEC的解锁键。
该寄存器主要用来解锁FPEC,必须在该寄存器写入特定的序列(KEY1和KEY2)解锁后,才能对FLASH_CR寄存器进行写操作。

闪存控制寄存器:FLASH_CR。
在这里插入图片描述

  • LOCK位,该位用于指示FLASH_CR寄存器是否被锁住,该位在检测到正确的解锁序列后,硬件将其清零。在一次不成功的解锁操作后,在下次系统复位之前,该位将不再改变。
  • STRT位,该位用于开始一次擦除操作。在该位写入1,将执行一次擦除操作。
  • PER位,该位用于选择页擦除操作,在页擦除的时候,需要将该位置1.
  • PG位,该位用于选择编程操作,往往FLASH写数据的时候,该位需要置1。

闪存状态寄存器:FLASH_SR。
在这里插入图片描述

  • EOP:操作结束,每当闪存操作(编程/擦除)完成时,硬件设置为1,写1清除。
  • WRPRERR:写保护错误,当对写保护的闪存地址编程时,硬件设置这位为1,写入1可以清除。
  • PDERR:编程错误,试图对内容不是0xffff的地址编程时,硬件设置为1,写入1时可以清除。在进行编程操作之前,先清除FLASH_CR寄存器的STRT位。
  • BSY:忙,指示闪存操作正在进行。闪存操作开始时,该位置1,操作结束或发生错误时,清0。

闪存地址寄存器:FLASH_AR
在这里插入图片描述

这些位由硬件修改为当前/最后使用的地址。在页擦除时,软件必须修改这个寄存器以指定要擦除的页。

位31~0:FAR:闪存地址,当进行编程时选择要编程的地址,当进行页擦除时选择要擦除的页,当FLASH_SR的BSY位为1时,不能写这个寄存器。

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

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

相关文章

服务器被爬虫恶意攻击怎么办?

在有预算的情况可以采购第三方服务防火墙,没钱就使用开源的WAF进行防护。 # WAF防火墙的基本防护原理 WAF(Web 应用防火墙)可以使用多种技术来防止恶意爬虫攻击,例如: 1. 黑名单:WAF 可以使用黑名单技术来…

会点C++还需要再学Python吗?

提到的C、数据结构与算法、操作系统、计算机网络和数据库技术等确实是计算机科学中非常重要的基础知识领域,对于软件开发和计算机工程师来说,它们是必备的核心知识。掌握这些知识对于开发高性能、可靠和安全的应用程序非常重要。Python作为一种脚本语言&…

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建

Java版知识付费-轻松拥有知识付费平台 多种直播形式,全面满足直播场景需求 公开课、小班课、独立直播间等类型,满足讲师个性化直播场景需求;低延迟、双向视频,亲密互动,无论是互动、答疑,还是打赏、带货、…

【C++初阶】介绍stack_queue及OJ题

介绍stack_queue及OJ题 前言一、简单了解1、stack2、queue 二、OJ题(前三个栈,第四、五个队列)1、最小栈(1)题目描述(2)解题思路(3)解题代码 2、栈的压入、弹出序列&…

【C#】并行编程实战:异步流

本来这章该讲的是 ASP .NET Core 中的 IIS 和 Kestrel ,但是我看了下这个是给服务器用的。而我只是个 Unity 客户端程序,对于服务器的了解趋近于零。 鉴于我对服务器知识和需求的匮乏,这里就不讲原书(大部分)内容了。本…

基于RPA的自动化流程治理方案探索及应用实践

编者荐语: 随着企业数字化转型进程加快,信息系统大量上线,但流程运营管理问题逐渐显现出来。为提升企业流程运营能力,亚信科技联合某省运营商推出智能化流程治理运营模式,尝试基于RPA(机器人流程自动化&am…

IRIS搭建docker

之前把web实现了docker,开发或测试环境可能需要开发自己搭数据库,为了方便使用,把数据库也做一个docker。 由于原生的CentOS我还有改yum仓库,所以这次从之前lis搞的改好yum的镜像开始(从改好yum的lisnew的镜像创建lis…

SaaS到底是什么,如何做?这份笔记讲明白了

阅读本篇文章,您将可以了解:1、什么是SaaS;2、SaaS的商业模式;3、SaaS的技术架构;4、国内比较好的SaaS平台。 一、什么是SaaS SaaS即软件即服务(Software as a Service),是一种通过…

【数据结构】AVL树/红黑树

目录 1.AVL树(高度平衡二叉搜索树) 10.1.基本概念 10.2.实现 10.2.1.AVL树节点的定义 10.2.2.AVL树的插入 10.2.3.AVL树的旋转 1.新节点插入较高左子树的左侧---左左:右单旋 2.新节点插入较高右子树的右侧---右右:左单旋 3.新节点…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

对ai绘画二次元生成器你有多少了解?

在一个小镇上,有一位年轻的艺术家名叫艾米莉。她是个富有创意的女孩,总是追求着新奇和美妙的艺术体验。然而,她最近遇到了一些创作上的障碍,感觉自己的绘画已经陷入了瓶颈。在艾米莉寻找灵感的过程中,她听说了神秘的ai…

SQL语句(三十二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、SQL语句类型 二、数据库操作 ​三、数据表操作 1. 数据类型 2. 查看 3. 创建 4. 删除 5. 更改 5.1 表 5.2 列 四、数据操作 4.1 增 4.2 删 4.3 改 4.4 查…

13.5.4 【Linux】常用模块简介

登陆所需要的PAM流程: 上面这个表格当中使用到非常多的 PAM 模块,每个模块的功能都不太相同,详细的模块情报可以在你的系统中找到: /etc/pam.d/*:每个程序个别的 PAM 配置文件; /lib64/security/*&#x…

网络:HCIA 1

1. 通信系统的组成: 终端设备:电脑 中间设备:交换机、路由器、防火墙。 传输介质:网线(双绞线)传输距离一般为100米,传输的是电信号。 光纤传输的是光信号。 光纤接口类型,方形接口…

前端(九)——探索微信小程序、Vue、React和Uniapp生命周期

🙂博主:小猫娃来啦 🙂文章核心:探索微信小程序、Vue、React和Uniapp生命周期 文章目录 微信小程序、Vue、React和Uniapp的基本定义和应用领域微信小程序生命周期生命周期概述页面生命周期应用生命周期组件和API的生命周期钩子 Vu…

看完这篇,别再说不会Spring 分库分表了

多数据源,读写分离,分库分表,基本上已经是现在任何一个项目的基本配置了,在之前的文章Spring多数据源实现https://blog.csdn.net/wangerrong/article/details/131910740 里讲了多数据源的实现,其实已经包含了读写分离…

广东省《5A物理抗菌纺织品》团体标准颁布

近日,经广东省标准化协会批准发布由广东人仁康科技有限公司主导制定的《5A物理抗菌纺织品》(T/GDBX 073—2023)团体标准,于2023年7月21日发布并实施。 根据标准制修订工作流程,该项标准2022年由人仁康和广检集团组织起…

【【51单片机AD/DA的分析】】

51单片机AD/DA的分析 看似单片机实验,其实是要学好数电 模数转换 与 数模转换 运算放大器 DA的转换就是利用运算放大器实现的 输出电压v0-(D7~D0)/256 x (VrefxRfb)/R D7~D0 就是我们控制的按键看输入多少 然后再划分256份 Vref是我们设置的一个基准电压 PWM 这种…

若依分离版——解决配置双数据源oracle,mysql分页错误问题

1. 按照若依的手册配置双数据源mysql,oracle 2. 在service指定 数据源 DataSource(value DataSourceType.MASTER) 或者DataSource(value DataSourceType.SLAVE) Service public class SysPostServiceImpl implements ISysPostService {/*** 查询岗位信息集合* …

分享10个NodeJS相关的专业级工具

Node.js已成为开发人员创建强大且可扩展的Web应用程序的首选选项。根据2022年StackOverflow开发者调查,Node.js被评为专业开发人员中使用最广泛的Web框架。这个成功可以归功于其庞大的生态系统,其中提供了许多工具和框架。了解并接纳这个生态系统对于优化…