单片机FLASH深度解析和编程实践(上)

本篇文章主要针对单片机FLASH编程和FLASH基本原理进行学习分享。以STM32单片机作为实例进行编程实训。

关于FLASH操作的相关寄存器及编程,大家可以参考下一篇文章:

单片机FLASH深度解析和编程实践(下)-CSDN博客

目录

一、STM32编程方式

 二、闪存模块存储器组织(以STM32F767IGT为例)

 1、主存储器

2、系统存储器 

3、OPT区域 

4、选项字节 

 三、FLASH闪存操作

(一)、FLASH闪存的读取

注意 

(二)、FLASH闪存的编程(写)和擦除操作 

(三)、FLASH编程注意事项 

(四)、STM32的标准编程步骤

四、闪存擦除

(一)、扇区擦除的步骤 

(二)、批量擦除的步骤 

 五、FLASH中断

 六、结语


 

一、STM32编程方式

1在线编程(ICP,In-Circuit Programming):
通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。


2在程序中编程(IAPIn Application Programming):

通过任何一种通信接口(如IO端口,USB, CAN,UART,I2C,SPI等)下载程序或者应用数据到存储器中。也就是说,STM32允许用户在应用程序中重新烧写闪存存储器中的内容。然而,IAP需要至少有一部分程序已经使用ICP方式烧到闪存存储器中(Bootloader).

 二、闪存模块存储器组织(以STM32F767IGT为例)

储器组织分为四个部分,分别是主存储器、系统存储器、OPT区域、选项字节。

 1、主存储器

该部分用来存放代码和数据常数(如const类型的数据)。它可以分为1个Bank或者2个Bank,可以通过选项字节的nDBANK位来设置,默认是1个bank,也就是单Bank模式。


在单Bank模式下,STM32F767的主存储器被分为8个扇区,前4个扇区为32KB大小,第五个扇区是128KB大小,剩下的3个扇区都是256KB大小,总共1M字节。


因为STM32F7的FLASH访问路径有两条:AXIM和ITCM,对应不同的地址映射,表中我们列出了这两条不同访问路径下的扇区地址范围。我们一般选择AXIM接目访问FLASH,其主存储器的起始地址就是ox08000000。


B0、B1都接GND的时候,就是从OX08000000开始运行代码的。

2、系统存储器 

这个主要用来存放STM32的bootloader代码,此代码是出厂的时候就固化在STM32里面了,专门来给主存储器下载代码的。当B0接V3.3,B1接GND的时候,从该存储器启动(即进入串口下载模式)。

3、OPT区域 

OTP区域,即一次性可编程区域,共1056字节,被划分为16个64字节的OTP 数据块和1个16字节的OTP锁定块。OTP数据块和锁定块均无法擦除。锁定块中包含16字节的 LOCKBi (0 <= i <= 15),用于锁定相应的OTP数据块(块0到15)。每个OTP数据块均可编程,除非相应的OTP锁定字节编程为0x00。锁定字节的值只能是0x0和0xFF,否则这些OTP字节无法正确使用。

4、选项字节 

用于配置读保护、BOR级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。  

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


在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

 三、FLASH闪存操作

(一)、FLASH闪存的读取

STM32的FLASH读取是很简单的。例如,我们要从地址addr ,读取一个字(字节为8位,半字为16位,字为32位),可以通过如下的语句读取:

将addr强制转换为vu32指针,然后取该指针所指向的地址的值,即得到了addr地址的值。类似的,将上面的vu32改为vu16,即可读取指定地址的一个半字。相对FLASH读取来说,STM32 FLASH的写就复杂一点了,下面我们介绍STM32闪存的编程和擦除。

注意 

为了准确读取 Flash数据,必须根据CPU时钟 (HCLK)频率和器件电源电压在 Flash存取控制寄存器(FLASH ACR)中正确地设置等待周期数(LKTENCY)。Flash等待周期与CPU时钟频率之间的对应关系:

等待周期通过FLASHAC寄存器的LATENCY[3:0]四三个位设置。系统复位后,CPU时钟频率为内部16MRC振荡器,LATENCY默认是0,即1个等待周期。供电电压,我们一般是3.3V,所以,在我们设置216Mhz频率作为CPU时钟之前,必须先设置LATENCY为7,即8个等待周期,否则FLASH读写可能出错,导致死机。


正常工作时(216Mhz),虽然FLASH需要8个CPU等待周期,但是由于STM32F767具有自适应实时存储器加速器(ARTAccelerator),通过指令缓存存储器,预取指令,实现相当于0 FLASH等待的运行速度。

(二)、FLASH闪存的编程(写)和擦除操作 

在对 STM32的Flash执行写入或擦除操作期间,任何读取Flash的尝试都会导致总线阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能从Flash中执行代码或数据获取操作。

 STM32的闪存编程由7个32位寄存器控制。

(三)、FLASH编程注意事项 

Step1:

STM32复位后,FLASH编程操作是被保护的,不能写入FLASH_CR寄存器;
通过写入特定的序列(0X45670123和OXCDEF89AB)到FLASH_KEYR寄存器才可解除写保护,只有在写保护被解除后,我们才能操作相关寄存器。FLASH_CR的解锁序列为:


1)写0X45670123 ( KEY1)到FLASH_ KEYR

2)写OXCDEF89AB(KEY2)到FLASH_KEYR


通过这两个步骤,即可解锁FLASH_CR,如果写入错误,那么FLASH_CR将被锁定,直到下次复位后才可以再次解锁。

Step2:

STM32闪存的编程位数可以通过FLASH_CR的PSIZE字段配置,PSIZE的设置必须和电源电压匹配,由于我的开发板用的电压是3.3V,所以PSIZE必须设置为10,即32位并行位数。擦除或者编程,都必须以32位为基础进行。

Step3:

STM32的FLASH在编程的时候,也必须要求其写入地址的FLASH是被擦除了的(也就是其值必须是0XFFFFFFFF ),否则无法写入。

(四)、STM32的标准编程步骤

按照以上四步操作,就可以完成一次FLASH编程。但是需要注意一下:

1、编程之前,必须确保要写入地址的FLASH已经擦除 ;

2、需要先解锁,否则不能操作FLASH;

3、编程操作对OPT区域也有效,方法一摸一样。

四、闪存擦除

我们在STM32的FLASH编程的时候,要先判断缩写地址是否被擦除了,所以,我们有必要再介绍-下STM32的闪存擦除,STM32的闪存擦除分为两种:
①扇区擦除

②整片擦除。

(一)、扇区擦除的步骤 

1、检查FLASH_CR的LOCK是否解锁,如果没有则先解锁

2、检查FLASH_SR寄存器中的BSY位,确保当前未执行任何FLASH操作
3、在FLASH_CR寄存器中,将SER位置1,并从主存储块的12个扇区中选择要擦除的扇区(SNB)
4、将FLASH_CR寄存器中的STRT位置1,触发擦除操作

5、等待BSY位清零
经过以上五步,就可以擦除某个扇区!

(二)、批量擦除的步骤 

1、检查FLASH_SR寄存器中的BSY位,确保当前未执行任何FLASH操作
2、在FLASH_CR寄存器中,将MER位置1(F767/F407)

3、在FLASH_CR寄存器中,将MER和OMER1位置1(F429xx)

4、将FLASH_CR寄存器中的STRT位置1,触发擦除操作5等待BSY位清零
经过以上几个步骤,就可以批量擦除扇区。

 

 五、FLASH中断

1、如果将FLASH_CR寄存器中的操作结束中断使能位(EOPIE)置1,则在擦除或者编程操作结束时,即FLASH_SR寄存器中的繁忙位BSY清零时,将产生中断。此时FLASH_SR寄存器中的操作结束(EOP)位置1。
2、如果在请求编程,擦
除或读操作期间出现错误,则FLASH_SR寄存器中的以下错误标志位之一将置1:
PGAERR ,PGPERR ,ERSERR(编程错误标志)

WRPERR(保护错误标志)
这种情况下,FLASH_CR的
错误中断使能位(ERRIE)置1,并且如果FLASH_SR的操作错误位(OPERR)置1,则产生一个中断。
 

 六、结语

有关FLASH操作的相关知识就分享至此了,下一篇文章将会带大家深度了解FLASH相关的寄存器和寄存器的配置。

单片机FLASH深度解析和编程实践(下)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

挑战杯 机器视觉人体跌倒检测系统 - opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器视觉人体跌倒检测系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&…

Wmware安装Linux(centerOS、Ubuntu版本)

目录 1、安装wmware 2、center版本 3、ubuntu版本 1、安装wmware 此处不做展开。 2、center版本 需要提前下载的文件&#xff1a; 无图形化界面https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso 有图形化界面https://mirrors.a…

实现更高能效的汽车级低边驱动器NRVB140ESFT1G 带温度和电流限制 自保护低压侧驱动器

一起去了解关于汽车电子AEC Q101车规认证&#xff01;&#xff01;! 是一种针对分立半导体的可靠性测试认证程序&#xff0c;由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性…

树和二叉树的介绍

树 树是一种数据结构&#xff0c;它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 它具有以下的特点&#xff1a; 每个节点有零个或多个子节点&#xff1b;没有父节点…

nmcli --help(nmcli -h)nmcli文档、nmcli手册

文章目录 nmcli --helpOPTION解释OBJECT解释1. g[eneral]&#xff1a;查看NetworkManager的状态2. n[etworking]&#xff1a;启用或禁用网络3. r[adio]&#xff1a;查看无线电状态&#xff08;例如&#xff0c;Wi-Fi&#xff09;4. c[onnection]&#xff1a;列出所有的网络连接…

AIGC: 3. AI时代程序员的生存模式思考

AI跟程序员关系思考 在 3 月 9 日央视的《对话》的开年说节目上&#xff0c;百度创始人、董事长兼 CEO 李彦宏先生表示&#xff1a; 1.基本上以后不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力。 2.“未来的编程语言只会剩下…

Android开发失业50天,面了10家公司,唯二的offer也主动拒了

于我看来并没有&#xff0c;最多说“Android 技术的探索”进入了下半场&#xff0c;而整个市场还是乐观的。 以前是 BAT 的天下&#xff0c;而近两年出来越来越多的独角兽&#xff1a;头条、抖音、拼多多、快手、小猿搜题等&#xff0c;这些公司的业务都在移动端上&#xff0c…

VMware安装Ubuntu 18.04.2

下载Ubuntu映像 下载地址&#xff1a;http://old-releases.ubuntu.com/releases/18.04/ 下载名称&#xff1a; ubuntu-18.04.2-desktop-amd64.iso 清华镜像站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 阿里云镜像站&#xff1a;https://mirrors.ali…

【MySQL】3. 库的操作

库的操作 1. 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...]create_specification:[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_name说明&#xff1a; 大写的表示关键字 …

挑战杯 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

前端基础——HTML傻瓜式入门(1)

该文章Github地址&#xff1a;https://github.com/AntonyCheng/html-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

day05-SpringBootWeb请求响应

请求响应&#xff1a; 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletResponse&#xff09;&#xff1a;设置响应数据 BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xf…

【C语言】字符(串)函数详解~

一、前言 这一期的博客&#xff0c;将会着重讲解常见的字符或字符串的相关库函数。C语言中有一组库函数专门用来处理字符类型的数据的&#xff0c;后文则会介绍字符分类函数以及字符转换函数。字符串相关的函数是本篇博客的重点&#xff0c;这也是为什么标题是字符串函数详解。…

【C++进阶】深度解析AVL树及其简单模拟实现

AVL树的解析和模拟实现 一&#xff0c;什么是AVL树二&#xff0c;AVL树的特性三&#xff0c;模拟实现1. 基本框架2. 插入&#xff08;不带旋转&#xff09;2. AVL树的旋转3. AVL树的验证 四&#xff0c;总结 一&#xff0c;什么是AVL树 之前我们学习了二叉搜索树&#xff0c;但…

C++实验 面向对象编程

一、实验目的&#xff1a; 掌握类中静态成员的定义方法&#xff0c;初始化方法&#xff0c;使用方法&#xff1b; 掌握类的友元说明方法&#xff0c;理解友元的使用特点 二、实验内容&#xff1a; 1、编写程序&#xff0c;统计某旅馆住宿客人的总数&#xff0c;要求输入客人…

计算机二级(Python)真题讲解每日一题:《绘制雪花》

在横线处填写代码&#xff0c;完成如下功能‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬…

Vue.js 应用实现监控可观测性最佳实践

前言 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 TinyPro 是一套使用 Vue …

SQL Server错误:15404

执行维护计划失败&#xff0c;提示SQL Server Error 15404 无法获取有关... 异常如下图&#xff1a; 原因&#xff1a;数据库用户名与计算机名称不一致 解决办法&#xff1a;1.重名称数据库用户名 将前缀改成计算机名 2.重启SQL Server代理

JAVA基础—JVM内存结构基础需知

1.JVM内存结构 JVM内存结构分为5个区域&#xff1a;方法区&#xff0c;虚拟机栈&#xff0c;本地方法栈、堆、程序计数器。 1.方法区&#xff08;Method Area&#xff09;&#xff1a;用于存储类的结构信息、常量、静态变量、即使编译器编译后的代码等数据。方法区也是所有线…

Ansys Lumerical | 激光雷达天线仿真

附件下载 联系工作人员获取附件 在本文中&#xff0c;我们将了解如何根据激光雷达应用需求设计和优化相控阵光栅天线。 概述 激光雷达&#xff08;LIDAR&#xff09;是“light detection and ranging”的简称&#xff0c;近年来由于在机器人、自动驾驶汽车、高精度测绘等领域…