深入解析STM32中的FLASH存储器,详细讲解读写操作
一、ROM 的简单解释
ROM(Read Only Memory) 只读存储器
在单片机领域中,我们编辑的 C 语言代码,在编译后会生成二进制可执行文件,通过烧录会将文件写入单片机的 ROM 存储器中。
ROM 常见的有四类
二、FLASH 简介
简介:FLASH 是 EEPROM 的一种,是带电可擦除可编程的只读存储器,本文特指 STM32 内部的 Flash,主要用于存储用户程序代码以及必要的配置信息。
常见应用:SD卡、固态硬盘、芯片内存存储单元存储代码等
特性:
FLASH 的擦除操作其实就是将对应扇区、区块或者全部区块的数据位全擦除为 1
FLASH 中的块、扇区、页
打开我们主机的我的电脑,可见的是硬盘分区,我们将硬盘进行分区目的是为了方便管理我们的文件;扇区、块这些专有名词,其实也是从硬盘等存储器发展而来,目的是为了将一个存储器划分为多个区域,以更方便的编程管理这些存储单元
- 页(Page):FLASH 存储器中的一种区域划分单元,好比一本书,有几百页,每一页有几百个字。
- 扇区(Sector):也是 FLASH 存储器中的一种区域划分单元,只是扇区更常见,大部分 FLASH 主要以扇区为最小单元
- 块(Block):比扇区更高一级的划分单元,一块包含多个扇区
不同厂家、不同类型的存储器 对 页、扇区、块的划分方式是不同的,有的会给一个扇区划分为 1kb,有的则会 2kb、4kb、8kb
三、FLASH 的各种查看方式
芯片手册一般会直接说明其 FLASH 的大小,当然你也可以通过其他方式获取 FLASH 容量的信息
(一)芯片命名查看
芯片手册会告诉你芯片的命名规则以及含义,其中可能会有 FLASH 容量的说明,如 STM32F103C8T6 中的 8 指的是 64K 字节的 FLASH ,那么 STM32F103C6xx 则指的是 32K 字节的 FLASH。
(二)官方文档
STM32 的 FLASH 模块由主存储器、信息块、闪存存储器接口寄存器三部分组成
主存储块用于存放代码、数据常数等
信息块被分为 2 个部分,其中系统存储器是用来存储 ST 自带的启动程序,用于串口下载代码;选择字节则一般用于配置写保护、读保护等功能
闪存存储器接口寄存器用于控制 FLASH 读写,是整个 FLASH 模块的控制中心,对主存储器和信息块的写入由内嵌的 FPEC(闪存编程/擦除控制器)控制,编程和擦除所需的高压电由该内部产生。
以 STM32F10xxx 中文参考手册中对闪存(FLASH)模块(中容量)的描述,可见 FLASH 的主存储块划分了 128 页,每页的字节大小为 1K。
其中页 0 的地址为 0x0800 0000 – 0x0800 03FF,指页 0 的起始地址为 0x0800 0000,结束地址为 0x0800 03FF,十六进制转十进制可得两者地址间隔 1024 位。
根据总共有 128 页,可得出,中容量的 FLASH 主存储模块的大小为 128K
(三)项目中查看
我们也可以打开 KEIL,打开一个 STM32 项目,可通过魔术棒查看到当前项目使用芯片中主存储器的起始地址以及大小。
如图,可看出我选择 STM32F103C8T6 中主存储器的起始地址为 0x8000000;大小为 0x10000,0x10000 为十六进制,换算成十进制就是 65536 字节,也就是 64K,说明 STM32F103C8T6 的 FLASH 大小为 64K。
如此你可以在此处修改你 FLASH 主存储器的容量了,比如将 0x10000 修改为 0x8000,这样就表示 KEIL 烧录代码时,将不会擦除 0x8000 以后的空间,数据也会得以保存。
你也可以修改起始地址为 0x80008000,这样KEIL 烧录代码时,将不会擦除 0x8000 之前的空间。
四、FLASH 读取
读取 FLASH 其实就是读取寄存器地址,本人简单编写代码调试来说明查看寄存器地址的方法
1. 随便编辑一些变量和指针地址
#include "main.h"
int main(void)
{
//注:这里使用volatile只是防止编译完因为数据未使用而被优化掉才加的,实际不需要
//定义变量用于存储Flash数据
volatile unsigned int Flash_Data;
//定义指针用于获取Flash地址
volatile unsigned int * volatile Flash_Data_Addr;
//转指针赋给指针地址
Flash_Data_Addr = (unsigned int *)0x08000000;
//这样就获取了0x08000000处的Flash数据了
Flash_Data = *Flash_Data_Addr;
while (1)
{
}
}
2. 对代码进行编译,并烧录到芯片中。
3. 点击 Debug 运行,在Debug中也能通过Memory窗口查看寄存器地址的数据
五、FLASH 写入
有机会补完,可以看其他博主的内容
作者:Alysop