STM32学习笔记:FLASH读写之二

时间:2024-04-14 13:38:20

目录

0x01、STM32的RAM和ROM类型介绍

0x02、STM32根据RAM和Flash容量对产品的划分

0x03、STM32闪存模块的组成

0x04、FLASH的读操作

0x05、FLASH的写操作

0x0001)、Flash寄存器简介:

0x0002)、Flash擦除流程:

0x0003)、Flash写入流程:

0x0004)、Flash读写相关寄存器的详细介绍:

第一个是 FPEC 键寄存器:FLASH_KEYR

第二个是闪存控制寄存器:FLASH_CR

第三个是闪存控制寄存器:FLASH_SR

第四个是闪存地址寄存器:FLASH_AR


0x01、STM32的RAM和ROM类型介绍

在STM32的Reference manual文档中,有如下介绍,说明STM32中的RAM是SRAM,ROM是Flash ROM。

STM32学习笔记:FLASH读写之二

 

文档下载地址地址:

https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

0x02、STM32根据RAM和Flash容量对产品的划分

首选我们要明确下文中出现的内容介绍都是在官方文档:PM0075 STM32F10xxx Flash memory microcontrollers 

STM32芯片根据RAM和Flash容量分为以下3种类型,Low-density devices,Medium-density devices,High-density devices,如下图所示:

STM32学习笔记:FLASH读写之二

如,我们选择STM32F103RC这款芯片,它具有256K Flash,48K RAM,属于High-density devices,如下图所示

STM32学习笔记:FLASH读写之二

0x03、STM32闪存模块的组成

 

STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。

STM32学习笔记:FLASH读写之二

主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是 0X08000000B0B1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。

信息块,该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 B0 V3.3B1 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,本文不作介绍。

闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

0x04、FLASH的读操作

内置闪存模块可以在通用地址空间直接寻址,任何 32 位数据的读操作都能访问闪存模块的内容并得到相应的数据。读接口在闪存端包含一个读控制器,还包含一个 AHB 接口与 CPU 衔接。这个接口的主要工作是产生读闪存的控制信号并预取 CPU 要求的指令块,预取指令块仅用于在 I-Code 总线上的取指操作,数据常量是通过 D-Code 总线访问的。这两条总线的访问目标是相同的闪存模块,访问 D-Code 将比预取指令优先级高。

这里要特别留意一个闪存等待时间,因为 CPU 运行速度比 FLASH 快得多,STM32F103的 FLASH 最快访问速度≤24Mhz,如果 CPU 频率超过这个速度,那么必须加入等待时间,比如我们一般使用72Mhz的主频,那么FLASH等待周期就必须设置为2,该设置通过FLASH_ACR 寄存器设置。

例如,我们要从地址 addr,读取一个半字(半字为 16 为,字为 32 位),可以通过如下的语句读取: data = *(vu16*)addr; 将 addr 强制转换为 vu16 指针,然后取该指针所指向的地址的值,即得到了 addr 地址的值。类似的,将上面的 vu16 改为 vu8,即可读取指定地址的一个字节。

总结:

1、STM32的FLASH可以直接按地址读取

2、STM32的FLASH的最快访问速度≤24Mhz,如果 CPU 频率超过这个速度,那么必须加入等待时间

0x05、FLASH的写操作

相对 FLASH 读取来说,STM32的FLASH 的写就复杂一点了,下面我们介绍 STM32 闪存的编程和擦除。

0x0001)、Flash寄存器简介:

STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32 位寄存器,他们分别是:

  • FPEC 键寄存器(FLASH_KEYR)

  • 选择字节键寄存器(FLASH_OPTKEYR)

  • 闪存控制寄存器(FLASH_CR)

  • 闪存状态寄存器(FLASH_SR)

  • 闪存地址寄存器(FLASH_AR)

  • 选择字节寄存器(FLASH_OBR)

  • 写保护寄存器(FLASH_WRPR)

其中 FPEC 键寄存器总共有 3 个键值:
 

RDPRT 键 = 0X000000A5

KEY1 = 0X45670123
 
KEY2 = 0XCDEF89AB
 
STM32 复位后, FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 KEY2 ),只有在写保护被解除后,我们才能操作相关寄存器。
 

0x0002)、Flash擦除流程:

 

我们在 STM32 FLASH 编程的时候,要先判断缩写地址是否被擦除了,所以,我们有必要再介绍一下 STM32 的闪存擦除,STM32 的闪存擦除分为两种:页擦除和整片擦除。

页擦除过程如下图所示 :

STM32学习笔记:FLASH读写之二

从上图可以看出,STM32 的页擦除顺序为:

  • 检查 FLASH_CR LOCK 是否解锁,如果没有则先解锁
  • 检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的闪存操作
  • 设置 FLASH_CR 寄存器的 PER 位为’1
  • FLASH_AR 寄存器选择要擦除的页
  • 设置 FLASH_CR 寄存器的 STRT 位为’1
  • 等待 BSY 位变为’0
  • 读出被擦除的页并做验证

0x0003)、Flash写入流程:

 

STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据哦!),当 FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC 都会产生总线错误。在编程过程中(BSY 位为’1),任何读写闪存的操作都会使 CPU 暂停,直到此次闪存编程结束。 同样,STM32 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的 (也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。

STM23 FLASH 编程过程如下图所示:

STM32学习笔记:FLASH读写之二

从上图可以得到闪存的编程顺序如下:

  • 检查 FLASH_CR LOCK 是否解锁,如果没有则先解锁
  • 检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作
  • 设置 FLASH_CR 寄存器的 PG 位为’1
  • 在指定的地址写入要编程的半字
  • 等待 BSY 位变为’0
  • 读出写入的地址并验证数据

0x0004)、Flash读写相关寄存器的详细介绍:

总体了解了STM32的Flash读写过程之后,我们来看一下与读写操作相关的寄存器说明

第一个是 FPEC 键寄存器:FLASH_KEYR

该寄存器为只写寄存器,读出时返回0

 
STM32学习笔记:FLASH读写之二
 
该寄存器主要用来解锁 FPEC ,必须在该寄存器写入特定的序列( KEY1 KEY2 )解锁后,才能对 FLASH_CR 寄存器进行写操作。
 

第二个是闪存控制寄存器:FLASH_CR

STM32学习笔记:FLASH读写之二

Bit 12 EOPIE:End of operation interrupt enable 操作结束中断使能位

This bit enables the interrupt generation when the EOP bit in the FLASH_SR register goes to 1. 当FLASH_SR寄存器中的EOP位变为1时,该位启用中断生成。

0: Interrupt generation disabled   等于0时,禁止中断生成

1: Interrupt generation enabled   等于1时,启用中断生成

Bit 11 Reserved, must be kept cleared

Bit 10 ERRIE: Error interrupt enable

This bit enables the interrupt generation on an FPEC error (when PGERR / WRPRTERR are set in the FLASH_SR register).

该位启用FPEC错误时的中断生成(当PGERR/WRPRTERR设置在FLASH_SR寄存器中时)。

0: Interrupt generation disabled  等于0时,禁止中断生成

1: Interrupt generation enabled  等于1时,启用中断生成

Bit 9 OPTWRE: Option bytes write enable

When set, the option bytes can be programmed. This bit is set on writing the correct key sequence to the FLASH_OPTKEYR register. This bit can be reset by software

设置后,可编程选项字节。该位设置为将正确的**序列写入FLASH_OPTKEYR寄存器。该位可通过软件复位。

Bit 8 Reserved, must be kept cleared.

Bit 7 LOCK: Lock

Write to 1 only. When it is set, it indicates that the FPEC and FLASH_CR are locked. This bit is reset by hardware after detecting the unlock sequence. In the event of unsuccessful unlock operation, this bit remains set until the next reset.

该位用于指示 FLASH_CR 寄存器是否被锁住,该位在检测到正确的解锁序列后, 硬件将其清零。在一次不成功的解锁操作后,在下次系统复位之前,该位将不再改变。
 

Bit 6 STRT: Start

This bit triggers an ERASE operation when set. This bit is set only by software and reset when the BSY bit is reset.

该位用于开始一次擦除操作。在该位写入 1 ,将执行一次擦除操作。

Bit 5 OPTER: Option byte erase

Option byte erase chosen.

该位用于选择页擦除操作,在页擦除的时候,需要将该位置 1

Bit 4 OPTPG: Option byte programming

Option byte programming chosen.  选择字节编程选项。

Bit 3 Reserved, must be kept cleared

Bit 2 MER: Mass erase

Erase of all user pages chosen.删除所选的所有用户页面。

Bit 1 PER: Page erase

Page Erase chosen.擦除已选择页面。

Bit 0 PG: Programming

Flash programming chosen.

该位用于选择编程操作,在往 FLASH 写数据的时候,该位需要置 1
 
红色的4个位是本文将要用到的4个位。
 

第三个是闪存控制寄存器:FLASH_SR

该寄存器主要用来指示当前 FPEC 的操作编程状态。

STM32学习笔记:FLASH读写之二

Bit 5 EOP: End of operation

Set by hardware when a Flash operation (programming / erase) is completed. Reset by writing a 1     

EOP:操作结束 当闪存操作(编程/擦除)完成时,硬件设置这位为1,写入1可以清除这位状态。

Note: EOP is asserted at the end of each successful program or erase operation

注:每次成功的编程或擦除都会设置EOP状态。

Bit 4 WRPRTERR: Write protection error 写保护错误

Set by hardware when programming a write-protected address of the Flash memory. Reset by writing 1.

试图对写保护的闪存地址编程时,硬件设置这位为1,写入1可以清除这位状态

Bit 3 Reserved, must be kept cleared.

Bit 2 PGERR: Programming error

Set by hardware when an address to be programmed contains a value different from '0xFFFF' before programming. Reset by writing 1.

试图对内容不是0xFFFF的地址编程时,硬件设置这位为1,写入可以清除这位状态

Note: The STRT bit in the FLASH_CR register should be reset before starting a programming operation.

注:进行编程操作之前,必须先清除FLASH_CR寄存器的的SRTR位

Bit 1 Reserved, must be kept cleared

Bit 0 BSY: Busy

This indicates that a Flash operation is in progress. This is set on the beginning of a Flash operation and reset when the operation finishes or when an error occurs.

该位指示Flash操作正在进行,在Flash操作开始时,该位被设置为1;在操作结束或发生错误时该位被清除为0

第四个是闪存地址寄存器:FLASH_AR

该寄存器主要用来设置要擦除的页。

STM32学习笔记:FLASH读写之二

Updated by hardware with the currently/last used address. For Page Erase operations, this should be updated by software to indicate the chosen pag

这些位由硬件修改为当前/最后使用的地址。在页擦除操作中,软件必须修改这个寄存器以制定要擦除的页

Bits 31:0 FAR: Flash Address

Chooses the address to program when programming is selected, or a page to erase when Page Erase is selected.

选择编程时要编程的地址,或选择页面擦除时要擦除的页面。

Note: Write access to this register is blocked when the BSY bit in the FLASH_SR register is set.

注:当闪存寄存器中的BSY位被设置时,对该寄存器的写入访问被阻止。

关于STM32的Flash的相关介绍就到此为止,下面一篇文章,我们将开始介绍关于Flash读写的相关函数!