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

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

相关文章:

  • 跟着cherno手搓游戏引擎【23】项目维护、2D引擎之前的一些准备
  • 西工大计算机学院复试问题整理
  • 第6章 智能租房——前期准备
  • 第59讲订单数据下拉实现
  • 《剑指 Offer》专项突破版 - 面试题 36 : 详解后缀表达式(C++ 实现)
  • Android 11 webview webrtc无法使用问题
  • 《Django+React前后端分离项目开发实战:爱计划》 03 理解项目结构
  • 【More Effective C++】条款2:使用C++转型操作符
  • 微服务OAuth 2.1扩展额外信息到JWT并解析(Spring Security 6)
  • 力扣231. 2 的幂(数学,二分查找,位运算)
  • 亚马逊认证考试系列 - 知识点 - LightSail介绍
  • 网络选择流程分析(首选网络类型切换流程)
  • Git中为常用指令配置别名
  • 【漏洞复现】狮子鱼CMS某SQL注入漏洞01
  • 服务器禁用了请求中指定的方法
  • #Java异常处理
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • C++类的相互关联
  • gcc介绍及安装
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • k8s 面向应用开发者的基础命令
  • python学习笔记 - ThreadLocal
  • SpringBoot几种定时任务的实现方式
  • sublime配置文件
  • Vue实战(四)登录/注册页的实现
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 山寨一个 Promise
  • 时间复杂度与空间复杂度分析
  • 树莓派 - 使用须知
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 小李飞刀:SQL题目刷起来!
  • 数据可视化之下发图实践
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #define用法
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)(1.9) MSP (version 4.2)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十三)Flask之特殊装饰器详解
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Sublime Text3配置Lua运行环境
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • . Flume面试题
  • .cn根服务器被攻击之后
  • .NET Core中的去虚
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 托管代码与非托管代码
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net下的富文本编辑器FCKeditor的配置方法