简述: U/ G+ j: x# m$ ^- E+ i: s
STM32CubeProgrammer(STM32CUBEPROG)为任意环境下的STM32微控制器编程提供了% P% g1 O$ R L& [
一个一体化的软件工具:多操作系统,图形用户界面或命令行界面,支持多种连接选择(JTAG、SWD、USB、UART),采用手动操作或通过脚本自动操作。4 A/ E4 g' x8 @; V% l4 w) y
0 M+ D# ~5 g+ O4 g很多情况下,我们为了程序安全,都会在烧录时,使能读保护功能,这样别人就无法通过SWD/JTAG接口访问程序了。之前的STM32 ST-LINK Utility 或者 Jlink 的Segger 软件都能很方便的找到解除读保护的办法,但是新一代的烧录程序STM32CubeProgrammer就很隐蔽了,本文就是介绍了如何通过STM32CubeProgrammer进行加密和解密。; N' [+ |! G) F/ O+ }2 q- L
^/ q+ b2 D J( _: ^2 w: H
但是请注意,取消读保护后,将对Flash和备份SRAM执行全部擦除,也就无法读出之前的程序。, Z- g0 s" Q6 n/ o! [5 ~
4 t4 {+ Z0 \' L/ S/ Q& l; C开启读保护1 J, t3 _1 k" k/ ]& z3 f+ b
为了方便测试,这里还是要先说明如何使用STM32CubeProgrammer开启读保护。
0 m( D0 E9 G4 Y7 @( u, f n: L3 T2 s. D" g I
在进行读保护设置之前,先了解一下读保护的等级,STM32的读保护有三个等级,详情参考STM32F4xx的中文参考手册。
9 B- `) Z0 b0 u6 |4 i3 T- O. e
9 b! N( L9 ~; Q$ f6 N可对 Flash 中的用户区域实施读保护,以防不受信任的代码读取其中的数据。读保护分三个 级别,具体定义如下: ]# b( l# O# v* X4 t+ U2 O
' Y& p& F" c. `& |4 t# A
- ● 级别 0:无读保护0 R3 Z* V. P. C7 @0 a Y$ V
- 将 0xAA 写入读保护选项字节 (RDP) 时,读保护级别即设为 0。此时,在所有自举配置) S, a0 T/ r2 D' h/ [ h
- (用户 Flash 自举、调试或从 RAM 自举)中,均可执行对 Flash 或备份 SRAM 的读/
% y; @) M$ Z- }" j - 写操作(如果未设置写保护)。% ?6 u8 r, S, r G0 d* q
- " \. F0 m0 z d: v' U1 G" A
- ● 级别 1:使能读保护5 c7 D( T/ g6 l* c" H0 l* L% W$ }4 j
- 这是擦除选项字节后的默认读保护级别。将任意值(分别用于设置级别 0 和级别 2 的
: S$ j% S! K" K8 e/ S5 {( @ - 0xAA 和 0xCC 除外)写入 RDP 选项字节时,即激活读保护级别 1。设置读保护级别
) o! j9 K& ?- c8 _+ D b8 }4 Z - 1 后:8 b$ O3 E3 R+ u$ S; }
- — 在连接调试功能或从 RAM 或系统存储器自举时,不能对 Flash 或备份 SRAM 进行! c" d* s( ^: q1 c
- 访问(读取、擦除、编程)。读请求将导致总线错误。
& C$ z- @& F+ Z; s" Y' d; S - — 从 Flash 自举时,允许通过用户代码对 Flash 和备份 SRAM 进行访问(读取、擦% h) n+ d/ E M* r3 i
- 除、编程)。/ V: b: g1 R' s# {; P! A
- / I1 X& P7 z, y c2 q$ f8 S
- 激活级别 1 后,如果将保护选项字节 (RDP) 编程为级别 0,则将对 Flash 和备份 SRAM/ Z% N" Q6 _( U! c$ I3 Y9 k
- 执行全部擦除。因此,在取消读保护之前,用户代码区域会清零。批量擦除操作仅擦除0 i" x$ M6 A# D; Z. ]
- 用户代码区域。包括写保护在内的其它选项字节将不受影响。OTP 区域不受批量擦除操
$ b+ z& L4 b5 J1 M6 k X - 作的影响,同样保持不变。只有在已激活级别 1 并请求级别 0 时,才会执行批量擦除。/ F- Y( J+ \+ F! t: u' Q
- 当提高保护级别 (0->1、1->2、0->2) 时,不会执行批量擦除。
- S8 ^) A; V6 \0 ^
: i; F' B2 z7 y1 N3 @ F9 Q2 |" Q- ● 级别 2:禁止调试/芯片读保护: b4 k: Y/ F n" M t! g
- 将 0xCC 写入 RDP 选项字节时,可激活读保护级别 2。设置读保护级别 2 后:% u8 |; A" q: x8 m; U
- — 级别 1 提供的所有保护均有效。2 E6 C7 i5 `% r! f0 Z) S
- — 不再允许从 RAM 或系统存储器自举。3 |" {/ ]4 h) j2 o4 A: D, I. z
- — JTAG、SWV(单线查看器)、ETM 和边界扫描处于禁止状态。
& L! z1 x9 x" C5 Z - — 用户选项字节不能再进行更改。- m7 K+ u9 D. A$ M* x3 p7 Z
- — 从 Flash 自举时,允许通过用户代码对 Flash 和备份 SRAM 进行访问(读取、擦4 O! i! X* S/ ~; v$ ^2 k& a
- 除、编程)。
8 d& T4 u) E9 J; M - 存储器读保护级别 2 是不可更改的。激活级别 2 后,保护级别不能再降回级别 0 或级别 1。2 d5 Q9 r( B* T% W o3 E
- 注意:激活级别 2 后,将永久性禁止 JTAG 端口(相当于 JTAG 熔断)。这样,将无法执行边* t/ N2 b7 ^3 L( D% R
- 界扫描。意法半导体无法对设为保护级别 2 的器件做失效分析。
复制代码 % `* ]4 ~/ k: A! }8 u
级别2特别狠,无法降级,以后只能在用户代码中使用外设(Uart、USB、ETH等)获取数据进行在线升级,所以STM32CubeProgrammer 或者 Segger加密都只使用到级别1,这样用户才能取消读保护。
% _* M# [3 K* D0 f4 e4 [
' ]4 @2 r" S, n9 k' C0 c正常情况下,在STM32CubeProgramer通过ST-LINK连接设备后,读取到空片的数据全为0xFF,我们随便下载一个LED的测试程序,下载进去。
$ L H2 Z" C O9 W0 @3 T% N" ?) k% @0 I h! Y) Z, Q
@0 G/ D& W% A* |! v2 `- B
* E# y1 P1 g" B* ~0 h" K
: S5 | A1 i9 x2 ^3 D3 }* T! t
+ [6 z0 P* g! D, t) ]
此时断电重启设备,或者在MCU Core选项卡中选择复位再运行,就能看到程序在运行了。
. [, k& M2 k4 ~9 ^! T8 r4 N8 k4 \* C! I" w9 m4 \9 q$ H
* H9 i y4 N- A/ ?$ [$ Y5 x+ t8 w7 J/ w! G
这时候我们点击 Memory & File edition,点击Read,可以正常读出程序。- C: f7 b! h$ o ?! u3 P
" D$ W u% N- `* G* h0 g, t8 f
$ C2 y- T5 K" H) ~: c6 z
% u% l) m0 v4 t* A4 Q
接下来要进行读保护的操作。切换到 Option bytes 选项卡中,可以看到Read Out Protection 中RDP是没有勾选状态的,这表示flash memory不处于读保护的状态,然后我们要勾选它,并点击下方的Apply,然后软件就会提示选项字已经写入,我们就已经使能读保护了。
) s7 c* k. y4 S( |) Y3 |3 D- A) |; V+ j: q0 z, c m
3 C5 Q+ [9 A" s8 P% _1 N% b! X' e( X
! Q ^$ L2 U4 _3 \这时候切换回Memory &File edition 选项卡,进行读操作,就会被提示读取数据失败,说明我们的读保护已经生效了。" S& G& h& i; b+ l) H. m* Y
% |& Q/ D8 t/ l3 f3 Q
1 S4 M8 o# ?8 b7 ~2 I, ^6 J& H; X! k( ]+ {3 [$ \! U4 x6 G9 i
取消读保护
, R `8 B* N {+ r2 T1 O# ?在进行读保护前,我们需要了解一下连接选项卡中的Mode的各个选项的含义。在文件UM2237中有说明,此处进行摘录。. H7 r8 y! _9 ^1 b& a
! ^) q: V3 h ~% e; o- W- 模式:9 c: f- i2 O, k2 j4 |
- – 正常:使用“Normal”连接模式时,目标是休眠的,随后挂起。使用“ResetMode”3 K' W7 r3 f' f
- 选项来选择复位的方式
$ C7 _) ~. ^8 _ - – 复位下连接:“Connect Under Reset”模式允许在执行指令之前使用复位向量捕获; h2 w8 h$ ~3 k
- 连接到目标。这在很多情况下是很有用的,例如当目标包含了禁用JTAG/SWD引脚
( w4 z' F$ H4 M' J - 的代码时。/ R" X, L4 K4 |( p) J: m
- – 热插拔:“Hot Plug”模式下可以在不停机或复位的情况下连接到目标。这对于在
; M- f8 B. e. M c* C - 应用运行时更新RAM地址或IP寄存器非常有用。6 e* X$ V# @! S; E& o
^% O/ k* Y: P$ x- 复位模式:8 H' g2 R+ m8 R, o( I
- – 软件系统复位:通过Cortex-M应用中断和复位控制寄存器(AIRCR)来复位除调
j7 K' e+ _$ | - 试以外的所有STM32组件。
3 E0 W. t1 S, A" _ - – 硬件复位:通过nRST引脚来复位STM32器件。JTAG连接器(引脚15)的RESET# S @9 i- Q$ F* V8 e& \+ ^' ?) ~
- 引脚应连接到器件复位引脚。
. u) `: c& y% ^. v6 E. |) ] - – 内核复位: 通过应用中断和复位控制寄存器(AIRCR)仅将内核Cortex-M复位。
复制代码 - ^( q ^ g# R
我们使能读保护后,也就无法通过JTAG/SWD接口访问内部flash,这对应的就是第二种情况了,所以mode我们就要选择“Connect Under Reset”,而复位模式根据情况进行选择,我使用的是SWD接口,所以选择的是"Software reset"。 r8 t* J) ^. H
5 R( g) B8 |/ R
* }9 l8 l) z& M9 D T) f6 o& y) x7 `; Y7 s" [7 h N* J" A3 |; ]3 ^
这时候切换到Option bytes选项卡中,取消勾选 Read Out Protection 中的RDP寄存器,然后点击Apply。然后软件提示' v7 S# |7 X( C2 N7 |5 J
4 P) L4 A& n2 R- L) Z& s
"Option Bytes successfully programmed"说明我们成功取消了读保护。( G" l* L) l) u' g
, ?" s2 `( o Q
8 w1 \4 T+ D: s! H, x- B
9 X! {% ]9 `" c( [3 H7 v# P
然后我们就能正常的擦除烧写程序了。- P8 Y" M, {6 j U+ O) K
+ V( x+ o# `" Q) y( G
1 F9 O: k3 S! z9 k, ~/ u
————————————————
8 R' x. ~$ f3 S- |1 X转载:fafuwxm- ]1 D- I5 u1 ]7 I4 }0 K- l
, R8 D6 J' s) Z Y
: w. Y1 j/ n1 H8 B9 x
% c2 L, Y+ A a# E |