目录
0x01、STM32的RAM和ROM类型介绍
在STM32的Reference manual文档中,有如下介绍,说明STM32中的RAM是SRAM,ROM是Flash ROM。
文档下载地址地址:
0x02、STM32根据RAM和Flash容量对产品的划分
首选我们要明确下文中出现的内容介绍都是在官方文档:PM0075 STM32F10xxx Flash memory microcontrollers
STM32芯片根据RAM和Flash容量分为以下3种类型,Low-density devices,Medium-density devices,High-density devices,如下图所示:
如,我们选择STM32F103RC这款芯片,它具有256K Flash,48K RAM,属于High-density devices,如下图所示
0x03、STM32闪存模块的组成
STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。
主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是 0X08000000, B0、B1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。
信息块,该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 B0 接 V3.3,B1 接 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)
RDPRT 键 = 0X000000A5
0x0002)、Flash擦除流程:
我们在 STM32 的 FLASH 编程的时候,要先判断缩写地址是否被擦除了,所以,我们有必要再介绍一下 STM32 的闪存擦除,STM32 的闪存擦除分为两种:页擦除和整片擦除。
页擦除过程如下图所示 :
从上图可以看出,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 编程过程如下图所示:
从上图可以得到闪存的编程顺序如下:
- 检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁
- 检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作
- 设置 FLASH_CR 寄存器的 PG 位为’1’
- 在指定的地址写入要编程的半字
- 等待 BSY 位变为’0’
- 读出写入的地址并验证数据
0x0004)、Flash读写相关寄存器的详细介绍:
总体了解了STM32的Flash读写过程之后,我们来看一下与读写操作相关的寄存器说明
第一个是 FPEC 键寄存器:FLASH_KEYR
该寄存器为只写寄存器,读出时返回0
第二个是闪存控制寄存器:FLASH_CR
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.
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_SR
该寄存器主要用来指示当前 FPEC 的操作编程状态。
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
该寄存器主要用来设置要擦除的页。
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读写的相关函数!