STM32内部Flash
目录
一、内部Flash简介
二、内部Flash构成
1. 主存储器
2. 系统存储区
3. 选项字节
三、内部Flash写入过程
1. 解锁
2. 页擦除
3. 写入数据
四、工程空间分布
某工程的ROM存储器分布映像:
1. 程序ROM的加载与执行空间
2. ROM空间分布表
一、内部Flash简介
STM32芯片内部有一个Flash存储器,主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部Flash中。由于Flash存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部Flash中加载代码并运行。由于访问内部Flash的速度要比外部的SPI-Flash快得多,所以在紧急状态下常常会使用内部Flash存储关键记录。
二、内部Flash构成
1. 主存储器
一般说STM32内部Flash的时候,都是指主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的256k Flash、 512k Flash都是指这个区域的大小。
主存储器分为256页,每页大小为2KB,共512KB。这个分页的概念,实质就是Flash存储器的扇区,与其他Flash一样,在写入数据前,要先按页(扇区)擦除。 主存储器的页数量、页大小根据芯片型号均有不同。
2. 系统存储区
该区域用户无法访问,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB以及CAN等ISP烧录功能。
3. 选项字节
选项字节用于配置Flash的读写保护、待机/停机复位、软件/硬件看门狗等功能,这部分共16字节。可以通过修改Flash的选项控制寄存器修改。
三、内部Flash写入过程
1. 解锁
由于内部Flash空间主要存储的是应用程序,是非常关键的数据,为了防止因误操作修改了这些内容,芯片复位后默认会给控制寄存器Flash_CR上锁,这时不允许设置Flash的控制寄存器,从而不能修改Flash中的内容。所以对Flash写入数据前,需要先给它解锁。
2. 页擦除
在写入新的数据前,需要先擦除存储区域,STM32提供了页(扇区)擦除指令和整个Flash擦除(批量擦除)的指令,以批量擦除仅针对主存储区的指令。
3. 写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还需要配置一系列的寄存器。
四、工程空间分布
由于内部Flash本身存储程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容。所以在使用内部Flash存储其他数据前,需要了解哪一些空间己经写入了程序代码,存储了程序代码的扇区都不应做任何修改。
通过 查询 应用程序 编译时产生的 “ *.map ” 后缀文件,可以 了解 程序 存储到了 哪些区域。
某工程的ROM存储器分布映像:
1. 程序ROM的加载与执行空间
两段分别以 “ Load Region LR_ROM1 ” 及 “ Execution Region ER_IROM1 ” 开头的内容,分别描述程序的 加载及执行空间。
在芯片刚上电运行时,会 加载程序及数据,例如它会 从程序的存储区域加载到程序的 执行区域,还把一些 已初始化的全局变量 从ROM复制到RAM空间,以便 程序运行时 可以 修改变量的 内容。
加载完成后,程序开始从执行区域开始执行。在map文件中,加载及执行空间的 基地址 (Base) 都是 0x08000000,它正好是 STM32内部Flash的首地址,即 STM32的 程序存储空间直接就是执行空间。它们的大小(Size) 分别为0x000014c4及0x000014b4。
执行空间的 ROM 比较小 的原因就是 因为部分 RW-data类型的 变量被拷 贝到 RAM空间了。
它们的最大空间(Max)均为0x00080000, 即 512K字节,它指的是 内部Flash的最大空间。
计算程序 占用空间时,需要 使用 加载区域的大小进行计算,本例子中的 内部Flash是从0x08000000至( 0x08000000+0x000014c4 ) 地址的 空间区域。
2. ROM空间分布表
在加载及执行空间总体描述之后,紧接着一个ROM详细地址分布表,它列出了工程中的各个段(如函数、常量数据) 所在的地址Base Addr及占用的空间Size。
列表中的 Type 说明了 该段的类型,CODE 表示 代码,DATA 表示 数据,而 PAD 表示 段之间的 填充区域,它是 无效的内容,PAD 区域往往是为了解决地址对齐的问题。
表中的最后一项,它的基地址是 0x08001494,大小为 0x00000020,可知它占用的最高的地址空间为 0x080014b4,与执行区域的最高地址0x000014b4一样,但它们 比加载区域说明中的最高地址0x80014c4要小,所以以加载区域的大小为准。
从内部 Flash 页地址 分布表,可知 仅使用页 0~2 就可以 完全存储 本应用程序,所以从页 3( 地址 0x08001800 )以后的 存储空间都 可以用于其他用途,使用这些 存储空间时不会篡改 应用程序空间的 数据。
相关文章:

STM32内部Flash
目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像: 1. 程序ROM的加载与执行空间 2. ROM空间分布表 一、内部Flash…...

html5 audio video
DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用: 可用: Google Chrome Close AutoUpdate-CSDN博客...

LoveWall v2.0Pro社区型校园表白墙源码
校园表白墙,一个接近于社区类型的表白墙,LoveWall。 源码特色; 点赞, 发评论, 发弹幕, 多校区, 分享页, 涉及违禁物等名词进行检测! 安装教程: 环境要求;…...

Flink cdc3.0动态变更表结构——源码解析
文章目录 前言源码解析1. 接收schema变更事件2. 发起schema变更请求3. schema变更请求具体处理4. 广播刷新事件并阻塞5. 处理FlushEvent6. 修改sink端schema 结尾 前言 上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题,本篇来看下新功能之一的动态变更表结…...

WWW 2024 | 时间序列(Time Series)和时空数据(Spatial-Temporal)论文总结
WWW 2024已经放榜,本次会议共提交了2008篇文章,research tracks共录用约400多篇论文,录用率为20.2%。本次会议将于2024年5月13日-17日在新加坡举办。 本文总结了WWW 2024有关时间序列(Time Series)和时空数据…...
代码随想录算法——数组
目录 1、二分查找法 2、移除元素 3、有序数组的平方 4、长度最小的子数组 5、螺旋矩阵II 1、二分查找法 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在…...

Linux第45步_通过搭建“DNS服务器”学习图形化配置工具
学习的意义:通过搭建“DNS服务器”,来学习“图形化配置工具”。“DNS服务器”,我们用不到,但为后期移植linux系统服务,因为在移植系统时,需要用到这个“图形化配置工具”。 1、“menuconfig图形化配置工具…...

【Linux取经路】探寻shell的实现原理
文章目录 一、打印命令行提示符二、读取键盘输入的指令三、指令切割四、普通命令的执行五、内建指令执行5.1 cd指令5.2 export指令5.3 echo指令 六、结语 一、打印命令行提示符 const char* getusername() // 获取用户名 {return getenv("USER"); }const char* geth…...

【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)
1.随机森林在神经网络的应用 当使用随机森林进行特征选择时,算法能够为每个特征提供一个重要性得分,从而帮助识别对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力,减少过拟合的风险,并且可以加快模型训练和推理…...

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块
047_http模块_获取请求行和请求头 hello,大家好,那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法,我在这个文档当中都已经记录好了,方便大家后续做一个快速的查阅。 …...

【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解
目录 2.4 队列1) 概述2) 链表实现3) 环形数组实现 2.4 队列 1) 概述 计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头…...

(注解配置AOP)学习Spring的第十七天
基于注解配置的AOP 来看注解式开发 : 先把目标与通知放到Spring里管理 : Service("userService") public class UserServiceImpl implements UserService {Overridepublic void show1() {System.out.println("show1......");}Overridepublic void show2…...

[C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow
在OpenCV中,imshow函数默认情况下是不支持滚动条的。如果想要显示滚动条,可以考虑使用其他库或方法来进行实现。 一种方法是使用Qt库,使用该库可以创建一个带有滚动条的窗口,并在其中显示图像。具体步骤如下: 1&…...

C#用Array类的Reverse方法反转数组中元素
目录 一、Array.Reverse 方法 1.重载 2.Reverse(Array, Int32, Int32) 3. Reverse(Array) 4.Reverse(T[]) 5. Reverse(T[], Int32, Int32) 二、实例 1.Array.Reverse 方法4种重载方法综合实例 2.Reverse(Array)方法的实例 一、Array.Reverse 方法 反转一维 Array 或部…...

iOS AlDente 1.0自动防过充, 拯救电池健康度
经常玩iOS的朋友可能遇到过长时间过充导致的电池鼓包及健康度下降问题。MacOS上同样会出现该问题,笔者用了4年的MBP上周刚拿去修了,就是因为长期不拔电源的充电,开始还是电量一半的时候不接电源会黑屏无法开机,最后连着电源都无法…...

春晚刘谦魔术——约瑟夫环
昨晚,刘谦在春晚上表演了一个魔术,通过对四张撕成两半的纸牌连续操作,最终实现了纸牌的配对。 这个魔术虽然原理不是很难,但是通过刘谦精湛的表演还是让这个魔术产生了不错的效果(虽然我感觉小尼的效果更不错ÿ…...
itextpdf使用:使用PdfReader添加图片水印
gitee参考代码地址:https://gitee.com/wangtianwen1996/cento-practice/tree/master/src/test/java/com/xiaobai/itextpdf 参考文章:https://www.cnblogs.com/wuxu/p/17371780.html 1、生成带有文字的图片 使用java.awt包的相关类生成带文字的图片&…...
如何为Kafka加上账号密码(二)
认证策略SASL/PLAIN 上篇文章中我们讲解了Kafka认证方式和基础概念,并比较了不同方式的使用场景。 我们在《2024年了,如何更好的搭建Kafka集群?》中集群统一使用PLAINTEXT通信。Kafka通常是在内网使用,但也有特殊的使用场景需要…...

【大数据】Flink on YARN,如何确定 TaskManager 数
Flink on YARN,如何确定 TaskManager 数 1.问题2.并行度(Parallelism)3.任务槽(Task Slot)4.确定 TaskManager 数 1.问题 在 Flink 1.5 Release Notes 中,有这样一段话,直接上截图。 这说明从 …...

ES节点故障的容错方案
ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...