
前言 ?: P; Z7 D8 ?+ O" p, z" p5 q' o 在微控制器领域,对嵌入式代码的知识产权保护已经成为被高度重视的问题。为了提供这方面的保护,STM32 微控制器采用多种不同方法来保护 Flash 代码,避免复制和逆向工程。 本应用笔记描述了通用 STM32 系列的 Flash 保护功能。重点关注 Proprietary Code Read OutProtection(PCROP),它内嵌于中等容量的 STM32L151xC、 STM32L152xC、 STM32L162xC 和STM32L100xC微控制器中。 表 1 列出了本应用笔记涉及的微控制器 ![]() / b# G, m3 i* _' q 1 Flash 代码保护 STM32 微控制器系列产品具有下列代码保护功能: 1. 全局读保护 (Read-out Protection, RDP) 2. 写保护 3. 专有代码读保护 (Proprietary Code Read Out Protection, PCROP)2 y! L3 G( l6 p( y8 m 这些功能用来保护嵌入式固件代码的知识产权,这表示对复杂嵌入式系统的关注正在日益增加。 1.1 全局读保护 (RDP)) u5 J+ b! ~6 R! s# p$ q( F; U/ l 全局读保护可保护嵌入式固件代码 (预加载到闪存中),避免逆向工程、使用调试工具读出或其他方式的入侵攻击。 该保护在二进制代码载入嵌入式闪存后,由用户进行设置。$ C% T6 _. c `! o 表 2 描述了 3 个用户定义的保护级别。 ![]() 一旦用户代码被载入闪存中,即可避免代码倾出。可通过激活级别 1 或级别 2 保护来实现,或者通过 RDP 选项字节按照图 1. 中所示的准则进行编程。 7 V: r" t+ w5 a. M& n0 p ![]() - m! r9 K! B' w9 s' g4 o! M . \! S3 C; }7 Y9 ~4 ]3 @3 W 两个保护级别 (1 和 2)都可以保护闪存。其内容不可被 Serial Wire 或 JTAG Debug 访问、自举程序系统软件或通过向易失性 RAM 存储器载入其他软件来读取。 两个保护级别的主要区别在于易失性数据 (RAM 内容)保护,此保护仅存在于级别 2 中。RDP 保护被设为级别 1 时,调试工具仍然能够连接和访问 MCU (RAM 和寄存器)的所有易失性资源。这些工具通过向 RAM 载入一些测试代码来检查部件和 / 或系统。 _9 P9 G1 ?# m1 C 并且,级别 1 保护允许通过擦除全部 Flash 内容来恢复已编程部分。可通过将 RDP 选项字节从级别 1 重新编程为级别 0 来实现 (参见图 1)。 另一方面,级别 2 保护是不可逆的 (熔断)。一旦 RDP 设为级别 2, RDP 选项字节和所有其他选项字节都会被冻结,不能再修改。* q' w+ S H/ m2 {. P; O3 q* v 但是,用户 Flash 内容 (除了所有写保护扇区,参见第 1.2 节:写保护)在用户代码本身的控制下仍然可被更新。通过执行 IAP (In Application Programming,在应用编程)自举程序代码来允许一些扇区的固件更新。2 R7 j( T8 v! O4 h% [ 为了确保能够保护预先编程的用户代码,自举程序协议可以由用户指定 (执行相关保护来避免攻击、倾出和 / 或恶意代码更新)。 注: 利用 STM32 上提供的嵌入式 AES 加速器实现了一些 Secure Bootloader 示例,应用笔记AN4023 - STM32 安全固件升级中对此有描述。* a: g' i% r) I9 J0 _" J( C. w 关于读保护的更多详细信息,请参考微控制器参考手册。 : D; G$ M& P% q% x+ [ 1.2 写保护 写保护通过 Flash 区 (扇区)实现,可保护指定扇区,避免代码更新或擦除。 利用一个选项位来激活对每个 Flash 扇区的写保护。当设置扇区 i (选项位 nWRPi = 0)为写保护时,该扇区不能被擦除或编程。( F6 D) z+ ~ T8 t 表 3 显示了对于不同 RDP 级别的扇区写保护。 ' N9 \: m* K, L ![]() 5 @/ z5 @, O& O( D% y0 |; ` 1.3 专有代码读保护+ l8 }$ B8 R: j 专有代码读保护 (PCROP)是一种替代保护,也是通过扇区实现,可保护特定代码 (知识产权)不受攻击。2 `7 B( p& | G+ x PCROP 在微控制器代码保护和代码管理上实现了 2 种主要功能。5 r( W. t3 _! c' V 表 4 中将两种 PCROP 功能分别与 RDP 保护方法进行了对比。9 t" U) Y' G+ l- X 7 q9 J4 [# M4 {: w; S ![]() 7 ~1 b# J* y: d: L/ q. { 这种保护基于一种只执行机制。 Flash 代码区域仅能被 STM32 CPU (作为指令代码)获取,而所有其他访问 (DMA,调试和 CPU 数据读取)是严格禁止的。 在保护可执行代码不被读取时,这种只执行机制会产生一种副作用,导致被保护代码本身(从该区域执行)不能访问存储在相同区域的相关数据值 (如文字库)。为了避免该区域中数据访问的需要 (特别是文字库访问),必须在 ARM/Keil 编译器中选择一个特殊的命令行选项: (armcc --no_literal_pools --max_string_in_code = 0). : p: ? i% v' d, |5 X* h0 | b" O2 @ 6 P$ _& s/ y% r, A: G 此命令行选项使用其他指令转换文字库操作。这些指令可创建寄存器值,而无需任何数据读取访问。它主要用于载入地址可变寄存器。由于替代方法效率较低,此选项将这些操作转换为效率略低的代码。但性能损失是有限的 (低于 5%),这对于受保护的代码部分来说是可接受的。 利用与写保护同样的选项字节来选择 PCROP 扇区。因此这 2 个选项是互斥的。但是,受保护不被读取的扇区 (PCROP)也不会被写入 / 擦除。因此, PCROP 可认为是扇区写保护的超集。 为了激活 PCROP (改变 nWRP 选项位的功能),必须激活 SPRMOD 选项位。该操作是不可逆的。 同样在 PCROP 模式下,设置为读保护的扇区也不能被复位成无保护状态。因此,新扇区可成为读保护区 (当 RDP 设为级别 0 或 1 时),但是被保护的扇区不能通过擦除或修改成为无保护区。' H7 @' ?. N3 e; X 根据 RDP 级别,存在可能的变通方案来恢复受保护芯片。若 STM32 处于 RDP 级别 1 且RDP 选项字节设为级别 0,则用户 Flash 区域将被完全擦除。这是 SPRMOD 和 nWRP 位可被复位、所有受保护扇区成为无保护的唯一一种情形。 但是,由于此操作总是与用户 Flash 区域的全局擦除相关联,因此代码保护不受影响。 当 RDP 设为级别 2,所有选项字节都会被冻结,不能再修改。因此,受保护扇区不能再被擦除或修改,这样就成为永久性保护。: Y4 i# E" Q# s- W- j ; f, a# _4 X+ z& b% T# N' G/ }& x 完整版请查看:附件 |
DM00075930_ZHV1.pdf
下载265.09 KB, 下载次数: 0
基于STM32L协议传输数据到阿里云物联网平台
stm32L451比较器使用
在 STM32 F0、 F2、 F3、 F4 和 L1 系列MCU 中使用硬件实时时钟 (RTC)
使用 STM32L1xx 微控制器与外部 I2S 音频编解码器 播放音频文件
STM32L1xx 与 STM32L1xx-A 的差别
从 STM32L1 系列移植到 STM32L4 系列微控制器
如何校准 STM32L1xx 内部 RC 振荡器
使用 STM32L1xx 微控制器与外部 I2S 音频编解码器播放音频文件
STM32L1x 温度传感器应用举例
STM32L1xxx 硬件开发入门