目录
[1. 主存储器](#1. 主存储器)
[2. 系统存储区](#2. 系统存储区)
[3. 选项字节](#3. 选项字节)
[1. 解锁](#1. 解锁)
[2. 页擦除](#2. 页擦除)
[3. 写入数据](#3. 写入数据)
[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 )以后的 存储空间都 可以用于其他用途,使用这些 存储空间时不会篡改 应用程序空间的 数据。