STM32内部Flash

目录

一、内部Flash简介

二、内部Flash构成

[1. 主存储器](#1. 主存储器)

[2. 系统存储区](#2. 系统存储区)

[3. 选项字节](#3. 选项字节)

三、内部Flash写入过程

[1. 解锁](#1. 解锁)

[2. 页擦除](#2. 页擦除)

[3. 写入数据](#3. 写入数据)

四、工程空间分布

某工程的ROM存储器分布映像:

[1. 程序ROM的加载与执行空间](#1. 程序ROM的加载与执行空间)

[2. 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 )以后的 存储空间都 可以用于其他用途,使用这些 存储空间时不会篡改 应用程序空间的 数据。

相关推荐
2401_858286112 小时前
L7.【LeetCode笔记】相交链表
笔记·leetcode·链表
龙中舞王4 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity
青椒大仙KI115 小时前
24/11/7 算法笔记 PCA主成分分析
笔记·算法·信息可视化
光明中黑暗5 小时前
机器学习 笔记
人工智能·笔记·机器学习
明辉光焱7 小时前
Node.js笔记
javascript·笔记·node.js
RationalDysaniaer7 小时前
gin入门
笔记·gin
在下方方8 小时前
【快捷入门笔记】mysql基本操作大全-SQL表
笔记·sql·mysql
kjyzx669 小时前
期刊论文查重率多少,才会不被认定为学术不端?
笔记
CXDNW9 小时前
【网络面试篇】其他面试题——Cookie、Session、DNS、CDN、SSL/TLS、加密概念
网络·笔记·面试·cdn·dns·cookie
dal118网工任子仪9 小时前
web安全漏洞之xss(1)
笔记·学习·web安全·网络安全·xss