STM32 中 FLASH 详解,FLASH 怎么读写

一、ROM 的简单解释

ROM(Read Only Memory) 只读存储器

在单片机领域中,我们编辑的 C 语言代码,在编译后会生成二进制可执行文件,通过烧录会将文件写入单片机的 ROM 存储器中。

ROM 常见的有四类

  • PROM:可编程只读存储器,只能擦写一次。例如芯片的唯一 ID 码。
  • EPROM:可擦除可编程只读存储器,一旦编辑完成后,EPROM只能通过强紫外线照射来擦除。
  • EEPROM:带电可擦除可编程只读存储器,是一种掉电后数据不丢失的存储芯片
  • FLASH:是 EEPROM 一种,一样具备带电可擦除可编程的特性,与 EEPROM 的区别是,EEPROM 擦除的最小单元是一个字节,而 FLASH 擦除的最小单元是一个扇区,所以 FLASH的价格比 EEPROM 便宜。

二、FLASH 简介

简介:FLASH 是 EEPROM 的一种,是带电可擦除可编程的只读存储器,本文特指 STM32 内部的 Flash,主要用于存储用户程序代码以及必要的配置信息

常见应用:SD卡、固态硬盘、芯片内存存储单元存储代码等

特性:

  • 非易失性:数据在断电后依旧存储在数据中,适合存储程序代码和关键配置信息。
  • 快速访问:FLASH 具有较快的读取速度
  • 较长寿命:一般的 FLASH 可擦除约十万次
  • 先擦再写:FLASH 的写操作只能将数据位从 1 写成 0,而不能从 0 写成 1,如果一个数据位已经写成 0 了,那 FLASH 必须先将该位所处的扇区或区块先擦除,才能重新写入。

FLASH 的擦除操作其实就是将对应扇区、区块或者全部区块的数据位全擦除为 1

FLASH 中的块、扇区、页

打开我们主机的我的电脑,可见的是硬盘分区,我们将硬盘进行分区目的是为了方便管理我们的文件;扇区、块这些专有名词,其实也是从硬盘等存储器发展而来,目的是为了将一个存储器划分为多个区域,以更方便的编程管理这些存储单元

  1. 页(Page):FLASH 存储器中的一种区域划分单元,好比一本书,有几百页,每一页有几百个字。
  2. 扇区(Sector):也是 FLASH 存储器中的一种区域划分单元,只是扇区更常见,大部分 FLASH 主要以扇区为最小单元
  3. 块(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 写入

有机会补完,可以看其他博主的内容

  • 24
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值