登录/注册

STM32 FLASH读写 保护

STM32 FLASH读写 保护

更多

STM32 微控制器的内部 FLASH 存储器提供了重要的保护机制,防止未经授权的读取(保护知识产权)和意外的写入/擦除(保护固件)。主要涉及以下三种保护:

  1. 读保护 (Read Protection - RDP)

    • 目的:防止通过调试接口(如 JTAG/SWD)或从 RAM 加载的程序读取 FLASH 内容**。这是保护固件代码和敏感数据(如密钥)的核心机制。
    • 级别 (常见于大多数 STM32):
      • Level 0 (RDP0): 无保护。默认状态。FLASH 内容可通过调试器或用户代码自由读取。
      • Level 1 (RDP1): 读保护启用
        • 调试器无法直接访问 FLASH 和备份域 SRAM (如果存在)。
        • 用户代码(运行在芯片上的程序)仍然可以正常读取 FLASH 内容
        • 尝试通过调试器连接通常会触发芯片复位或无法连接。
        • 重要特性:可逆。通过将 RDP 级别从 1 改回 0 可以解除保护(但会触发一次全片擦除!)。
      • Level 2 (RDP2): 永久读保护启用 (在支持此级别的型号上,如 F2/F4/F7/H7 等)。
        • 提供与 Level 1 相同的保护。
        • 关键区别:不可逆! 一旦设置,无法通过任何软件或调试接口将 RDP 级别降回 0 或 1。调试访问被永久禁用。这是最高级别的代码保护。
    • 设置/解除方法: 通过修改选项字节 (Option Bytes) 中的 RDP 位来实现。解除 Level 1 保护 (降级到 Level 0) 会触发 FLASH 全片擦除。
  2. 写保护 (Write Protection - WRPA / WRPB)

    • 目的: 防止用户代码或外部编程工具意外或恶意地修改(编程/擦除)FLASH 的特定区域。保护引导程序、配置参数、校准数据等关键区域不被覆盖。
    • 机制:
      • 通过选项字节配置写保护区域。可以保护:
        • 整个 FLASH 扇区 (Sector / Page)。
        • 整个 FLASH Bank (在双 Bank 设备上)。
        • 特定的地址范围 (在某些系列上)。
      • 被写保护的区域无法被擦除或编程。尝试操作会导致 FLASH 状态寄存器 (FLASH_SR) 中的写保护错误标志 (WRPERR) 置位,操作失败。
      • 用户代码和调试器都受此限制。
    • 解除方法: 通过修改选项字节中对应的写保护位 (nWRPAx, nWPRBx 等) 来解除对特定区域的保护。解除写保护通常需要先解除 RDP Level 1 保护(如果已启用),这会触发全片擦除! 解除后需要重新配置写保护。
  3. 选项字节保护 (Option Bytes Protection - OBP)

    • 目的: 保护选项字节本身(包括 RDP 和写保护配置)不被意外或恶意修改。防止攻击者轻易关闭 RDP 或写保护。
    • 机制:
      • 选项字节中有一个专门的保护位(通常称为 RDP 本身在 Level 1/2 时隐含保护,或独立的 OPTLOCK 位)。
      • 当保护生效时(通常是 RDP Level 1 或更高,或 OPTLOCK 置位),任何修改选项字节的尝试都会被阻止(FLASH 状态寄存器会报错)。
    • 解除方法: 这是最严格的保护层。
      • 如果由 OPTLOCK 控制,通常需要在代码中向特定的 FLASH 控制寄存器 (FLASH_OPTCR / FLASH_CR) 写入一个解锁序列(类似主 FLASH 的解锁序列)来临时解除保护以进行修改。
      • 如果由 RDP Level 1 或 2 保护,则必须先解除 RDP 保护(对于 Level 1 会触发全片擦除,Level 2 则无法解除)。

关键点与操作流程摘要:

  1. 层级关系: OBP 保护 RDP/WRP 的设置。RDP Level 1/2 保护 FLASH 内容读取和隐含保护选项字节。WRP 保护 FLASH 内容写入。
  2. 修改保护设置: 必须通过修改选项字节完成。
  3. 解锁选项字节: 通常需要:
    • 确保 RDP 处于 Level 0 (如果当前是 Level 1,降级会擦除整个 FLASH!Level 2 无法降级)。
    • 执行特定的解锁序列(写 FLASH_OPTKEYR 寄存器)。
  4. 设置 RDP Level 1:
    • 解锁选项字节。
    • 将选项字节中的 RDP 位设置为 Level 1 的值 (通常是 0xBB 或类似,具体看参考手册)。
    • 执行选项字节加载/重载操作(设置 FLASH_CR 中的 OPTSTRT 位)。
    • 芯片会复位,之后读保护生效。
  5. 解除 RDP Level 1 (降级到 Level 0):
    • 这是一个破坏性操作
    • 尝试通过调试器或用户代码将 RDP 位改回 Level 0 (通常是 0xAA0x55)。
    • 芯片会自动触发一次全片 FLASH 擦除
    • 芯片复位后,RDP 变为 Level 0,FLASH 为空。
  6. 设置写保护 (WRP):
    • 确保 RDP 是 Level 0 或已解锁选项字节。
    • 解锁选项字节。
    • 在选项字节中设置对应扇区/Bank/范围的写保护位 (nWRPx = 0 表示保护,1 表示不保护 - 注意位是取反的! 务必查阅手册)。
    • 执行选项字节加载/重载操作。
    • 芯片复位后,写保护生效。
  7. 解除写保护 (WRP):
    • 必须先解除 RDP Level 1 (如果已启用),这会擦除整个 FLASH。
    • 解锁选项字节。
    • 在选项字节中清除对应扇区/Bank/范围的写保护位 (nWRPx = 1)。
    • 执行选项字节加载/重载操作。
    • 芯片复位后,该区域写保护。

使用 HAL 库进行 RDP 操作示例 - 设置 Level 1:

#include "stm32fxxx_hal_flash.h" // 替换为你的型号头文件,如 stm32f4xx_hal_flash.h
#include "stm32fxxx_hal_flash_ex.h" // 替换为你的型号头文件

HAL_StatusTypeDef status;

// 1. 解锁 FLASH 控制寄存器 (用于操作选项字节)
HAL_FLASH_Unlock();

// 2. 解锁选项字节 (关键步骤!)
status = HAL_FLASH_OB_Unlock();
if (status != HAL_OK) {
    // 处理解锁失败错误
    HAL_FLASH_Lock();
    return;
}

// 3. 声明并初始化选项字节配置结构体
FLASH_OBProgramInitTypeDef obConfig;
obConfig.OptionType = OPTIONBYTE_RDP; // 我们要修改 RDP
obConfig.RDPLevel = OB_RDP_LEVEL_1;   // 设置为 Level 1

// 4. 编程选项字节
status = HAL_FLASHEx_OBProgram(&obConfig);
if (status != HAL_OK) {
    // 处理编程失败错误
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
    return;
}

// 5. 启动选项字节加载 (使新设置生效,会触发复位)
status = HAL_FLASH_OB_Launch();
// 执行到这里后,芯片会复位。下面的代码通常不会运行。
if (status != HAL_OK) {
    // 处理启动失败错误 (理论上不应该发生)
}

// 6. 上锁 (复位前执行,但复位会重置状态,通常可省略)
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();

解除 RDP Level 1 (降级到 Level 0 - 会擦除 FLASH!):

// ... 解锁 FLASH 和 选项字节 (同上) ...

FLASH_OBProgramInitTypeDef obConfig;
obConfig.OptionType = OPTIONBYTE_RDP;
obConfig.RDPLevel = OB_RDP_LEVEL_0; // 关键:设置为 Level 0 触发降级

status = HAL_FLASHEx_OBProgram(&obConfig);
if (status != HAL_OK) { ... }

// 此调用会触发全片擦除和复位!
status = HAL_FLASH_OB_Launch();
// 芯片复位后,FLASH 被清空,RDP 为 Level 0

重要警告与注意事项:

  1. 全片擦除: 将 RDP 从 Level 1 降级到 Level 0 一定会擦除整个主 FLASH 存储区(不包括选项字节本身和备份域 SRAM 内容也会丢失)。务必提前做好数据备份!
  2. 不可逆性 (RDP Level 2): 一旦设置 RDP Level 2,无法再通过任何方式降级或读取 FLASH 内容。调试接口永久失效。仅用于最终量产且确定不再需要更新或读取内部代码的场景。
  3. 谨慎操作: 错误的选项字节配置(如错误的 RDP 值)可能导致芯片锁死(进入 RDP Level 2 状态或无法启动)。务必参考对应型号的最新版参考手册 (Reference Manual - RM)Flash programming manual
  4. 型号差异: 不同 STM32 系列(F0, F1, F3, F4, F7, H7, G0, G4, L4, L5 等)在选项字节的具体地址、位定义、保护级别名称(如 F1 有 Level 0.5, 1, 2)、解锁序列和 HAL/LL 库函数名称上可能有细微差别。务必查阅你所使用芯片的具体文档。
  5. 调试影响: 启用 RDP Level 1 或更高后,常规的 JTAG/SWD 调试将失效。开发调试阶段通常保持 RDP Level 0。量产时再启用保护。
  6. 用户代码访问: RDP Level 1 只阻止外部读取。芯片上运行的用户代码使用指针 (*(volatile uint32_t*)0x08000000) 或 memcpy 读取 FLASH 自身代码或数据完全不受影响且是安全的。写保护 (WRP) 限制的是写/擦除操作。

最佳实践建议:

理解并正确使用 STM32 的 FLASH 保护机制,对于保护你的知识产权和确保产品固件的安全稳定运行至关重要。操作前请反复确认芯片型号和对应手册的细节。

STM32Flash写了保护怎么办?STM32如何设置读保护和解除读保护

的是读保护。 如果STM32的Flash写了保护,那么我们就不能对其进行

2023-10-29 17:24:43

讲讲STM32单片机Flash的读保护和写保护

讲讲STM32单片机Flash的读保护和写保护

2023-10-26 15:52:31

STM32CUBEIDE(16)----内部Flash读写

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是

2023-07-27 09:24:48

STM32F4内部Flash读写

之前的文章中介绍过STM32F0列的内部Flash读写《STM32Cub

资料下载 佚名 2021-12-02 11:36:25

STM32内部Flash读写问题

STM32Flash读写之Flash调试技巧文章目录先熟悉所用MCU的Flash

资料下载 佚名 2021-12-01 20:21:14

第51章 设置FLASH读写保护及解除

51.1 选项字节与读写保护在实际发布的产品中,在STM32芯片的内部FLASH存储了控制程序,如果不作任何

资料下载 佚名 2021-11-23 17:51:06

ESP8266的Flash读写详细教程

本⽂介绍ESP8266的Flash读写接⼝,Flash读写时的注意事项,

资料下载 姚小熊27 2021-03-26 14:12:30

STM32F单片机FLASH读写函数资料免费下载

本文档的主要内容详细介绍的是STM32F单片机FLASH的读写函数资料免费下载。

资料下载 djelje 2019-07-17 17:38:00

STM32CUBEMX(10)--Flash读写

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是

2022-11-14 16:36:42

设置FLASH读写保护及解除的方法

51.1 选项字节与读写保护在实际发布的产品中,在STM32芯片的内部FLASH存储了控制程序,如果不作任何

2021-12-03 07:24:21

stm32内部flash读写

stm32内部flash读写,stm32内部

2021-08-05 07:23:19

STM32_ SPI读写Flash

STM32_SPI读写Flash

2020-04-08 10:26:16

STM32F0xx_SPI读写(Flash) 配置详细过程

STM32F0xx_SPI读写(Flash)配置详细过程

2020-04-07 11:40:28

STM32F10x_SPI (硬件接口 + 软件模拟)读写Flash(25Q16)

STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

2020-03-25 13:59:46

STM32片上Flash读写一些重要知识

STM32片上Flash读写的一些重要知识

2020-03-06 14:54:24

7天热门专题 换一换
相关标签