STM32内部flash详解(1)(上)

简介: STM32内部flash详解(1)

STM32 内部FLAsh概述

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

主要特性

1.flash读操作

2.flash编程/擦除操作

3.读写保护

4.I-Code 上的预取操作

5.I-Code 上的 64 个缓存(128 位宽)

6.D-Code 上的 8 个缓存(128 位宽)

7.128 位宽数据读取

8.字节、半字、字和双字数据写入

9.扇区擦除与全部擦除

除了程序下载对自身flash读写外,本身也可以通过软件编程对其进行书写,可进行一些数据的存储。
下面就说一下这方面的东西(当然不同的芯片flash有所不同,这里以STM32F429进行介绍,其他芯片即使厂商不同,但是大致的流程和功能是一样的。)

内部FLASH的结构

根据数据手册来看,STM32的内部FLASH有主存储器、系统存储器、OTP区域以及选项字节区域。如图

1.主存储器:在STM32F4中共有12个主存储器扇区,这12个扇区分为4个16KB、1个64KB以及7个128KB扇区。

2.系统存储器:器件在系统存储器自举模式下从该存储器启动(就是boot代码,出厂就已经存在的,专门给主存储器下载代码用的,这时候B0外接3.3V,B1接GND的时候从写个存储器启动(像CAN、串口下载就用这个)。

3.OTP 区域:即一次性可编程区域,共 528 字节,被分成两个部分,前面 512 字节(32 字节为 1 块,分成 16 块),可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除),后面 16 字节,用于锁定对应块。如图:

4.选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。
ce6aaa968d2391a5aa24e6468dbfec9e.png

STM32读写

在对FLASH读写之前首先需要对flash解锁。主要流程如下:

1-解锁

因芯片内flash存储的是核心程序,因此默认是上锁的,需要通过软件编写进行解锁(有对应的解锁寄存器和库函数)。

复位后,Flash 控制寄存器 (FLASH_CR) 不允许执行写操作,以防因电气干扰等原因出现对Flash 的意外操作。此寄存器的解锁顺序如下:

1-第一步在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY1 = 0x45670123

2-第二部在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY2 = 0xCDEF89AB

(注意:如果flash解锁顺序出现错误,将返回总线错误并锁定 FLASH_CR 寄存器,直到下一次复位。也可通过软件将 FLASH_CR 寄存器中的 LOCK 位置为 1 来锁定 FLASH_CR 寄存器。**当 FLASH_SR 寄存器中的 BSY 位为 1 时,将不能在写模式下访问 FLASH_CR 寄存器。BSY 位为 1 时,对该寄存器的任何写操作尝试都会导致 AHB 总线阻塞,直到 BSY 位清零。)**

2-数据操作位数

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

3-擦除扇区

再下入一块新数据之前,我们需要把之前的数据给擦出掉。步骤如下:

1.检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作

2.在 FLASH_CR 寄存器中,将 SER 位置 1,并从主存储块的 12 个 (STM32F405xx/07xx和 STM32F415xx/17xx) 或 24 个(STM32F42xxx 和 STM32F43xxx) 扇区中选择要擦的扇区 (SNB)

3.将 FLASH_CR 寄存器中的 STRT 位置 1

4.等待 BSY 位清零

批量擦除

如果要进行批量擦除:

5.检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作

6.将 FLASH_CR 寄存器中的 MER 位置 1(STM32F405xx/07xx 和 STM32F415xx/17xx
器件)

7.将 FLASH_CR 寄存器中的 MER 和 MER1 位置 1(STM32F42xxx 和 STM32F43xxx
器件)

8.将 FLASH_CR 寄存器中的 STRT 位置 1

9.等待 BSY 位清零
注意: 如果 FLASH_CR 寄存器中的 MERx 位和 SER 位均置为 1,则无法执行扇区擦除和批量擦除。

编程

标准编程(写入)

当flash擦除完毕后,我们对其进行数据的写入(写入flash就是操作指针、地址这些)。
步骤如下:

Flash 编程顺序如下:

1.检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何主要 Flash 操作。

2.将 FLASH_CR 寄存器中的 PG 位置 1。

3.针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作:
— 并行位数为 x8 时按字节写入
— 并行位数为 x16 时按半字写入
— 并行位数为 x32 时按字写入
— 并行位数为 x64 时按双字写入

4.等待 BSY 位清零 注意: 把 Flash 的单元从“1”写为“0”时,无需执行擦除操作即可进行连续写操作。把 Flash 的
单元从“0”写为“1”时,则需要执行 Flash 擦除操作。
如果同时发出擦除和编程操作请求,首先执行擦除操作。**

编程错误(写入错误)

不允许针对 Flash 执行跨越 128 位行界限的数据编程操作。如果出现这种情况,写操作将不会执行,并且 FLASH_SR 寄存器中的编程对齐错误标志位 (PGAERR) 将置 1。
写访问宽度(字节、半字、字或双字)必须与所选并行位数类型(x8、x16、x32 或 x64)相符。否则,写操作将不会执行,并且 FLASH_SR 寄存器中的编程并行位数错误标志位(PGPERR) 将置 1。
如果未遵循标准的编程顺序(例如,在 PG 位未置 1 时尝试向 Flash 地址写入数据),则操作将中止并且 FLASH_SR 寄存器中的编程顺序错误标志位 (PGSERR) 将置 1。
说白了就两点:一是不能越界,而是按照顺序编写

编程与缓存

如果 Flash 写访问涉及数据缓存中的某些数据,Flash 写访问将修改 Flash 中的数据和缓存中的数据。

如果 Flash 中的擦除操作也涉及数据或指令缓存中的数据,则必须确保在代码执行期间访问这些数据之前将它们重新写入缓存。如果无法可靠执行这一操作,建议将 FLASH_CR 寄存器中的 DCRST 和 ICRST 位置 1,以刷新缓存
注意:I/D 缓存只有在被禁止 (I/DCEN = 0) 的情况下才能刷新

软件编程操作(读写)

我们打开MDK可以看到代码占据了多少flash如下两幅图:

1-Flash解锁的操作(操作库函数,也可以操作寄存器看个人)

文件:
stm32f4xx_flash.c
stm32f4xx_flash.h

我们想要把数据写入flash之前一定要先解锁,否则数据无法写入成功。

#define RDP_KEY                  ((uint16_t)0x00A5)
#define FLASH_KEY1               ((uint32_t)0x45670123)
#define FLASH_KEY2               ((uint32_t)0xCDEF89AB)
#define FLASH_OPT_KEY1           ((uint32_t)0x08192A3B)
#define FLASH_OPT_KEY2           ((uint32_t)0x4C5D6E7F)
//解锁FLASH控件寄存器访问
void FLASH_Unlock(void)
{
  if((FLASH->CR & FLASH_CR_LOCK) != RESET)
  {
    /* Authorize the FLASH Registers access */
    FLASH->KEYR = FLASH_KEY1;
    FLASH->KEYR = FLASH_KEY2;
  } 
}
相关文章
|
4月前
|
内存技术
STM32CubeMX flash的使用
STM32CubeMX flash的使用
191 10
|
5月前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
|
存储 芯片 内存技术
STM32速成笔记(十二)—Flash闪存
本文简单介绍了什么是Flash。针对STM32F1的Flash做了详细介绍,介绍了操作Flash的步骤,并且给出了程序设计。最后,介绍了一些注意事项。
147 0
STM32速成笔记(十二)—Flash闪存
|
存储 关系型数据库 编译器
STM32学习笔记:读写内部Flash(介绍+附代码)
STM32学习笔记:读写内部Flash(介绍+附代码)
432 0
|
存储 内存技术
STM32内部flash详解(1)(下)
STM32内部flash详解(1)
|
芯片 内存技术
STM32bug【 KEILMDK中出现Error: Flash Download failed - “Cortex-M3“】
STM32bug【 KEILMDK中出现Error: Flash Download failed - “Cortex-M3“】
997 0
|
内存技术 芯片
MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL
MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL   是因为目标板的芯片处于休眠的状态,在尝试连接目标板时候也会出现报错Internal command ...
3712 0
|
内存技术
STM32F103系列单片机的FLASH和RAM大小
CPU:STM32F103RCT6,LQFP64,FLASH:64KB,RAM:20KB flash起始地址为0x8000000,大小为0x10000(16进制)—>65536字节(10进制)—>64KB RAM起始地址为0x2000000,大小为0x5000(16进制)—>20480字节(10进制)—>20KB
2706 0
STM32F103系列单片机的FLASH和RAM大小