STM32 FLASH读写 保护
STM32 FLASH读写 保护
STM32 微控制器的内部 FLASH 存储器提供了重要的保护机制,防止未经授权的读取(保护知识产权)和意外的写入/擦除(保护固件)。主要涉及以下三种保护:
-
读保护 (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 全片擦除。
-
写保护 (Write Protection - WRPA / WRPB)
- 目的: 防止用户代码或外部编程工具意外或恶意地修改(编程/擦除)FLASH 的特定区域。保护引导程序、配置参数、校准数据等关键区域不被覆盖。
- 机制:
- 通过选项字节配置写保护区域。可以保护:
- 整个 FLASH 扇区 (Sector / Page)。
- 整个 FLASH Bank (在双 Bank 设备上)。
- 特定的地址范围 (在某些系列上)。
- 被写保护的区域无法被擦除或编程。尝试操作会导致 FLASH 状态寄存器 (
FLASH_SR) 中的写保护错误标志 (WRPERR) 置位,操作失败。 - 用户代码和调试器都受此限制。
- 通过选项字节配置写保护区域。可以保护:
- 解除方法: 通过修改选项字节中对应的写保护位 (
nWRPAx,nWPRBx等) 来解除对特定区域的保护。解除写保护通常需要先解除 RDP Level 1 保护(如果已启用),这会触发全片擦除! 解除后需要重新配置写保护。
-
选项字节保护 (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 则无法解除)。
- 如果由
关键点与操作流程摘要:
- 层级关系: OBP 保护 RDP/WRP 的设置。RDP Level 1/2 保护 FLASH 内容读取和隐含保护选项字节。WRP 保护 FLASH 内容写入。
- 修改保护设置: 必须通过修改选项字节完成。
- 解锁选项字节: 通常需要:
- 确保 RDP 处于 Level 0 (如果当前是 Level 1,降级会擦除整个 FLASH!Level 2 无法降级)。
- 执行特定的解锁序列(写
FLASH_OPTKEYR寄存器)。
- 设置 RDP Level 1:
- 解锁选项字节。
- 将选项字节中的 RDP 位设置为 Level 1 的值 (通常是
0xBB或类似,具体看参考手册)。 - 执行选项字节加载/重载操作(设置
FLASH_CR中的OPTSTRT位)。 - 芯片会复位,之后读保护生效。
- 解除 RDP Level 1 (降级到 Level 0):
- 这是一个破坏性操作!
- 尝试通过调试器或用户代码将 RDP 位改回 Level 0 (通常是
0xAA或0x55)。 - 芯片会自动触发一次全片 FLASH 擦除。
- 芯片复位后,RDP 变为 Level 0,FLASH 为空。
- 设置写保护 (WRP):
- 确保 RDP 是 Level 0 或已解锁选项字节。
- 解锁选项字节。
- 在选项字节中设置对应扇区/Bank/范围的写保护位 (
nWRPx = 0表示保护,1表示不保护 - 注意位是取反的! 务必查阅手册)。 - 执行选项字节加载/重载操作。
- 芯片复位后,写保护生效。
- 解除写保护 (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
重要警告与注意事项:
- 全片擦除: 将 RDP 从 Level 1 降级到 Level 0 一定会擦除整个主 FLASH 存储区(不包括选项字节本身和备份域 SRAM 内容也会丢失)。务必提前做好数据备份!
- 不可逆性 (RDP Level 2): 一旦设置 RDP Level 2,无法再通过任何方式降级或读取 FLASH 内容。调试接口永久失效。仅用于最终量产且确定不再需要更新或读取内部代码的场景。
- 谨慎操作: 错误的选项字节配置(如错误的 RDP 值)可能导致芯片锁死(进入 RDP Level 2 状态或无法启动)。务必参考对应型号的最新版参考手册 (Reference Manual - RM) 和 Flash programming manual。
- 型号差异: 不同 STM32 系列(F0, F1, F3, F4, F7, H7, G0, G4, L4, L5 等)在选项字节的具体地址、位定义、保护级别名称(如 F1 有 Level 0.5, 1, 2)、解锁序列和 HAL/LL 库函数名称上可能有细微差别。务必查阅你所使用芯片的具体文档。
- 调试影响: 启用 RDP Level 1 或更高后,常规的 JTAG/SWD 调试将失效。开发调试阶段通常保持 RDP Level 0。量产时再启用保护。
- 用户代码访问: RDP Level 1 只阻止外部读取。芯片上运行的用户代码使用指针 (
*(volatile uint32_t*)0x08000000) 或memcpy读取 FLASH 自身代码或数据完全不受影响且是安全的。写保护 (WRP) 限制的是写/擦除操作。
最佳实践建议:
- 开发阶段: 保持 RDP Level 0 和必要的 WRP 关闭,方便调试和更新。
- 测试阶段: 测试 RDP Level 1 和解除流程(包括全片擦除恢复),确保流程正确。
- 量产阶段:
- 对于大多数需要保护且可能后续更新的产品:使用 RDP Level 1。需要更新时,使用专门的升级程序(通常通过 Bootloader)执行 RDP 降级(擦除)-> 写入新固件 -> 重新启用 RDP Level 1。
- 对于极高安全要求且永不需要更新固件或读取内部代码的产品:考虑使用 RDP Level 2 (如果芯片支持)。
- 务必启用写保护 (WRP) 保护关键区域(如 Bootloader 区、配置区)。
- 文档: 详细记录产品中使用的保护级别和区域,以及后续维护/升级所需的特殊流程。
理解并正确使用 STM32 的 FLASH 保护机制,对于保护你的知识产权和确保产品固件的安全稳定运行至关重要。操作前请反复确认芯片型号和对应手册的细节。
STM32CUBEIDE(16)----内部Flash读写
本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是
2023-07-27 09:24:48
第51章 设置FLASH的读写保护及解除
51.1 选项字节与读写保护在实际发布的产品中,在STM32芯片的内部FLASH存储了控制程序,如果不作任何
资料下载
佚名
2021-11-23 17:51:06
STM32CUBEMX(10)--Flash读写
本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是
2022-11-14 16:36:42
STM32F10x_SPI (硬件接口 + 软件模拟)读写Flash(25Q16)
STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
2020-03-25 13:59:46
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览