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

相关推荐
Wallace Zhang1 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭1 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
杰克逊的日记9 天前
MCU编程
单片机·嵌入式硬件
Python小老六9 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
懒惰的bit9 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习
zkyqss9 天前
OVS Faucet练习(下)
linux·笔记·openstack
浦东新村轱天乐9 天前
【麻省理工】《how to speaking》笔记
笔记
奔跑的蜗牛AZ9 天前
TiDB 字符串行转列与 JSON 数据查询优化知识笔记
笔记·json·tidb
cwtlw9 天前
Excel学习03
笔记·学习·其他·excel
杭州杭州杭州9 天前
计算机网络笔记
笔记·计算机网络