当前位置: 首页 > article >正文

STM32内部Flash

目录

一、内部Flash简介

二、内部Flash构成

1. 主存储器

2. 系统存储区

3. 选项字节

三、内部Flash写入过程

1. 解锁

2. 页擦除

3. 写入数据

四、工程空间分布

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

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


http://www.kler.cn/a/229547.html

相关文章:

  • 七大排序算法(Java,便于理解)
  • 第423场周赛:检测相邻递增子数组 Ⅰ、检测相邻递增子数组 Ⅱ、好子序列的元素之和、统计小于 N 的 K 可约简整数
  • Postgres对外提供服务流程
  • js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值
  • 深入学习 Python 爬虫:从基础到实战
  • 【STM32-学习笔记-9-】SPI通信
  • 五、Redis之发布订阅及事务管理
  • Postman发送带登录信息的请求
  • 第43章 弗莱纳公式准备1 空间曲面坐标 ,梯度解释
  • 升级Oracle 单实例数据库19.3到19.22
  • 车位检测,YOLOV8,OPENCV调用
  • 单点登录怎么做?SSO实现原理和优势总结
  • 力扣面试150 数字范围按位与 公共前缀 位运算
  • 软件行业项目管理的优化策略与实施指南
  • Python调用matlab程序
  • 支持534种语言,开源大语言模型MaLA-500
  • 「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」
  • 实体类和Map类型相互转换
  • 5.0 ZooKeeper 数据模型 znode 结构详解
  • 二级C语言笔试1
  • 时间序列(Time-Series)SelfAttention_Family.py代码解析
  • k8s学习-Service Account和RBAC授权
  • C++学习Day04之常函数和常对象
  • 02.02_111期_C++_数据内存分布笔记
  • Java接口与抽象类
  • 好“云”来!盘点春节与云计算息息相关的那些事儿