简述) O( I2 b$ a' O% k$ T6 q5 i' U* `
STM32CubeProgrammer(STM32CUBEPROG)为任意环境下的STM32微控制器编程提供了
& Z; l* {. E# K一个一体化的软件工具:多操作系统,图形用户界面或命令行界面,支持多种连接选择(JTAG、SWD、USB、UART),采用手动操作或通过脚本自动操作。
/ [% I' b" v" P, c
% I" W$ y; S+ k, f7 J" S& ~8 P很多情况下,我们为了程序安全,都会在烧录时,使能读保护功能,这样别人就无法通过SWD/JTAG接口访问程序了。之前的STM32 ST-LINK Utility 或者 Jlink 的Segger 软件都能很方便的找到解除读保护的办法,但是新一代的烧录程序STM32CubeProgrammer就很隐蔽了,本文就是介绍了如何通过STM32CubeProgrammer进行加密和解密。
9 n; |5 S' L' E j
" }1 f4 I$ B2 Y" z但是请注意,取消读保护后,将对Flash和备份SRAM执行全部擦除,也就无法读出之前的程序。6 R8 @6 P* A5 A6 v% i
' ?! B$ k' z7 h1 R* A' F) n& g' i$ F5 V开启读保护1 D0 x* W- N; w- R6 b& Y
为了方便测试,这里还是要先说明如何使用STM32CubeProgrammer开启读保护。 n% i6 {2 x" b) Q$ E; e
% F- F1 |! J& C U1 y! k
在进行读保护设置之前,先了解一下读保护的等级,STM32的读保护有三个等级,详情参考STM32F4xx的中文参考手册。6 Q8 p3 O: l, m: ?2 K: e
6 F$ {4 s6 O" [: m3 @可对 Flash 中的用户区域实施读保护,以防不受信任的代码读取其中的数据。读保护分三个 级别,具体定义如下:$ c5 M( X! [: ?6 B% m4 D9 j. }3 x
" P8 Z" }' I% U. n7 ?6 i
- ● 级别 0:无读保护
# l9 t- d, n* k - 将 0xAA 写入读保护选项字节 (RDP) 时,读保护级别即设为 0。此时,在所有自举配置: e5 _( E/ Q/ ]0 e, l
- (用户 Flash 自举、调试或从 RAM 自举)中,均可执行对 Flash 或备份 SRAM 的读/
8 K4 u( C2 T0 { W0 o - 写操作(如果未设置写保护)。
2 k. ^ h, s; z1 R |+ j! A - 0 V- j( g: r$ @$ y" r5 }
- ● 级别 1:使能读保护
v: d" \" Y8 ~9 |5 i- s; H, G* j - 这是擦除选项字节后的默认读保护级别。将任意值(分别用于设置级别 0 和级别 2 的
3 j+ R# ?" i9 u$ `# W3 m$ I - 0xAA 和 0xCC 除外)写入 RDP 选项字节时,即激活读保护级别 1。设置读保护级别2 L8 O9 \1 m0 }0 k) d
- 1 后:
6 z0 M. O2 J, N' G8 V - — 在连接调试功能或从 RAM 或系统存储器自举时,不能对 Flash 或备份 SRAM 进行6 h3 G3 s; X! o; \* _4 v. b
- 访问(读取、擦除、编程)。读请求将导致总线错误。0 e1 A4 S9 t' v$ S4 I6 B7 _
- — 从 Flash 自举时,允许通过用户代码对 Flash 和备份 SRAM 进行访问(读取、擦
0 @( y6 n3 t. w, T) X1 ]1 D - 除、编程)。* l( g T2 e, N- V' u. x, m
- % h4 W$ Y! i8 t' a. U+ L3 O! L! h
- 激活级别 1 后,如果将保护选项字节 (RDP) 编程为级别 0,则将对 Flash 和备份 SRAM7 l, I. w4 r+ _4 y3 c% s0 ^3 P
- 执行全部擦除。因此,在取消读保护之前,用户代码区域会清零。批量擦除操作仅擦除 T2 N+ M: o3 C. d% l7 m
- 用户代码区域。包括写保护在内的其它选项字节将不受影响。OTP 区域不受批量擦除操
' y+ C8 R5 ?, V+ s - 作的影响,同样保持不变。只有在已激活级别 1 并请求级别 0 时,才会执行批量擦除。
- R1 K& V I3 d1 e3 o - 当提高保护级别 (0->1、1->2、0->2) 时,不会执行批量擦除。, D1 d0 M9 E3 ^$ ?
- ( }+ o, Z3 Z* t, f6 z8 {6 W
- ● 级别 2:禁止调试/芯片读保护2 r! @6 A% u( h4 R
- 将 0xCC 写入 RDP 选项字节时,可激活读保护级别 2。设置读保护级别 2 后:. h* k& Y; \/ }' f
- — 级别 1 提供的所有保护均有效。
3 j K5 f& b1 s- t - — 不再允许从 RAM 或系统存储器自举。
9 L3 c6 a ^( r0 p; l& q" d - — JTAG、SWV(单线查看器)、ETM 和边界扫描处于禁止状态。
. p+ W# W4 Z/ w+ M - — 用户选项字节不能再进行更改。
- t4 T N1 [" A7 [# b+ H# u8 _ - — 从 Flash 自举时,允许通过用户代码对 Flash 和备份 SRAM 进行访问(读取、擦4 y2 [3 d# Z7 E0 L
- 除、编程)。
; |, F2 B5 u4 p! Z& [$ y/ o - 存储器读保护级别 2 是不可更改的。激活级别 2 后,保护级别不能再降回级别 0 或级别 1。* a. [6 t; J' f/ F+ y% c. x4 `1 q
- 注意:激活级别 2 后,将永久性禁止 JTAG 端口(相当于 JTAG 熔断)。这样,将无法执行边. v2 y8 D, g! E# V# [. T
- 界扫描。意法半导体无法对设为保护级别 2 的器件做失效分析。
复制代码
1 A. Z) O9 r- O# F" k级别2特别狠,无法降级,以后只能在用户代码中使用外设(Uart、USB、ETH等)获取数据进行在线升级,所以STM32CubeProgrammer 或者 Segger加密都只使用到级别1,这样用户才能取消读保护。
2 d8 T) I7 t, \' T5 C
/ v; D. R8 Q3 O$ s7 U2 B3 h正常情况下,在STM32CubeProgramer通过ST-LINK连接设备后,读取到空片的数据全为0xFF,我们随便下载一个LED的测试程序,下载进去。" h, g+ f" l1 Y0 i
+ A; O5 {4 ^, V4 `$ U
; t+ c2 t" D3 W
& @/ u! x. y& O! ~
) E: V1 ^5 l0 B8 J$ i0 t7 I4 l$ t( J) G( n' M4 V9 ?( d
此时断电重启设备,或者在MCU Core选项卡中选择复位再运行,就能看到程序在运行了。1 p( C" P4 b* z5 a
! `+ i! e) v% ~1 O0 A& l B8 A
( T. q' z& x+ c5 k; W* c
7 E0 ^$ b l& h8 P( k e这时候我们点击 Memory & File edition,点击Read,可以正常读出程序。
9 [, @. V5 f" M$ h( k3 |! c f6 C# Y9 P+ h- T0 ?
' `7 t0 [6 n% F v! Z# D8 Y1 h) m9 ^- m3 `2 e' R
接下来要进行读保护的操作。切换到 Option bytes 选项卡中,可以看到Read Out Protection 中RDP是没有勾选状态的,这表示flash memory不处于读保护的状态,然后我们要勾选它,并点击下方的Apply,然后软件就会提示选项字已经写入,我们就已经使能读保护了。
0 s# b' T# y; K( `% }0 q( Z
& F4 p# G0 J# l9 [& I
( E; J- r2 P5 z2 ~7 i8 [% E: l: A$ t9 k- k
这时候切换回Memory &File edition 选项卡,进行读操作,就会被提示读取数据失败,说明我们的读保护已经生效了。2 t4 B3 w7 a: u" v, p7 g
) j: X: G0 k8 ?9 n+ j
/ L; n i9 J9 n% s! d, _' f; M+ c
" `- r9 m* h; [2 c7 |取消读保护" T3 U0 E1 P5 s* t9 G
在进行读保护前,我们需要了解一下连接选项卡中的Mode的各个选项的含义。在文件UM2237中有说明,此处进行摘录。8 M4 z3 @& S" l0 ?4 f
4 V6 W! c! ^$ A2 E( a+ ?9 z
- 模式:5 E" T. R5 T; c" v( X) y
- – 正常:使用“Normal”连接模式时,目标是休眠的,随后挂起。使用“ResetMode”
! i/ O6 `+ v0 f$ p - 选项来选择复位的方式. S. m9 N/ V( J, I9 M
- – 复位下连接:“Connect Under Reset”模式允许在执行指令之前使用复位向量捕获
% E3 ?; Q% e, v7 N* V: g - 连接到目标。这在很多情况下是很有用的,例如当目标包含了禁用JTAG/SWD引脚/ q& e9 g3 O @2 V+ @( b2 u( f
- 的代码时。
. z0 k9 H* i% W: Q - – 热插拔:“Hot Plug”模式下可以在不停机或复位的情况下连接到目标。这对于在
( ^6 O o) @$ a - 应用运行时更新RAM地址或IP寄存器非常有用。
7 ^2 R! N) |& J9 S2 {# A
/ x) g! }2 e7 ^- 复位模式:
% c$ B) {, W9 z - – 软件系统复位:通过Cortex-M应用中断和复位控制寄存器(AIRCR)来复位除调
4 l5 }, L& @! ?+ `, ?; A- q/ ~ - 试以外的所有STM32组件。
. f5 L- ]7 }/ H4 Q - – 硬件复位:通过nRST引脚来复位STM32器件。JTAG连接器(引脚15)的RESET
) R5 W/ ^/ X) \. l7 \$ F! H - 引脚应连接到器件复位引脚。' \" z' K1 S; K& X$ {
- – 内核复位: 通过应用中断和复位控制寄存器(AIRCR)仅将内核Cortex-M复位。
复制代码 0 l: X# |) `* z2 K( G0 b. Z
我们使能读保护后,也就无法通过JTAG/SWD接口访问内部flash,这对应的就是第二种情况了,所以mode我们就要选择“Connect Under Reset”,而复位模式根据情况进行选择,我使用的是SWD接口,所以选择的是"Software reset"。" \0 |( G$ ^0 p
N; }0 k6 i0 |
; B7 M; ~# \4 T- _
+ o6 t( h% w4 J! G$ J+ c& P
这时候切换到Option bytes选项卡中,取消勾选 Read Out Protection 中的RDP寄存器,然后点击Apply。然后软件提示9 E3 G8 }4 }: `% A/ M. C
# ~+ L6 g s& w, T; c
"Option Bytes successfully programmed"说明我们成功取消了读保护。0 U# u# O9 p8 R# Q6 q6 J3 f
( @: i5 p1 n$ g) {' t$ O7 c
3 O8 \9 {8 C. [2 [! R3 V
( c4 Q. Q/ V O2 g5 l然后我们就能正常的擦除烧写程序了。
2 Q- A" g$ U- x5 v, W; k
( y9 o6 N* }3 ? F* h7 w
, j+ t' C6 c9 V8 l/ j" _ N1 g* w———————————————— v2 O5 E$ c+ j" [. _; {
转载:fafuwxm6 n* ^4 p, c1 q: T7 T6 Y
/ `! B! s' x! [) I1 j+ h
O. o. K- a' H* }+ e/ n b
/ |2 T' L/ Z& B: F# A |