1、STM32 的内部 FLASH 简介

在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行,见下图:
  
除了使用外部的工具(如下载器)读写内部 FLASH 外, STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。

由于访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多,所以在紧急状态下常常会使用内部 FLASH 存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH 中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部 FLASH 的操作。

2. 内部 FLASH 的构成

STM32 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小下表:
  


各个存储区域的说明如下:

(1)主存储器
    一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。
    主存储器分为两块,共 2MB,每块内分 12 个扇区,其中包含 4 个 16KB扇区、 1 个 64KB 扇区和 7 个 128KB 的扇区。如STM32F429IGT6 型号芯片,它的主存储区域大小为 1MB,所以它只包含有表中的扇区 0-扇区 11。
    与其它 FLASH 一样,在写入数据前,要先按扇区擦除,而有的时候我们希望能以小规格操纵存储单元,所以 STM32 针对 1MB FLASH 的产品还提供了一种双块的存储格式,见下表:
   

    通过配置 FLASH 选项控制寄存器 FLASH_OPTCR 的 DB1M 位,可以切换这两种格式,切换成双块模式后,扇区 8-11 的空间被转移到扇区 12-19 中,扇区细分了,总容量不变。
    
    注意如果您使用的是 STM32F40x 系列的芯片, 它没有双块存储格式,也不存在扇区 12-23,仅 STM32F42x/43x 系列产品才支持扇区 12-23。
    
  (2)系统存储区
    系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。
    
  (3)OTP 区域
    OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。
    
  (4)选项字节
    选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。
    
3、 对内部 FLASH 的写入过程
  3.1、解锁
  由于内部 FLASH 空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会结 FLASH 上锁,这个时候不允许设置 FLASH 的控制寄存器,并且不能对修改 FLASH 中的内容。
  所以对 FLASH 写入数据前,需要先给它解锁。解锁的操作步骤如下:
    (1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
    (2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB

3.2、数据操作位数
  在内部 FLASH 进行擦除及写入操作时,电源电压会影响数据的最大操作位数,该电源电压可通过配置 FLASH_CR 寄存器中的 PSIZE 位改变,见下表。
  
   最大操作位数会影响擦除和写入的速度,其中 64 位宽度的操作除了配置寄存器位外,还需要在 Vpp 引脚外加一个 8-9V 的电压源,且其供电时间不得超过一小时,否则 FLASH可能损坏,所以 64 位宽度的操作一般是在量产时对 FLASH 写入应用程序时才使用,大部分应用场合都是用 32 位的宽度。

3.3、擦除扇区
  在写入新的数据前,需要先擦除存储区域, STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。

扇区擦除的过程如下:
    (1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何Flash 操作;
    (2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇区编号寄存器位 SNB”,选择要擦除的扇区;
    (3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
    (4) 等待 BSY 位被清零时,表示擦除完成。

3.4. 写入数据
  擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
    (1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
    (2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1;
    (3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;
    (4) 等待 BSY 位被清零时,表示写入完成。

STM32F429的内部FLASH介绍相关推荐

  1. STM32学习笔记:读写内部Flash(介绍+附代码)

    一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...

  2. STM32读写内部Flash(介绍+附代码)

    概述 内部flash读写详解 一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片 ...

  3. stm32内部Flash读写

    文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...

  4. 第50章 读写内部FLASH—零死角玩转STM32-F429系列

    第50章     读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  5. STM32内部flash详解(1)

    STM32 内部FLAsh概述 今天说一下STM32中的内部flash. 当我们把写好的代码下载MCU中,这个代码时存放在flash中的.当芯片重启复位上电后,会通过内核对flash进行代码的加载运行 ...

  6. HAL库内部flash及IAP(boot)升级

    1.内部flash的用法 1.闪存模块存储器组织(STM32F407) STM32的闪存模块由:主存储器.系统存储器.OPT区域和选项字节等4部分组成.如下图所示: 1.主储存器(flash):有11 ...

  7. STM32F4读写内部FLASH【使用库函数】

    STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...

  8. STM32之内部FLASH原理

    不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节.市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH ...

  9. STM32HAL库-内部Flash在指定页读写保护示例

    概述 本篇文章介绍如何使用STM32HAL库,内部Flash在特定页读写保护示例. 硬件:STM32F103CBU6最小系统板 软件:Keil 5.29  + STM32CubeMX5.6.1 一.使 ...

最新文章

  1. java lamda循环条件_Java lambda 循环累加求和代码
  2. 构建二叉堆时间复杂度的证明
  3. 思科路由器NAT配置详解(转)
  4. python学习-if、name、main、PyPi、pip
  5. 计算机系统基础:总线结构知识笔记
  6. 20岁没有学历能学计算机,20岁没学历学什么技术怎么办?学什么比较吃香?
  7. 計算機二級-java06
  8. Leetcode431.将N叉树编码为二叉树(golang)
  9. 深度学习2.0-3.tensorflow的基础操作之索引与切片
  10. 新华网评:企业的信息安全关把好了吗?
  11. JavaScript前端常见面试题总结
  12. Opengl实例7:glm(0.9.8.5)库 +矩阵旋转+课后作业
  13. Can not import avx core while this file exists
  14. PID微分器与滤波器的爱恨情仇
  15. Web3:价值投资的范式转移
  16. 阿里云聆听平台使用有感
  17. 如何解决4G摄像头在智能巡检中掉线的方案
  18. python弧度制转换 三角函数 反三角函数 双曲 反双曲 sin cos tan asin acos atan asinh acosh atanh atanh2
  19. 关于嵌入式的技术竞争力
  20. enum weekday

热门文章

  1. 诗人海子与互联网的辩证法
  2. XAML与XML的区别
  3. MATLAB学习笔记-IEEE802.16d模型
  4. killall 命令的用法
  5. Nginx: 正向与反向代理
  6. linux 内核 空指针,Linux 内核IS_ERR函数
  7. 有没有自己制作地图的软件,可以生成地图的软件
  8. Selective Search算法-候选框生成
  9. PHP 递归和递推思想
  10. caspase3是什么意思_【求助】cleaved caspase-3, 第一个词怎样翻译好