FLASH 模拟 EEPROM

FLASH 模拟 EEPROM

一、STM32 FLASH 简介

在这里插入图片描述
  STM32F4 的闪存模块由主存储器、系统存储器、OPT 区域和选项字节等 4 部分组成。
  主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。分为 12 个扇区,前 4个扇区为 16KB 大小,扇区 4 为 64KB 大小,扇区 5~11 为 128KB 大小,不同容量的 STM32F4,拥有的扇区数不一样,比如我们的 STM32F407ZGT6,拥有 12 个扇区。从表 46.1 可以看出,主存储器的起始地址为 0x08000000,B0、B1 都接 GND 的时候,就是从 0x08000000 开始运行代码。
  系统存储器,主要用来存放 STM32F4 的 bootloader 代码,此代码在出厂的时候就固化在STM32F4 里面了,专门用来给主存储器下载代码的。当 B0 接 V3.3,B1 接 GND 的时候,从该存储器启动(即进入串口下载模式)。
  OTP 区域,即一次性可编程区域,总共 528 字节大小,被分成两个部分,前面 512 字节(32字节为 1 块,分成 16 块),可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除!!),后面 16 字节,用于锁定对应块。
  选项字节,用于配置读保护、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。
  闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制结构。
  在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行。既在进行写或擦除操作时,不能进行代码或数据的读取操作。

1.闪存的读取
  STM32F4 可以通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章主要讲解的数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟(HCLK)频率和器件电源电压在 Flash 存取控制寄存器(FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。Flash等待周期与 CPU 时钟频率之间的对应关系如下,
在这里插入图片描述

CPU 时钟(HCLK)频率对应的 FLASH 等待周期表

  等待周期通过 FLASH_ACR 寄存器的 LATENCY[2:0]三个位设置。系统复位后,CPU 时钟频率为内部 16 M RC 振荡器(HIS),LATENCY 默认是 0,即 1 个等待周期。供电电压,我们一般是 3.3V,所以,在我们设置 168 MHz 频率作为 CPU 时钟之前,必须先设置 LATENCY 为5,否则 FLASH 读写可能出错,导致死机。
  正常工作时(168 MHz),虽然 FLASH 需要 6 个 CPU 等待周期,但是由于 STM32F4 具有自适应实时存储器加速器(ART Accelerator),通过指令缓存存储器,预取指令,实现相当于 0 FLASH 等待的运行速度。

2 .闪存的编程和擦除
  执行任何 Flash 编程操作(擦除或编程)时,CPU 时钟频率(HCLK)不能低于 1 MHz。如果在 Flash 操作期间发生器件复位,无法保证 Flash 中的内容。
  在对 STM32F4 的 Flash 执行写入或擦除操作期间,任何读取 Flash 的尝试都会导致总线阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能从 Flash中执行代码或数据获取操作。
  STM32F4 用户闪存的编程一般由 6 个 32 位寄存器控制,他们分别是:
(1) FLASH 访问控制寄存器(FLASH_ACR)
⚫ FLASH 秘钥寄存器(FLASH_KEYR)
⚫ FLASH 选项秘钥寄存器(FLASH_OPTKEYR)
⚫ FLASH 状态寄存器(FLASH_SR)
⚫ FLASH 控制寄存器(FLASH_CR)
⚫ FLASH 选项控制寄存器(FLASH_OPTCR)

  FLASH_CR 的解锁序列为:
(1)写 0x45670123 到 FLASH_KEYR
(2)写 0xCDEF89AB 到 FLASH_KEYR
  通过这两个步骤,即可解锁 FLASH_CR,如果写入错误,那么 FLASH_CR 将被锁定,直到下次复位后才可以再次解锁。
  STM32F4 闪存的编程位数可以通过 FLASH_CR 的 PSIZE 字段配置,PSIZE 的设置必须和电源电压匹配,见表 46.1.2:

在这里插入图片描述

  由于我们开发板用的电压是 3.3V,所以 PSIZE 必须设置为 10,即 32 位并行位数。擦除或者编程,都必须以 32 位为基础进行。

3.FLASH 配置步骤
  STM32F4 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0xFFFFFFFF),无法写入。STM32F4 的标准编程步骤如图 所示:
在这里插入图片描述
从上图可以得到闪存的编程顺序如下:
1,检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁
2,检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作
3,设置 FLASH_CR 寄存器的 PG 位为‘1’
4,在指定的地址写入数据(一次写入 32 字节,不能超过 32 字节)
5,等待 BSY 位变为‘0’
6,读出写入地址并验证数据

STM32 的闪存擦除分为两种:页擦除和整片擦除。
页擦除过程如下图所示:
在这里插入图片描述1,检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁
2,检查 FLASH_SR 寄存器中的 BSY 位,确保当前未执行任何 FLASH 操作
3,在 FLASH_CR 寄存器中,将 SER 位置 1,并设置 SNB=0(只有 1 个扇区,扇区 0)
4,将 FLASH_CR 寄存器中的 START 位置 1,触发擦除操作
5,等待 BSY 位清零

经过以上五步,就可以擦除某个扇区。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值