[信息] STM32 选项字节与读写保护(RDP)

[复制链接]
149|7
晓伍 发表于 2026-8-5 14:36 | 显示全部楼层 |阅读模式
场景
芯片用 ST-Link 下载第一次报错:

Error: Flash Download failed - Target DLL has been cancelled
Internal command error
或者 CubeProgrammer 连接时提示 RDP Level 1。

说明芯片的 Flash 被读保护了。这种保护叫 RDP(Read Protection),存在选项字节(Option Bytes)里。

什么是选项字节
选项字节是 STM32 芯片的一小段独立配置区域(不在主 Flash 里),用来设置:

RDP:读保护等级

User option bytes(用户选项字节):独立看门狗/窗口看门狗硬件使能

BOR:掉电复位阈值

nRST_STDBY:Standby 模式复位功能

三种 RDP 等级

918086a6db48c7f16e.png

Level 1 是常见的"锁死"状态。可能来自:

二手芯片

项目里主动启用过

CubeProgrammer 误操作

检查 RDP 等级
用 STM32CubeProgrammer:

连接 → OB(Option Bytes)
→ Read Protection: Level 0 / Level 1 / Level 2
解除 Level 1 保护
方法一:STM32CubeProgrammer

连接芯片(如果通过 SWD 连不上,切换到 ISP 方式)

选 OB 标签

Read Protection 下拉选 Level 0(AA)

点 Apply

工具自动执行全片擦除并设置 RDP = AA

方法二:串口 ISP(FlyMCU)

进入 ISP 模式(BOOT0=1)→ 连接 → 点击"擦除芯片"→ 自动把 RDP 变回 Level 0。

代码中设置 RDP
void Enable_ReadProtection(void)
{
    FLASH_OBProgramInitTypeDef ob = {0};
    ob.OptionType = OPTIONBYTE_RDP;  // 不同 HAL 版本可能使用 OB_OPT_RDP,以实际 stm32f4xx_hal_flash_ex.h 为准
    ob.RDPLevel = OB_RDP_LEVEL_1;  // 或 LEVEL_0 / LEVEL_2

    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&ob);
    HAL_FLASH_OB_Launch();   // 生效(会复位芯片)
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
}
注意:一旦设成 Level 2,永久锁定,没有任何办法解除! 不要在产品代码中写 Level 2。

其他常见的选项字节设置
// 设置 BOR(掉电复位)
// F407 默认 BOR 关闭,电压掉到 1.8V 才复位
// 可以在 CubeProgrammer 中设置 BOR Level,让芯片在 2.7V/2.4V/2.1V 时就复位

// 硬件看门狗
// 如果设了 WDG_SW(0=硬件启动看门狗,1=软件启动),芯片一上电看门狗就开始跑
// main 执行前就复位了——那就只能用 ISP 改回来了
警告

446746a6db478cee75.png

如果芯片彻底废了
如果 RDP Level 2 或者 Bootloader 被覆盖,这块芯片就是一次性的了。普通爱好者一般没有恢复手段(除非用高端工具移除 Flash 保护位)。

保险建议:

调试阶段不要设 RDP

量产时用 Level 1(防止读抄),但要留 ISP 擦除能力

***不要用 Level 2
————————————————
版权声明:本文为CSDN博主「2401_85415155」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2401_85415155/article/details/162750161

xiaoqizi 发表于 2026-8-6 22:39 | 显示全部楼层
选项字节是STM32芯片中独立于主Flash的专用配置存储区,物理地址固定,不占用用户程序存储空间,专门用于存储芯片级配置参数
木木guainv 发表于 2026-8-7 08:12 | 显示全部楼层
作为芯片安全策略的“控制中枢”,选项字节通过配置特定寄存器位,实现对读保护、写保护、看门狗模式、掉电复位阈值等关键功能的管控,是硬件级安全机制的配置接口
Jiangxiaopi 发表于 2026-8-7 10:26 | 显示全部楼层
读保护决定Flash是否允许被外部调试器或外部程序读取,是知识产权保护的核心配置
荣陶陶 发表于 2026-8-7 12:42 | 显示全部楼层
读写保护是STM32通过选项字节实现的两大核心安全功能,分别针对“代码窃取”和“数据篡改”两大风险,核心逻辑是通过选项字节的配置位,从硬件层面限制对Flash的访问权限
Zhiniaocun 发表于 2026-8-7 15:06 | 显示全部楼层
不同系列STM32的写保护最小单位略有差异,配置时需根据芯片容量和需求选择保护区域,核心原则是“分区隔离”
Zuocidian 发表于 2026-8-7 17:29 | 显示全部楼层
将存放固件代码的主程序扇区全部设置为写保护,确保核心程序不被意外篡改;同时预留少量未保护的扇区,用于存储用户配置参数、运行日志等需要动态修改的数据,兼顾系统稳定性与数据存储灵活性。
Puchou 发表于 2026-8-7 19:42 | 显示全部楼层
官方推荐STM32CubeProgrammer,替代旧版ST-LINK Utility,支持通过SWD、JTAG等调试接口连接芯片,可视化配置选项字节中的RDP和WRP参数
Xiashiqi 发表于 2026-8-7 21:59 | 显示全部楼层
修改选项字节过程中若出现掉电,会导致选项字节区域数据损坏,芯片可能进入不可恢复状态,配置前需确保电源稳定,可加入电压检测和电容储能电路。
小海师 发表于 2026-8-8 08:32 | 显示全部楼层
从Level 1切回Level 0会触发全片擦除,操作前必须备份固件;Level 2不可逆,严禁在研发调试阶段误操作,否则芯片报废
Haizangwang 发表于 2026-8-8 10:41 | 显示全部楼层
量产时避免上电后反复执行选项字节配置代码,可在BootLoader中加入检测逻辑,确认配置正确后跳过操作,避免影响芯片寿命
flycamelaaa 发表于 2026-8-6 14:34 | 显示全部楼层
RDP Level 2 是永久锁死,一旦设置芯片基本报废,开发阶段绝对不要尝试。
classroom 发表于 2026-8-6 15:06 | 显示全部楼层
解除 Level 1 保护必须执行全片擦除,Flash 里的程序和数据会全部丢失。
cr315 发表于 2026-8-6 15:38 | 显示全部楼层
二手芯片经常处于 Level 1 保护状态,下载报错时先检查选项字节而非怀疑硬件。
duo点 发表于 2026-8-6 16:09 | 显示全部楼层
如果 SWD 接口连不上,可以尝试将 BOOT0 拉高进入 ISP 模式进行解锁。
elephant00 发表于 2026-8-6 14:36 | 显示全部楼层
误开启硬件看门狗会导致芯片上电无限重启,需在选项字节中改为软件看门狗。
jcky001 发表于 2026-8-6 16:40 | 显示全部楼层
修改选项字节时电源必须稳定,中途断电可能导致配置错误甚至意外触发保护。
onlycook 发表于 2026-8-6 18:21 | 显示全部楼层
STM32CubeProgrammer 是管理选项字节的官方推荐工具,比旧版 ST-LINK Utility 更直观。
powerantone 发表于 2026-8-6 18:52 | 显示全部楼层
量产产品建议启用 Level 1 防止代码被读取,但需保留通过串口擦除的售后通道。
probedog 发表于 2026-8-6 19:23 | 显示全部楼层
代码中动态修改 RDP 等级后,必须调用 Launch 函数并等待芯片复位才能生效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

4731

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0