因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分

1、RAM和ROM的一些基本概念 —— STM32学习笔记:FLASH读写之一

2、STM32的Flash寄存器及介绍 —— STM32学习笔记:FLASH读写之二

3、STM32的Flash读写相关函数 —— STM32学习笔记:FLASH读写之三

4、STM32的Flash自己编辑函数 —— STM32学习笔记:FLASH读写之四

目录

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

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

0x03、STM32闪存模块的组成

0x04、FLASH的读操作

0x05、FLASH的写操作

0x0001、Flash寄存器简介:

0x0002、Flash擦除流程:

0x0003、Flash写入流程:

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

0x00041、FPEC 键值寄存器:FLASH_KEYR

0x00042、闪存控制寄存器:FLASH_CR

0x00043、闪存状态寄存器:FLASH_SR

0x00044、闪存地址寄存器:FLASH_AR


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)

其中 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_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读写过程之后,我们来看一下与读写操作相关的寄存器说明

0x00041、FPEC 键值寄存器:FLASH_KEYR

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

该寄存器主要用来解锁 FPEC,必须在该寄存器写入特定的序列(KEY1 和 KEY2)解锁后,才能对 FLASH_CR 寄存器进行写操作。

0x00042、闪存控制寄存器: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.

该位用于指示 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个位。

0x00043、闪存状态寄存器: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

0x00044、闪存地址寄存器: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读写的相关函数!

STM32学习笔记:FLASH读写之二相关推荐

  1. STM32学习笔记:读写内部Flash。

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

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

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

  3. STM32学习笔记:FLASH读写之一

    因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...

  4. STM32学习笔记(9)——(I2C续)读写EEPROM

    STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...

  5. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  6. 《STM32学习笔记》3——核心功能电路与编程(上)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.核心板电路分析 二.点灯 LED 1.LED电路 2.LED功能相关初始化配置 ...

  7. 硬件学习、高速dsp开发板制作、STM32学习笔记

    1.硬件工程师成长之路(1)--元件基础_[云轩]的博客-CSDN博客_硬件工程师的成长之路 总目录:https://blog.csdn.net/weixin_44407238/category_10 ...

  8. 《STM32学习笔记》2——开发环境的建立

    接上文,文中的图片知识,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.接口定义 1 芯片引脚整体简介 2 各部分引脚介绍 二.开发板简介 三.IS ...

  9. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

最新文章

  1. Nature子刊:宏基因组组装基因组实现谱系解析
  2. CSS3的学习--实现瀑布流
  3. html编辑器自定义脚本,CKeditor富文本编辑器使用技巧之添加自定义插件的方法
  4. python设置文件权限_PYTHON学习之文件操作;
  5. 用idea插件将一个spring boot项目部署到docker容器里运行
  6. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
  7. JDK15新特性密封类可以被继承了!
  8. 开发中常见的@NotNull,@NotBlank,@NotEmpty注解的区别
  9. 财经数据提取器上线拉
  10. tornado异步客户端(Future)
  11. vue 深度拷贝数组_前端深拷贝和浅拷贝
  12. 吴军:站在浪潮之巅,5G 和 IoT 才是未来 10 年的浪潮 | 人物志
  13. JavaScript与页面交互
  14. debian samba出错:set_variable_helper(yes ): value is not boolean!
  15. [中英字幕]吴恩达机器学习系列课程 笔记
  16. error C2144: syntax error: 'int' should be preceded by ';'
  17. Golang ToLower和ToLowerSpecial源码探究
  18. C语言迷宫如何实现多个关卡,c语言实现迷宫问题#仅供借鉴
  19. 炼钢行业皮带无人化管理的问题及解决
  20. 用键盘打开计算机管理,windows10系统使用键盘打开设备管理器的三种方法

热门文章

  1. 华清远见-重庆中心-数据库阶段技术总结/个人总结
  2. 气象绘图中出现白条该如何解决
  3. 论文阅读 AutoGluon-Tabular
  4. sca java_SCA客户端以及基于Java的模型实现(一)
  5. logstash收集tomcat日志
  6. 【数列】求序列之和——递归
  7. Linux 线程同步
  8. android x5全屏白色,x5webview 自定义全屏界面 X5webview完美去掉分享功能和缓存功能(2)...
  9. 局域网搭建共享mysql_局域网共享设置mysql安装教程.doc
  10. Java 15 年老兵都不一定了解的冷知识!