• 【STM32】标准库-读写内部Flash及用户选项字节


    STM32内部Flash的构成

    需要写入Flash的寄存器,需要先向Key寄存器写入密钥
    关于双块存储模式,请查看STM32F4最新的英文参考手册
    在这里插入图片描述

    • 主存储器
      一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。
      与其它 FLASH 一样,在写入数据前,要先按扇区擦除,而有的时候我们希望能以小规格操纵存储单元
    • 系统存储区
      系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB 以及 CAN 等 ISP 烧录功能。
    • OTP 区域(只能写入一次的存储区域
      OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改,OTP 常用于存储应用程序的加密密钥。
    • 选项字节
      选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。

    对内部 FLASH 的写入过程

    解锁

    由于内部 FLASH 空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会结 FLASH 上锁,这个时候不允许设置 FLASH 的控制寄存器,并且不能对修改 FLASH 中的内容。
    复位后,Flash 控制寄存器 (FLASH_CR) 不允许执行写操作,以防因电气干扰等原因出现对 Flash 的意外操作。
    解锁的操作步骤如下

    1. 在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY1 = 0x45670123
    2. 在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY2 = 0xCDEF89AB
      如果顺序出现错误,将返回总线错误并锁定 FLASH_CR 寄存器,直到下一次复位。

    上锁

    通过软件将 FLASH_CR 寄存器中的 LOCK 位置为 1 来锁定 FLASH_CR 寄存器
    在这里插入图片描述

    数据操作位数

    在内部 FLASH 进行擦除及写入操作时,电源电压会影响数据的最大操作位数,该电源电压可通过配置 FLASH_CR 寄存器中的 PSIZE 位改变
    在这里插入图片描述
    在这里插入图片描述
    大部分应用场合都是用32位的宽度。

    擦除扇区

    在写入新的数据前,需要先擦除存储区域,STM32 提供了扇区擦除指令和整个 FLASH 擦除 (批量擦除) 的指令,批量擦除指令仅针对主存储区。

    擦除完成后记得将SER/MER为复位

    写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    批量擦除
    在这里插入图片描述
    在这里插入图片描述

    写入数据

    写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作
    擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
    在这里插入图片描述

    读取数据

    使用指针读取数据内容
    比如:

    (__IO uint32_t*)addr;
    (__IO uint16_t*)addr;
    (__IO uint8_t*)addr;
    
    • 1
    • 2
    • 3

    最好检查下BUSY位是否置位,检查Flash是否忙碌
    在这里插入图片描述

    查看工程文件的大小

    .map文件中,搜索Memory Map of the image
    查看Load Region
    Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0006ebb4, Max: 0x00070000, ABSOLUTE, COMPRESSED[0x0006e638])
    该工程文件写入Flash的起始地址为0x0800 0000,写入的字节长度为0x0006 ebb4

    读写用户选项字节

    选项字节是一段特殊的 FLASH 空间,STM32 芯片会根据它的内容进行读写保护、复位电压等配置,选项字节的构成见表选项字节的构成
    在这里插入图片描述
    在这里插入图片描述

    RDP 读保护级别

    修改选项字节的 RDP 位的值可设置内部 FLASH 为以下保护级别:

    • 0xAA:级别 0,无保护
      这是 STM32 的默认保护级别,它没有任何读保护,读取内部 FLASH 及“备份 SRAM”的内容都没有任何限制。(注意这里说的“备份 SRAM”是指 STM32 备份域的 SRAM空间,不是指主 SRAM,下同)
    • 其它值:级别 1,使能读保护
      把 RDP 配置成除 0xAA 或 0xCC 外的任意数值,都会使能级别 1 的读保护。在这种保护下,若使用调试功能 (使用下载器、仿真器) 或者从内部 SRAM 自举时都不能对内部 FLASH 及备份 SRAM 作任何访问 (读写、擦除都被禁止);而如果 STM32 是从内部 FLASH 自举时,它允许对内部 FLASH 及备份 SRAM 的任意访问。

    也就是说,在级别 1 模式下,任何尝试从外部访问内部 FLASH 内容的操作都被禁止,例如无法通过下载器读取它的内容,或编写一个从内部 SRAM 启动的程序,若该程序读取内部 FLASH,会被禁止。而如果是芯片自己访问内部 FLASH,是完全没有问题的,例如前面的“读写内部 FLASH”实验中的代码自己擦写内部 FLASH 空间的内容,即使处于级别 1 的读保护,也能正常擦写。

    当芯片处于级别 1 的时候,可以把选项字节的 RDP 位重新设置为 0xAA,恢复级别 0。在恢复到级别 0 前,芯片会自动擦除内部 FLASH 及备份 SRAM 的内容,即降级后原内部 FLASH 的代码会丢失。在级别 1 时使用 SRAM 自举的程序也可以访问选项字节进行修改,所以如果原内部 FLASH 的代码没有解除读保护的操作时,可以给它加载一个 SRAM 自举的程序进行保护降级,

    • 0xCC:级别 2,禁止调试
      把 RDP 配置成 0xCC 值时,会进入最高级别的读保护,且设置后无法再降级,它会永久禁止用于调试的 JTAG 接口 (相当于熔断)。在该级别中,除了具有级别 1 的所有保护功能外,进一步禁止了从 SRAM 或系统存储器的自举 (即平时使用的串口 ISP 下载功能也失效),JTAG 调试相关的功能被禁止,选项字节也不能被修改。它仅支持从内部 FLASH 自举时对内部 FLASH 及 SRAM 的访问 (读写、擦除)。

    不同级别下的访问限制见图不同级别下的访问限制 。
    在这里插入图片描述

    修改选项字节的过程

    修改选项字节的内容可修改各种配置,但是,当应用程序运行时,无法直接通过选项字节的地址改写它们的内容,例如,接使用指针操作地址 0x1FFFC0000 的修改是无效的。要改写其内容时必须设置寄存器 FLASH_OPTCR 及 FLASH_OPTCR1 中的对应数据位。

    默认情况下,FLASH_OPTCR 寄存器中的第 0 位 OPTLOCK 值为 1,它表示选项字节被上锁,需要解锁后才能进行修改,当寄存器的值设置完成后,对 FLASH_OPTCR 寄存器中的第 1 位 OPTSTRT值设置为 1,硬件就会擦除选项字节扇区的内容,并把 FLASH_OPTCR/1 寄存器中包含的值写入到选项字节。
    在这里插入图片描述

    PCROP 代码读出保护

    在 STM32F42xx 及 STM32F43xx 系列的芯片中,除了可使用 RDP 对整片 FLASH 进行读保护外,还有一个专用的代码读出保护功能(Proprietary code readoutprotection,下面简称 PCROP),它可以为内部 FLASH 的某几个指定扇区提供保护功能,所以它可以用于保护一些 IP 代码,方便提供给另一方进行二次开发,

    当 SPMOD 位设置为 0 时 (默认值),nWRPi 位用于指定要进行写保护的扇区,这可以防止错误的指针操作导致 FLASH 内容的改变,若扇区被写保护,通过调试器也无法擦除该扇区的内容;
    当SPMOD 位设置为 1 时,nWRPi 位用于指定要进行 PCROP 保护的扇区。其中 PCROP 功能可以防止指定扇区的 FLASH 内容被读出,而写保护仅可以防止误写操作,不能被防止读出。
    一般SPMOD = 0 即可,写保护

    工程文件下载链接

  • 相关阅读:
    Revit二次开发环境Addin和Lookup配置快速上手教程
    TD联合Modelsim进行功能仿真
    Vue(四)——全局事件总线, 消息订阅与发布 ,nextTick
    零代码编程:用ChatGPT多线程批量将PDF文档转换为word格式
    组件协作模式
    微信小程序怎么制作?制作一个微信小程序需要多少钱?
    装饰者模式
    canal安装与客户端使用
    iNFTnews|Opensea上爆火的Art Gobblers为何引起巨大争议?
    京东按关键字搜索商品 API
  • 原文地址:https://blog.csdn.net/qq_45607873/article/details/126093944