尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

ST-LINK Utility设置STM32读写保护:固件防抄实操指南

发布时间:2026/9/24 6:50:43

资讯中心
01
ARTICLE

ST-LINK Utility设置STM32读写保护:固件防抄实操指南

ST-LINK Utility设置STM32读写保护:固件防抄实操指南
做单片机开发这么多年说个挺扎心的事我见过太多人程序写得漂亮却栽在“固件被抄”这一关。尤其是做产品量产的朋友板子打样出去、交给代工厂贴片或者送到客户手里做现场调试FW被人家用ST-LINK直接把Flash读走的事情真不是段子。说句不好听的SWD口默认就是敞开的对方只要接四根线、点一下连接你的hex就变成对方的技术资料了。今天这篇就把ST-LINK Utility设置STM32读写保护这件事从头到尾捋一遍包括最关键的解除方法基本上你照着做就不会再犯我当初那种低级错误。先说清楚这套方法适合谁适合正在做产品化、要给固件加密的嵌入式工程师买了ST-LINK但还没弄清Option Bytes是什么的新手以及那些“量产前最后一秒才发现自己的硬件等于裸奔”的赶工党。ST-LINK Utility虽然是意法半导体早年的老牌工具现在官方主推STM32CubeProgrammer但Utility在设置读写保护这个场景下依然稳定好用很多老工程师手上都留了一份不占资源、启动快、操作路径直观拿来给板子做量产保护足够了。耐心看完这篇文章你能明白读保护和写保护到底在防什么怎么设置不会把芯片搞成砖以及万一设错了怎么安全解除。1. 先搞清楚STM32的“读写保护”到底保护了什么1.1 被抄的不是“电路”而是“固件”我遇到过几个来咨询的兄弟张口就是“我板子被人抄了”仔细一问其实抄的是原理图和PCB固件人家压根没碰到。但这里有个很狠的逻辑现在MCU的性能和资源都够用很多产品真正的技术门槛不在硬件电路而在固件算法、通信协议、标定数据和调试积累。硬件抄板顶多费点时间固件被读走相当于你几年的调参、踩坑、写代码积累全部白送。关键在于STM32的Flash默认是可读的。只要芯片没有被设置读保护拿一个ST-LINK连上SWD接口打开ST-LINK UtilityTarget - Connect再Target - Read Memory整个Flash内容就能按地址导出来。对方导出一个hex文件之后反汇编、看字符串、扒协议一套流程下来你的产品跟“开源”没什么区别。所以读保护RDP要解决的核心问题就是阻止调试接口读取Flash内容。这是防抄的第一道门也是最基础的一道门。1.2 读保护的三级设置RDP Level 0 / Level 1 / Level 2ST-LINK Utility的Option Bytes里有一个下拉框叫Read Out Protection对应关系如下级别含义调试接口能否读Flash能否重新烧录能否降级典型场景Level 0无保护可以可以-研发调试阶段Level 1使能读保护不可以可以可以但降级会触发全片擦除产品量产、出厂前Level 2最高级别保护不可以不可以不可以不可逆极度敏感的项目慎用Level 0就是芯片默认状态出厂全是这个。Level 1是绝大部分产品应该设置的级别设置了之后别人通过SWD接口连上芯片能读IDCODE、能擦除Flash这由保护设计决定但是读不到Flash里的程序内容。注意重点Level 1降回Level 0的时候芯片硬件层面会强制执行一次Flash全片擦除这个擦除是不可绕过的。换句话说你想给别人解除保护又不擦固件做不到这是芯片设计层面的强制逻辑。Level 2则是更极端的存在开启之后调试接口完全不可用芯片也没法通过SWD再烧录了只能通过Bootloader或者专用工具做部分操作而且不能降级。谁把Level 2设上去谁就要做好“这块芯片从此跟调试器绝缘”的心理准备。所以我的建议是除非你烧录完固件后一辈子不想再动它否则不要在研发阶段开Level 2。1.3 写保护WRP和读保护是两码事和读保护经常一起出现的是Flash写保护Write Protection。很多人一开始分不清这俩我直接用一句话说明白读保护是防“看”写保护是防“写”。写保护可以对Flash按扇区设置开启后对应扇区的内容不能被擦除、不能被改写。它的典型用途是保护Bootloader区域防止APP升级时不小心把Bootloader搞坏或者防止别人通过调试接口往你固件区域写恶意代码。但要注意写保护并不防读。如果只开了写保护没开读保护别人照样可以把你的程序从Flash里读出来。所以稳妥的做法是读保护配合写保护一起开RDP Level 1挡住读取WRP保护关键扇区。1.4 选项字节里还有一堆“坑”ST-LINK Utility的Option Bytes界面看起来很简洁实际上面板里除了读保护和写保护还有BOR级别、独立看门狗、窗口看门狗、硬件看门狗、BOOT0/Boot1选择、nRST模式等一堆选项。这些选项默认值一般是OK的新手容易犯的问题是设置保护时不小心把别的项也改了比如把看门狗选项改掉导致程序启动后运行逻辑变化。我的建议是只动你需要动的那一项比如把Read Out Protection从Disabled改成Level 1把对应Flash扇区的Write Protection勾选上其他选项一概保持默认。如果你不确定某个选项是什么意思就不要去碰它。这是操作Option Bytes的第一原则。2. 为什么选择ST-LINK Utility而不是其他工具2.1 它免费、官方、对老工程师友好ST-LINK Utility是意法半导体推出的官方工具后来官方更新的重点转向了STM32CubeProgrammerUtility基本处于“保持可用的停更状态”。可即便如此在设置读写保护这件事上Utility依然有一大批死忠用户原因很简单操作路径太顺手了。打开软件点Target - Connect再点Target - Option Bytes一个面板把读保护、写保护、选项字节全部列出来所见即所得不像某些工具非得在各种Tab里面找半天。你用STM32CubeProgrammer也能做同样的事界面还更现代但Utility的轻量和低门槛确实值得保留。2.2 它支持命令行模式方便量产这里很多人不知道ST-LINK Utility有一个命令行工具叫ST-LINK_CLI.exe安装目录里自带。写个批处理就可以一键连接、一键设置保护量产的时候非常省事C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe -c SWD -P firmware.hex -V注意上面这个路径实际根据你的安装位置调整。命令行方式适合在产线电脑上配合工装脚本用比人肉点鼠标稳定得多。2.3 和代码内设保护的方式对比有些工程师习惯在固件里调用HAL库函数来设置保护比如FLASH_OB_Unlock、FLASH_OB_RDPConfig这样的接口。这个方案有它的好处程序烧录后自己开启保护不依赖外部工具但坏处也很明显一旦保护设置代码有bug芯片可能写完保护就再也连不上调试器而你又没留Bootloader那就是活生生的砖头。用ST-LINK Utility设保护的好处是它和固件代码解耦即使在研发阶段误操作也可以通过Option Bytes窗口快速调整回来风险可控。我个人建议量产阶段用工具或产线脚本来设置保护不要轻易把保护逻辑写死在应用代码里除非你有完善的Bootloader兜底。3. 手把手实操用ST-LINK Utility设置读写保护3.1 硬件准备与接线你需要准备的东西很常规ST-LINK/V2或者ST-LINK/V3调试器一套目标板一块如果是自制板子确认SWD接口引出来了杜邦线四根SWDIO、SWCLK、GND、3.3V。部分板子还需要接NRST如果后面连接不稳定把NRST也接上。接线对应关系如下ST-LINK引脚目标板引脚SWDIOSWDIO / PA13SWCLKSWCLK / PA14GNDGND3.3V3.3V / VDDNRST可选NRST / 复位脚一定要先确认目标板的供电和ST-LINK的参考电压是否匹配。很多自制板子是3.3V供电ST-LINK/V2的3.3V引脚可以直接给板子供电但电流有限如果板上有电机、LED灯带、无线模块之类的大电流负载别指望ST-LINK供电单独给板子供电两边共地就行。共地是关键中的关键不共地SWD通信基本上是废的。3.2 连接目标板并确认芯片识别打开ST-LINK Utility把ST-LINK插到电脑USB口板子上电然后点击软件右上角的Connect按钮或者菜单Target - Connect。连接成功后软件界面会显示目标芯片的型号、IDCODE、Flash大小等信息。比如显示STM32F103C8Flash 64KB这就说明连接正常。如果连接失败十有八九是接线问题先检查SWDIO/SWCLK有没有接反再确认共地。连接成功之后先别急着设保护先做一件事Target - Read Memory随便读几个地址。这一步是为了确认当前芯片Flash是非保护状态。如果读到的是正常数据或FF说明芯片处于Level 0无保护状态可以正常操作。如果读出来全是FF或者弹窗提示无法读取那就要考虑芯片是不是已经被设过保护了。3.3 设置读保护RDP Level 1连上芯片后进入Target - Option Bytes在弹出的对话框中找到Read Out Protection一项下拉选择Level 1。如果面板里没有这个下拉框注意看界面右侧的滚动条有时候被折叠在下面。选择之后点击Apply。此时ST-LINK Utility会弹出一个警告框大意是“使能读保护之后调试接口将无法访问Flash是否继续”。确认继续工具会执行选项字节编程操作过程通常一两秒完成。设置完成后你可以做一次验证断开连接再重新Connect然后尝试Read Memory。正常情况下软件会提示无法读取Flash内容或者读到的大多数地址是0xFF。这就说明读保护已经生效了。这里补充一个细节Level 1读保护开启后ST-LINK仍然能通过SWD接口控制芯片比如执行擦除操作。这是很多人的认知误区以为开了读保护之后“芯片连不上了”。实际上能连上只是读不到有效程序而已。正因为如此Level 1才有降级回Level 0的余地而Level 2是连连接都废了。3.4 设置写保护WRP写保护设置在同一个Option Bytes对话框里一般是一个Flash扇区选择列表或者需要勾选对应扇区。不同型号的STM32扇区划分不一样比如STM32F103系列小容量芯片扇区是1KB或者4KBSTM32F407系列则是16KB起步的大扇区。你想保护哪一段就在哪一段的扇区前面打勾。举个常见场景0x08000000 ~ 0x08003FFF是Bootloader区域占用若干个扇区如果你想防止别人改写Bootloader就把这些扇区的写保护勾上0x08004000之后的APP区域如果也怕被破坏可以一并勾上。设置完成后同样点Apply。写完保护之后固件和调试器都不能直接擦除对应扇区这一点要注意如果你后续想烧录新程序需要先把对应扇区的写保护关掉。3.5 验证保护是否生效设置完毕后一定要验证。具体操作断开当前连接拔掉ST-LINK或者将板子断电再上电重新Connect确认能连上尝试Read Memory确认读不到有效程序尝试Program或者用ST-LINK Utility擦除Flash看能不能写进去。如果读保护生效而写保护没生效你会看到读取失败但擦除成功如果写保护生效执行擦除的时候会弹出错误提示。通过这几种组合基本能判断出当前芯片处于什么保护状态。3.6 最容易忽略的一步把整个Flash区域都保护起来说实话我早期犯过一个错只对APP区域开了读保护Bootloader区域反而是开放的。后来想想这等于给攻击者留了后门。一旦对方通过Bootloader做固件升级通道分析你的固件或者利用Stack overflow之类的漏洞注入代码App区域的保护就变成了摆设。正确的做法是产品正式量产时把Bootloader和APP对应的整个Flash区域全部纳入保护范围。如果你为了后续OTA升级方便需要在Bootloader里保留一部分可写的临时存储区那就只对真正的Bootloader代码区做写保护APP区做读保护即可。但无论怎么安排最终目标一定是让别人无法通过调试接口读到你的任何一段机器码。4. 解除保护的正确姿势4.1 解除读保护回到Level 0必有全片擦除解除读保护相对于设置保护来说有一个很多新人容易忽略的严重后果从Level 1降回Level 0芯片会自动触发全片Flash擦除。这不是工具做的是芯片内部的保护逻辑强制执行的。它的目的在于防止已经读到过内存内容的人通过降级继续保留数据。操作路径依然是Target - Option Bytes把Read Out Protection从Level 1改回Level 0点Apply。这时Utility会再次弹出警告明确告诉你降级将擦除整个Flash。确认后工具会执行擦除操作过程稍微等一下Flash容量越大耗时越长。擦除完成后芯片回到无保护状态可以正常烧录新程序。但请注意你之前芯片里的固件已经没了。所以如果你只是想“解除保护来看看老固件”那只能说你晚了只要开了Level 1再降级固件必没。4.2 Level 2解除的问题基本宣告死刑Level 2读保护是一种不可逆的状态。从Level 2切换到Level 0是不可能的部分型号甚至不支持从Level 2做任何调试操作。也就是说一旦开了Level 2这片芯片对调试器来说就是一块废片只能通过出厂Bootloader或专门的恢复流程处理而且不同系列芯片的恢复方式完全不同。所以对于绝大多数场景我都不建议开Level 2除非你的产品固件价值极高、且量产之后确实完全不需要现场调试。要知道哪怕是同一个系列的芯片有些型号的Level 2行为也有差异官方手册里大多会标注“Level 2 can only be disabled by a mass erase through the bootloader”之类的说明但实际执行条件很苛刻。我个人的态度是不熟悉的场合别碰Level 2。4.3 解除写保护不会全片擦除但也要小心写保护解除相对温和一些。在Option Bytes面板里把之前勾选的Flash扇区取消勾选Apply之后这些扇区就可以正常擦除和写入。取消写保护不会触发全片擦除这点和读保护降级不一样。但是有一个细节如果你之前开启了读保护Level 1那么不管你在Option Bytes里怎样调整写保护只要读保护级别要降回Level 0依然会触发全片擦除。所以先解除写保护再降读保护和先降读保护再解除写保护最终结果都是Flash内容没了。你要有心理准备。4.4 解除保护后的状态检查解除保护之后规矩点做一次完整的状态检查确认ST-LINK能正常连接查看Option Bytes面板确认RDP处于Disabled状态确认WRP对应的扇区没有被勾选烧录一个测试程序验证Flash可读可写。如果以上都正常说明这块芯片从保护状态成功恢复到了开发状态。如果发现能连接但烧录失败多数情况下是写保护没解除干净或者解除保护之后没有复位芯片导致寄存器状态和Option Bytes面板显示不一致。4.5 解除保护过程中软件卡死的应对ST-LINK Utility在解除保护的时候偶尔会遇到进度条卡住不动的情况。遇到这种问题多半是目标板供电不稳或者通信线接触不良造成的。尤其使用杜邦线连接的时候稍微晃动一下就可能断掉通信。碰到卡死我的处理顺序是先别急等10秒看进度条是否继续前进如果一直卡着断开连接、关闭软件目标板断电重新上电重新打开ST-LINK Utility重新连接再次尝试解除保护。如果还是卡就检查一下NRST有没有接上。把NRST接到ST-LINK上很多通信不畅的问题会迎刃而解。5. 实战踩坑与问题排查实录5.1 ST-LINK连接失败最常见的原因是什么我在各个技术群和实际项目里遇到的连接失败问题百分之八十都是下面这几类原因第一接线错误。SWDIO和SWCLK接反是最常见的其次是GND没接。这里有个经验连接不上的时候先把万用表量一遍通断尤其是杜邦线探针那种焊点虚焊的情况多得超乎想象。第二目标板没供电或者供电电压过低。ST-LINK的3.3V输出能力有限如果目标板负载过大电压一掉芯片就进入欠压或不稳定状态。万用表测一下目标板核心电源引脚3.3V有没有稳住。第三芯片被之前设置的保护状态卡住了。比如Level 1保护下虽然能连上但某些操作会表现异常。你别觉得芯片“坏了”先查Option Bytes。第四ST-LINK本身固件版本太老。ST-LINK Utility在连接一些新型号芯片时会提示升级ST-LINK固件如果提示了老老实实升级。升级固件是安全的不会影响调试器本身。5.2 设置了读保护之后为什么还能连上却死活烧不进程序这个问题在很多论坛被反复问过。原因很简单读保护Level 1下调试接口依然可以执行某些命令比如连接、读IDCODE、擦除Flash但你不能往Flash里写有效代码也不能读取Flash内容。对于这种情况你需要做的其实是“先降保护再烧录”。在Option Bytes里把RDP改成Level 0确认后会全片擦除然后芯片就恢复到可以烧录的状态。如果你烧录失败的原因是写保护那么先把WRP对应扇区取消再烧录。有一个很微妙的点如果你开启了读保护之后还没降级就尝试用ST-LINK Utility的Program按钮烧录工具并不总是报一个明确的错误提示有时它会一直停在“Programming”状态。这时候别误会是工具坏了它只是根本没法写入。5.3 芯片被写保护锁死如何恢复如果只是开了写保护而没开读保护恢复比较简单Option Bytes里取消WRP勾选Apply即可不会擦除Flash程序数据还在。如果开写保护的同时开了读保护那降读保护必然全片擦除程序肯定没了没什么好纠结的。更麻烦的情况是写保护覆盖了Bootloader区域但你又需要修改Bootloader。这时候连接调试器可能还能识别芯片但擦除Bootloader扇区会失败。解决办法就是先把所有扇区的写保护取消然后再执行擦除。5.4 SWD引脚被程序复用成普通IO导致没法连接这是一个非常隐蔽的坑。有些工程师为了省引脚把PA13SWDIO、PA14SWCLK配置成了普通GPIO或者在调试接口引脚上接了外设。这样一来程序一旦跑起来这四个引脚就被占用ST-LINK自然连不上。遇到这种情况用下面几个思路轮番尝试把BOOT0拉高将芯片启动模式切到系统存储器System Memory让芯片跑内部的Bootloader不进用户程序SWD接口的引脚就释放了按住复位键在ST-LINK Utility里发起连接指令在芯片复位的瞬间松手有时候能抢在用户程序配置GPIO之前连接上如果芯片支持串口ISP用串口方式擦除整个Flash把用户程序清掉之后再连SWD。这个方法适用于没有开读保护的情况。如果已经开了Level 1保护那连ISP都不太好使因为读保护状态下芯片对调试和下载的响应策略会更严。5.5 常见问题速查表现象可能原因解决方案ST-LINK无法连接接线错误、供电不稳重新接线、万用表量通断、确认共地能连接但读Flash全是0xFFRDP Level 1已开启确认保护状态如需读取则先解除保护能连接但不能烧录RDP Level 1或WRP开启先解除保护再烧录解除保护时卡住供电不稳、线材接触不良断电重上检查NRST更换线材SWD引脚被复用连不上程序里把SWD引脚配置成GPIOBOOT0拉高进SystemMemory或按住复位抢连烧录后程序跑飞选项字节被误改恢复默认Option Bytes重点检查看门狗/BOR5.6 操作保护之前的唯一铁律先备份固件最后强调一遍不管你是要设置保护还是解除保护动手之前先把当前Flash内容完整读出来备份。在Level 0状态ST-LINK Utility可以直接Read Memory读到全部内容存成hex或者bin文件放到安全地方。一旦设了Level 1再降级Flash就会全部擦除没有备份你就只能捶胸顿足了。这个习惯看起来很简单但真到了需要恢复程序的时候你会发现它比任何技巧都值钱。我自己做项目的时候烧录前备份、设保护前再备份两道备份才敢动手。6. 延伸程序防抄不止是“读保护”这一件事6.1 读保护能防“读”但防不了“侧信道”读保护解决的是通过调试接口读取Flash的常规攻击路径。但现实中还有两种常见的攻击思路需要留意通过引导程序漏洞获取固件内容比如你的Bootloader支持固件上传和读取功能被攻击者利用通过电源侧信道分析或激光切割等方式直接物理提取Flash内容这种手段成本高但确实存在。对于消费级产品读保护加上写保护已经能挡住绝大多数抄板者。如果产品价值很高比如涉及加密算法、核心IP那就得上专用安全芯片或者MCU自带的TrustZone、PCROP专有代码读取保护之类的机制了。STM32L5、STM32H5这些新系列本身的安全架构就更完整。6.2 用芯片唯一ID绑定程序除了读保护还有一个低成本又有效的防抄思路绑定UID。每颗STM32出厂时都有一个96位唯一ID存于芯片内部寄存器。你在程序启动时读UID做某种校验不符合就直接停止运行或者进入死循环。比如可以预先把UID经过哈希后的结果烧录到Flash的某个位置程序启动时重新计算比对。这个方案虽然理论上可以被人扒出UID后绕过但实际增加了抄板成本和门槛对小项目来说性价比非常可观。简单示例读取UID的核心代码大致长这样uint32_t uid[3]; uid[0] *(volatile uint32_t *)0x1FFFF7E8; // 不同型号地址不同需查阅参考手册 uid[1] *(volatile uint32_t *)0x1FFFF7EC; uid[2] *(volatile uint32_t *)0x1FFFF7F0;不同STM32系列的UID寄存器地址不一样查阅对应参考手册后再用。把这个UID和你的加密逻辑结合比单纯开读保护又多了一道防护。6.3 量产阶段的流程建议量产烧录时一个好的流程是用ST-LINK Utility或STM32CubeProgrammer烧录完整固件立即设置RDP Level 1同时开启所需的WRP写保护设置完之后重新读一下选项字节确认保护已生效做一次上电测试确认真机功能正常。第三步非常关键很多人烧完固件设完保护就打包了根本不知道保护到底有没有成功。量产线上哪怕只有千分之一的漏失流出到市场就是百分之一百的风险。6.4 给OTA升级留一条安全的“后门”如果你的产品需要OTA升级那保护策略要重新设计。我比较推荐的结构是Bootloader区域不启用读保护但启用写保护防止意外覆盖APP区域开启读保护避免固件被读走OTA升级时APP通过IAP把新固件写入APP区域而不是通过调试接口。这样设计的好处是产线通过SWD调试口只负责烧录Bootloader和首次烧录APP之后产品转入保护状态。用户设备端通过APP自己完成升级调试口对最终用户来说基本是关闭的。如果你要做更保密的升级流程还可以在APP固件包上做签名校验从源头避免恶意固件注入。我自己做过的项目里有一款设备就是因为只给APP开了RDP结果生产测试时发现板子上的Bootloader扇区被人通过SWD接口读出来了。后来重新设计了保护策略把Bootloader和APP区域都保护起来才彻底打消了那边的顾虑。这算是用一个真实的教训换来的经验分享出来给大家参考。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。