STM32F4

Similar documents
STM32Cube_FW_F4?RTC??????BUG

EK-STM32F

ST template WORD

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

STM32F3??ADC??????????ADC

目 录

ST template WORD

untitled

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Abstract arm linux tool-chain root NET-Start! 2

STM32™ I²C

STSPIN32F0 FOCSTSW-SPIN3201

STM32 I2C

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

ICD ICD ICD ICD ICD

证券期货市场之主要诚信规范

Microsoft Word - AVR32 UC3 isp下载.doc

Using STM32 Software Library

STEVAL-SPIN3201STM32 MCUBLDC

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

标题

STM32 PDM

Chapter #

STM32™STM8™Flash

Document title can span over two lines

51 C 51 isp 10 C PCB C C C C KEIL

Microsoft Word - Data IO CS Calculate Method AppNote.doc

SST SPAC SST SoftICE SST89C5x/SST89x554RC /564RD /SST89x516/5xRD / SoftICE SoftICE MCU SoftICE SS

ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplica

如何生成库文件 (MDK 和 IAR) 问题 : 该问题由某客户提出, 主要是想自己做一个库给第三方, 但是又不想让别人得到源代码, 不知道如何去做, 尝试了几种办法, 发现都会有些问题. 调研 : 目前 ST 已经提供了各种开源的库文件 ( 如 USB/Ethernet 等等 ), 但是部分客户依

Document title can span over two lines

STM32 STM3232ARM Cortex-M3 Cortex-M3 STM32Thumb-2 STM32MCU Cortex-M3ARM MCU STM32ARM 32 ARMCortex-M3 32 STM32 Cortex-M3 ARM Cortex-M3 ARM ARM

TD

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode]

STM32Cube IAP

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

Getting started with STM32 motor control SDK v5.0 - User manual

3

01

< Essential LEDtube > | < Philips >

UM1523 用户手册 STM32F0 探索套件软件和固件环境使用入门 前言 本文介绍在 STM32F0 探索板上开发应用设计所需的软件和固件环境以及开发建议, 详细描述了评估板配套应用固件以及固件的架构和组件 本文档还指导开发新手如何在微控制器上编译并运行例程, 以及创建自己的应用程序 本文档内容

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0

untitled

STM32F10x Flash Programming (Chinese)

BlueNRG-1

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

ARM JTAG实时仿真器安装使用指南

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

Andes Technology PPT Temp

Ps22Pdf

FPGAs in Next Generation Wireless Networks WPChinese

(Microsoft Word - 92\246~\263\370)

STM8L IAP 应用程序中编程指导

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

7.4 对学生学习效果的分析机制、方式和分析情况

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L

STM32F407/STM32F417 (IAP)

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

STM32F103xxADPCM


外围器件-new.cdr

海 南 冯 琳 峰 海 南 省 锅 炉 压 力 容 器 与 特 种 设 备 检 验 所 海 南 省 定 安 县 白 蒙 路 47 号 信 XC 内 蒙 古 冯 磊 赤 峰 市 特 种 设 备 检 验 所 内 蒙 古 赤 峰 市 红 山 区 八 里 铺 油 库 路

STM32 USART

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

<4D F736F F D203039C4EAB5DA3037C6DAA3A A3A920CCABD4ADC0EDB9A4B4F3D1A7B4B4D0C2D0D4CAB5D1E9A3A8D7DCB5DA3037C6DAA3A92E646F63>

Microsoft Word - SoftICE用户指南.doc

Microsoft PowerPoint - 6-B.ppt

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

MEGAWIN

AN3226.fm

DR2010.doc

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7

C语言的应用.PDF

手册 doc

Microsoft Word - Atmel-45136A-Pick-Best-Microcontroller-Strom-Eiland-Flodell_Article_CS

ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r X Y Z R0 R1 R2 R13 R14 R15 R16 R17 R26 R27 R28 R29 R30 R31 0x00 0x

untitled

Microsoft Word - IAR-LED.doc

X713_CS_Book.book

Microsoft PowerPoint - STM32 tools Oct-2007.ppt

Ch03_嵌入式作業系統建置_01

大 綱 最 有 利 標 目 的 及 類 型 最 有 利 標 之 辦 理 方 式 準 用 最 有 利 標 取 最 有 利 標 精 神 最 有 利 標 之 類 型 及 其 相 關 規 定 適 用 最 有 利 標 準 用 最 有 利 標 及 取 最 有 利 標 精 神 作 業 程 序 及 實 務 分 析

第一章.FIT)

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>


untitled

Moto Z

CM ZT1

ATC MCU AC781x 开发板说明手册 Version 1.0.5( )

Guava学习之Resources

58 可 樂 雞 翼 土 匪 雞 翼 醉 香 雞 翼 變 化 料 理 PART 2 水 產 類 62 清 蒸 桂 花 魚 紅 辣 椒 蒜 蓉 蒸 䱽 魚 啤 酒 蒸 鱸 魚 64 煎 封 紅 衫 魚 糖 醋 煎 黃 魚 蒲 燒 秋 刀 魚 66 香 草 煎 三 文 魚 頭 日 式 汁 煮 油 甘 魚

AN4767.fm

言1.PDF

DPJJX1.DOC

ST template WORD


KT-SOPCx开发套件简明教程

PowerPoint template - Guidelines

Transcription:

应用笔记 STM32F4 系列微控制器的专有代码读取保护 前言 软件提供商开发了复杂的中间件解决方案 ( 知识产权代码, 或 IP-Code), 保护它们对于微控制器而言至关重要 为了应对这一重要需求,STM32F4xx MCU 具有以下功能 : 读保护 (RDP): 防止进行读取操作 写保护 : 防止进行不需要的写入或擦除操作 专有代码读取保护 (PCROP): 防止进行读写操作 本应用笔记对这些闪存保护技术进行了说明, 重点是专有代码读取保护 (PCROP), 并提供了 PCROP 保护的基本示例 本文档随附的 X-CUBE-PCROP 固件封装包包含了 的源代码, 以及运行示例所需的所有固件模块 本应用笔记必须与表 1 中所列的参考手册一起阅读 这些文档及其对应的数据手册均可在 www.st.com 上获取 表 1. 参考文档 产品线 STM32F401 STM32F410 STM32F411 STM32F412 STM32F413 STM32F42x/STM32F43x STM32F446 STM32F469/479 参考手册 RM0368 RM0401 RM0383 RM0402 RM0430 RM0090 RM0390 RM0386 2017 年 8 月 DocID027893 Rev 1 [English Rev 3] 1/38 www.st.com 1

目录 目录 1 读保护 (RDP).............................................. 6 1.1 读保护级别 0................................................ 6 1.2 读保护级别 1................................................ 6 1.3 读保护级别 2................................................ 6 1.4 RDP 保护的 STM32F4xx 微控制器内部闪存内容更新................. 7 2 写保护..................................................... 8 3 专有代码读保护 (Proprietary Code Read Out Protection,PCROP).. 9 3.1 PCROP 保护概述............................................ 9 3.2 如何使能 PCROP 保护......................................... 9 3.3 如何禁用 PCROP 保护........................................ 10 3.4 存放和执行 PCROP 的 IP-Code..................................11 3.4.1 不能 PCROP 保护向量表扇区................................. 11 3.4.2 PCROP 的 IP-Code 依赖关系.................................. 11 3.5 STM32F4 系列的 PCROP 功能可用性............................ 12 4............................................... 13 4.1 示例要求.................................................. 13 4.1.1 硬件要求................................................ 13 4.1.2 软件要求................................................ 13 4.2 示例概述.................................................. 13 4.2.1 软件设置................................................ 15 4.3 PCROP 保护的 IP-Code:FIR 低通滤波器......................... 15 4.4 STEP1:ST 用户级别 n....................................... 16 4.4.1 生成只执行 IP-Code........................................ 16 4.4.2 存放 IP-Code............................................. 20 4.4.3 将常量放在 PCROP 保护扇区之外............................. 21 4.4.4 保护 IP-Code............................................. 22 4.4.5 Step1-ST_Customer_level_n 项目流程......................... 23 4.4.6 执行 PCROP 保护的 IP-Code.................................. 25 4.4.7 创建头文件并生成符号定义文件.............................. 26 4.5 STEP2:ST 用户级别 n+1..................................... 29 2/38 DocID027893 Rev 1 [English Rev 3]

目录 4.5.1 创建一个最终用户项目...................................... 29 4.5.2 包含头文件并添加符号定义文件.............................. 30 4.5.3 调用 PCROP 保护的 IP-Code 函数.............................. 32 4.5.4 Step2-ST_Customer_level_n+1 项目流程....................... 32 4.5.5 运行最终用户应用程序...................................... 33 4.5.6 调试模式中的 PCROP 保护................................... 33 5 结论...................................................... 36 6 版本历史.................................................. 37 DocID027893 Rev 1 [English Rev 3] 3/38 3

表格索引 表格索引 表 1. 参考文档................................................................ 1 表 2. 闪存内容访问 vs. RDP 级别.................................................. 7 表 3. STM32F4 系列的 PCROP 可用性概述.......................................... 12 表 4. 预编程 STM32F429ZIT 内部闪存映射......................................... 29 表 5. 文档版本历史........................................................... 37 表 6. 中文文档版本历史........................................................ 37 4/38 DocID027893 Rev 1 [English Rev 3]

图片目录 图片目录 图 1. 具有 PCROP 的扇区的闪存映射............................................... 9 图 2. PCROP 与写保护......................................................... 10 图 3. PCROP 保护代码调用位于 PCROOP 保护区域之外的函数......................... 12 图 4. STM32F4 PCROP 流程示例................................................ 14 图 5. ST 用户级别 n 和级别 n+1 的示例.............................................. 14 图 6. FIR 低通滤波器函数框图................................................... 15 图 7. 包含文字池的汇编代码示例................................................. 16 图 8. 访问 FIR-Filter 选项....................................................... 17 图 9. 设置 Execute-Only 代码选项................................................. 18 图 10. 访问 FIR-Filter 选项....................................................... 19 图 11. 设置选项 No data reads in code memory..................................... 19 图 12. STM32F429ZIT 内部闪存映射............................................... 20 图 13. 分散文件修改........................................................... 21 图 14. 使用 STM32 STLink Utility 使能 PCROP........................................ 23 图 15. Step1-ST_Customer_level_n 项目流程........................................ 24 图 16. 利用 IAR 产生符号定义文件................................................. 27 图 17. 利用 Keil 产生符号定义文件................................................ 28 图 18. 向 Keil 项目中添加符号定义文件............................................ 30 图 19. 将符号定义文件类型设置为 Object 文件........................................ 31 图 20. 向 IAR 项目中添加符号定义文件.............................................. 31 图 21. Step1-ST_Customer_level_n+1 项目流程...................................... 32 图 22. PCROP 保护的 IP-Code 汇编代码的读取....................................... 34 图 23. 填写 PCROP 保护扇区起始地址.............................................. 34 图 24. PCROP 保护的 IP-Code 汇编代码的读取....................................... 35 DocID027893 Rev 1 [English Rev 3] 5/38 5

读保护 (RDP) 1 读保护 (RDP) 读取保护是全局闪存读保护, 可保护嵌入式固件代码, 避免复制 逆向工程 使用调试工具读出或其他方式的入侵攻击 该保护应在二进制代码载入嵌入式闪存后, 由用户进行设置 1.1 读保护级别 0 级别 0 是默认级别, 闪存完全打开, 可在所有引导配置 ( 调试功能, 从 RAM 从系统内存引导加载程序或从闪存启动 ) 下进行全部内存操作 这种模式下, 没有保护 ( 主要用于开发和调试 ) 1.2 读保护级别 1 激活读保护级别 1 时, 即使是从 SRAM 或系统内存引导加载程序来启动, 也不能使用调试功能 ( 如串行线路或 JTAG) 访问 ( 读取, 擦除和编程 ) 闪存或备用 SRAM 但是, 当从闪存启动时, 允许用户代码访问该内存和备用 SRAM 对受保护的闪存进行任何读取请求都会产生一个总线错误 将 RDP 选项字节重新编程为级别 0, 可禁用 RDP 级别 1 保护, 这会导致整体擦除 1.3 读保护级别 2 激活 RDP 级别 2 时, 级别 1 所支持的所有保护均有效, 芯片受到全面保护 RDP 选项字节和所有其他选项字节都会被冻结, 不能再修改 JTAG SWV( 单线查看器 ) ETM 和边界扫描被禁用 从闪存启动时, 用户代码可以访问内存内容 但是, 不再能从 SRAM 或从系统内存引导加载程序启动 这种保护是不可逆的 (JTAG 熔断 ), 所以不能回到保护级别 1 或 0 表 2 描述了从内部闪存启动, 或在调试, 或从 SRAM 或系统内存引导加载程序启动时, 对闪存 备用 SRAM 选项字节和一次性可编程字节 (OTP) 的不同访问 6/38 DocID027893 Rev 1 [English Rev 3]

读保护 (RDP) 存储区 保护级别 表 2. 闪存内容访问 vs. RDP 级别 调试, 从 RAM 或从系统内存引导加载程序启动 从 Flash 自举 ( 用户代码 ) 读取写入擦除读取写入擦除 主存储器和 BKP 选项字节 OTP 级别 1 无 (1) 无 有 级别 2 无 有 级别 1 有 有 级别 2 无 无 级别 1 无 NA (2) 有 NA (2) 级别 2 无 NA (2) 有 NA (2) 1. 仅当 RDP 从级别 1 变为级别 0 时进行擦除 OTP 区域保持不变 2. NA = 不适用 1.4 RDP 保护的 STM32F4xx 微控制器内部闪存内容更新 当 RDP 保护激活时 ( 级别 1 或级别 2), 内部闪存内容不能通过调试进行更新, 当从 SRAM 或系统内存引导加载程序启动时也不能更新 因此对最终产品的一个重要要求就是, 能够将内部闪存中的嵌入式固件升级为新的固件版本, 添加新功能并修正潜在问题 该要求可以通过实现用户专用固件来执行内部闪存的应用内编程 (IAP) 来解决, 使用诸如 USART 的通信协议来进行重新编程过程 关于 IAP 的更多详细内容, 请参考应用笔记 AN3965, 可在 www.st.com 上获取 DocID027893 Rev 1 [English Rev 3] 7/38 37

写保护 2 写保护 写保护用来保护指定扇区内容, 避免代码更新或擦除 这种保护可应用于扇区 任何写请求都会产生一个写保护错误 如果要擦除 / 编程的地址属于闪存中处于写保护状态的区域, 则通过硬件将 WRPERR 标志置位 例如, 如果闪存中至少有一个扇区是写保护的, 则不能对其进行整体擦除, 并且 WRPERR 标志置位 根据 nwpri 选项位的保护模式选择 (SPRMOD 选项位 ), 闪存扇区可为写保护或读 & 写 (PCROP) 保护模式 要激活每个闪存扇区 i 的写保护 (SPRMOD = 0), 可使用一个选项位 (nwrpi) 当设置扇区 i( 选项位 nwrpi = 0) 为写保护时, 该扇区不能被擦除或编程 可通过嵌入式用户代码或使用 STM32 ST-Link Utility 软件和调试接口, 进行使能或禁用写保护管理 8/38 DocID027893 Rev 1 [English Rev 3]

专有代码读保护 (Proprietary Code Read Out Protection,PCROP) 3 专有代码读保护 (Proprietary Code Read Out Protection,PCROP) 3.1 PCROP 保护概述 PCROP 是闪存中 IP-Code 的读写保护, 应用于扇区, 保护专有代码不被最终用户代码 调试器工具或 RAM Trojan 代码所修改或读取 任何读或写请求都会产生一个读或写保护错误 : 如果要擦除 / 编程的地址属于闪存中 PCROP 的区域, 则通过硬件将 WRPERR 标志置位 当通过 D 总线对 PCROP 的扇区执行读访问时,RDERR 标志置位 当从 PCROP 的扇区检测到读或写请求且无法运行该请求时, 会产生一个闪存操作错误中断, 并且 FLASH_SR 寄存器中的 OPERR 标志置位 这仅在 FLASH_CR 寄存器中 ERRIE 位被置位时有效 受保护的 IP-Code 可以很容易地被最终用户应用程序所调用, 并且仍能受到保护, 不可直接访问 IP-Code 本身 PCROP 不会阻止执行受保护的代码 User-code_start@ 图 1. 具有 PCROP 的扇区的闪存映射 User-code_end@ PCROP_start@ PCROP IP-Code 1 PCROP_end@ MS38228V1 3.2 如何使能 PCROP 保护 要激活 PCROP, 必须激活 SPRMOD 选项位, 这会改变 nwrp 选项位的功能 SPRMOD 选项位有效的情况下, 利用与写保护同样的选项字节, 可选择 PCROP 扇区 每个扇区可以单独进行 PCROP 保护, 还可以保护附加扇区 ( 当 RDP 设为级别 0 或 1 时 ), 而不必进行全片擦除, 这与禁用 PCROP 保护不同 DocID027893 Rev 1 [English Rev 3] 9/38 37

专有代码读保护 (Proprietary Code Read Out Protection,PCROP) 激活 PCROP 功能时应采取一些预防措施 当激活 PCROP 模式时,nWRPi 位的有效值会被反转, 因此如果 SPRMOD = 1 且 nwrpi = 1, 那么用户扇区 i 是 PCROP 保护的 要正确激活扇区 i 上的 PCROP, 必须按照以下详细步骤 : 1. 清除所有的 nwrp 位, 除了那些已经被 PCROP 保护的扇区 ( 对于具有两个 Flash 存储器组的 STM32F4 产品, 如 STM32F429ZIT,bank2 的 nwrp 位也必须清零 ); 2. 将需要 PCROP 保护的扇区 i 的 nwrpi 置位 ; 3. 通过置位 SPRMOD 位使能 PCROP 保护 关于实现 PCROP 使能的更多详细内容, 请参考所提供的 FW 包 (Step1-ST_Customer_level_n project main.c 文件 ) 中所述的 PCROP_Enable() 函数 要重点注意的是, 不能同时存在一个写保护扇区和另一个 PCROP 保护扇区 因此用户或者处于写保护模式, 对扇区进行写保护, 或者处于 PCROP 模式, 扇区为 PCROP 保护 图 2 显示了 PCROP 和写保护之间的区别 图 2. PCROP 与写保护 PCROP SPRMOD = 1b nwrp[2:1] = 11b SPRMOD = 0b nwrp[2:1] = 00b n n...... 2 PCROP 1 PCROP 0 2 1 0 MS38229V1 3.3 如何禁用 PCROP 保护 根据 RDP 级别, 如果 RDP 级别为 1 或 0, 则 PCROP 可被禁用, 但是如果 RDP 设置为级别 2, PCROP 不能被禁用 当 RDP 设为级别 2, 所有选项字节都会被冻结, 不能修改 因此,PCROP 保护的扇区不能再被擦除或修改, 这样就成为永久性保护 10/38 DocID027893 Rev 1 [English Rev 3]

专有代码读保护 (Proprietary Code Read Out Protection,PCROP) 在受保护扇区上禁用 PCROP 的唯一方法是, 将 RDP 级别从 1 改为 0, 同时清除 SPRMOD 位 应用程序开发过程中, 用户可能需要禁用 PCROP 或全局 RDP 保护, 而不必花时间开发或禁用保护功能 STM32 ST-LINK Utility 工具是一个非常简单的禁用或使能保护的方式, 利用调试接口如 JTAG 或 SWD 即可实现, 而无需开发专门的功能 关于如何使用 STM32 ST-LINK Utility 软件的更多详细信息, 请参考用户手册 UM0892, 可在 www.st.com 上获取 注 : 禁用 PCROP 或 / 和全局 RDP 保护会导致全片擦除 3.4 存放和执行 PCROP 的 IP-Code 如前所述,PCROP 不会阻止执行受保护的 IP-Code, 并且其函数可方便地被用户代码所调用 PCROP 保护扇区不被 D-Code 总线读访问, 因此这里重点指出, 只允许进行代码执行 ( 通过 I-Code 总线取指令 ), 而禁止读取数据 因此, 受保护的 IP-Code 将无法访问存储在同一区域的相关数据值 ( 如文字池 分支表或常量, 执行过程中它们通过 D-Code 总线从闪存中取出 ) PCROP 的代码必须是只可执行的代码, 不能包含任何数据 用户必须配置编译器来生成只可执行的 IP-Code, 并且避免任何数据读取, 所需编译器配置在第 4 节中有详细说明 3.4.1 不能 PCROP 保护向量表扇区 中断向量表包含了每个中断处理程序的进入点地址, 它们可由 CPU 通过 D-Code 总线进行读取 通常中断向量表位于首地址 0x08000000 的第一个扇区 ( 例外是在某些情况下, 它会被重新定位到其他区域, 如 SRAM) 将代码置于闪存中进行保护时, 必须遵守以下规则 : 向量表所在的第一个闪存扇区不能 PCROP 保护 待 PCROP 保护的代码不能位于第一个扇区中 3.4.2 PCROP 的 IP-Code 依赖关系 受保护的 IP-Code 可以从位于用户代码区域中以及 PCROP 保护区之外的库中调用函数 这种情况下,IP-Code 中包含了相关函数地址, 允许 PC( 程序计数器 ) 在执行 IP-Code 时跳转到这些函数 一旦 IP-Code 被 PCROP 保护, 则这些地址不能更改 因此, 每个调用函数必须位于 (PCROP 保护区域之外 )PCROP 保护 IP-Code 中写入的相应固定地址, 否则 PC 跳转到无效地址,IP-Code 将无法正常工作 要完全独立, 受保护 IP-Code 必须与其所有关联函数放在一起 DocID027893 Rev 1 [English Rev 3] 11/38 37

专有代码读保护 (Proprietary Code Read Out Protection,PCROP) 图 3 显示一个示例, 其中 PCROP 保护的 Function_A() 调用位于 PCROP 保护区域之外的固定地址的 Function_B() 图 3. PCROP 保护代码调用位于 PCROOP 保护区域之外的函数 User-code_start@ Function_B fixed@ User-code_end@ PCROP_start@ Function_B() { ; ; ; } Function_A() { Function_B(); } PCROP PCROP_end@ MS38280V1 3.5 STM32F4 系列的 PCROP 功能可用性 表 3 给出了 STM32F4 微控制器的 PCROP 保护可用性 闪存大小和扇区数的概述 表 3. STM32F4 系列的 PCROP 可用性概述 产品线 闪存 ( 字节 ) 扇区数 PCROP 可用性 STM32F401 最大 512 K 多达 8 有 STM32F405/415 最大 1 M 多达 12 无 STM32F407/417 最大 1 M 多达 12 无 STM32F411 最大 512 K 多达 8 有 STM32F427/437 最大 2 M 多达 24 有 STM32F429/439 最大 2 M 多达 24 有 STM32F446 最大 512 K 多达 8 有 STM32F469/479 最大 2 M 多达 24 有 12/38 DocID027893 Rev 1 [English Rev 3]

4 本应用笔记提供的固件示例对 PCROP 保护的使用情形进行了说明 开发此固件所需的所有步骤均在本章详细说明 4.1 示例要求 4.1.1 硬件要求 4.1.2 软件要求 运行此示例所需的硬件如下 : 嵌入了 STM32F429ZIT MCU 的 STM32F429I-DISCOVERY 板 微型 USB 数据线, 用来为 NUCLEO 板上电, 并连接嵌入式探索 STLINK 进行调试和编程 需要下列软件工具 : IAR Embedded Workbench 或 Keil µvision IDE STM32 STLink Utility 主要用于使能或禁用 PCROP 保护 4.2 示例概述 本例描述了 ST 用户级别 n 向 ST 用户级别 n+1 提供具有关键 IP-Code 的预编程 STM32F429ZIT MCU 的用例 IP-Code 必须通过激活 PCROP 来保护, 允许 ST 用户级别 n+1 使用其函数 ( 不能读取或修改它 ) 来对最终用户应用程序进行编程 ST 用户级别 n 应将下列输入与预加载的 STM32 MCU 一起提供 : 闪存映射, 定义了准确的 PCROP 保护 IP-Code 位置和可用的编程扇区 ST 用户级别 n+1 项目必须包含的头文件, 其中含有最终用户代码中调用的 IP-Code 函数定义 符号定义文件, 包含 PCROP 保护的 IP-Code 函数符号 所述用例如图 4 中所示意 DocID027893 Rev 1 [English Rev 3] 13/38 37

图 4. STM32F4 PCROP 流程示例 ST n IP-Code n+1 IP-Code MS38231V1 OEM( 原始设备制造商 ) 可以是使用 STM32F4 微控制器的 ST 用户级别 n 然后 OEM 提供预编程 MCU 给 ST 用户级别 n+1, 这可能是制造最终用户产品的 END CUSTOMER, 如图 5 中所示 图 5. ST 用户级别 n 和级别 n+1 的示例 OEM ST n STM32F4 MCUs STM32F4 MCUs ST n+1 MS38281V1 14/38 DocID027893 Rev 1 [English Rev 3]

4.2.1 软件设置 本应用笔记提供了两个项目 : 项目 1:STEP1-ST_Customer_level_ n 此项目显示了 ST 用户级别 n 如何存放 保护和执行其 IP-Code, 以及如何生成 IP-Code 关联文件如头文件和符号定义文件, 并提供给 ST 用户级别 n+1 的示例 此项目包括两种不同的项目配置 : PCROP-IP-Code-XO: 此配置下, 编译器配置为生成只执行 IP-Code, 避免对其进行数据读取 PCROP-IP-Code: 此配置下, 编译 IP-Code, 不阻止数据 ( 文字池 ) 生成 此配置专门用来进行测试, 显示 PCROP 保护的 IP-Code 必须为只执行代码 项目 2:STEP2-ST_Customer_level_n+1 此项目显示了 ST 用户级别 n+1, 在得到预编程了 PCROP 保护的 IP-Code 的 STM32F429ZIT 后, 如何利用这些受保护的 IP-Code 函数来创建其自己的最终用户应用程序的示例 4.3 PCROP 保护的 IP-Code:FIR 低通滤波器 作为待保护的 IP-Code 示例, 将对来自 CMSIS-DSP 的 FIR 低通滤波器算法进行描述, 重点介绍在不提供函数本身详细信息的情况下, 如何保护和调用此 IP-Code 函数 FIR 低通滤波器从输入中滤除高频信号分量 输入信号是频率为 1 KHz 和 15 KHz 的两个正弦波之和 低通滤波器 ( 其预配置截止频率设为 6 KHz) 滤除 15 KHz 信号, 在输出端留下 1 KHz 正弦波 图 6 显示了 FIR 低通滤波器框图 图 6. FIR 低通滤波器函数框图 testinput_f32_1khz_15khz FIR_lowpass_filter () MS38230V1 所用 CMSIS DSP 软件库函数 : arm_fir_init_f32(): 配置滤波器的初始化函数, 在 arm_fir_init_f32.c 文件中有描述 ; arm_fir_f32(): 表示 FIR 滤波器的初等函数, 在 arm_fir_f32.c 文件中有描述 DocID027893 Rev 1 [English Rev 3] 15/38 37

以下函数利用上述 CMSIS DSP 函数来创建 : FIR_lowpass_filter(): 表示 FIR 滤波器的全局函数, 在 fir_filter.c 文件中有描述 嵌入到 STM32F4 微控制器中的 FPU 和 DSP 用来进行信号处理和浮点计算, 以输出正确信号 关于 FIR 函数的更多详细信息, 用户可参考相关软件包里 Drivers/CMSIS/Documentation/DSP 目录中的 CMSIS 文档 4.4 STEP1:ST 用户级别 n 此阶段中,ST 用户级别 n 将 : 生成只执行 IP-Code; 将 IP-Code 置于内部闪存的扇区 2 中 ; 保护置于扇区 2 中的 IP-Code; 通过在主代码中调用其函数, 执行 IP-Code; 创建头文件, 并生成符号定义文件, 用于 STEP2-ST_Customer_level_n+1 项目 4.4.1 生成只执行 IP-Code 每个工具链都有其自己的选项, 来防止编译器生成文字池和分支表 例如,Keil 具有 Execute-only Code 选项, 而 IAR 有 No data reads in code memory 选项 图 7 显示了包含文字池的汇编代码, 其中指令格式为 VLDR <variable>, [ PC + <offset> ] 图 7. 包含文字池的汇编代码示例 16/38 DocID027893 Rev 1 [English Rev 3]

Keil : 使用 Execute-Only 命令 对于 Keil, 必须使用命令 --execute_only 来生成无文字池和分支表的代码, 防止编译器对代码扇区生成任何数据访问 --execute_only 命令必须用于 PCROP 保护的代码 要设置此命令, 请右键单击组文件或 IP-Code, 并选择 Options for Group FIR-Filter, 如图 8 中所示 图 8. 访问 FIR-Filter 选项 DocID027893 Rev 1 [English Rev 3] 17/38 37

在以下窗口中 ( 见图 9) 选择选项 Execute-only Code, 然后 execute_only 命令会自动被添加到编译器控制字符串字段中 图 9. 设置 Execute-Only 代码选项 然后在分散文件中, 用 execute-only +XO 替换选项 read only +RO 更新 Keil 分散文件 必须更新分散文件, 才能将 IP-Code 文件设置为仅执行代码, 如下所示 LR_PCROP 0x08008000 0x00004000 { ER_PCROP 0x08008000 0x00004000 { ; load address = execution address arm_fir_f32.o (+XO) arm_fir_init_f32.o (+XO) FIR_Filter.o (+XO) } } IAR: 代码内存中不进行数据读取 对于 IAR, 必须使用选项 No data reads in code memory 来防止编译器对代码扇区生成任何数据访问 要激活此选项, 请右键单击包含 IP-Code 源文件的文件组 FIR-Filter, 然后 ( 见图 10) 选择 Options 18/38 DocID027893 Rev 1 [English Rev 3]

图 10. 访问 FIR-Filter 选项 然后, 在以下窗口中, 选择选项 No data reads in code memory, 如图 11 中所示 图 11. 设置选项 No data reads in code memory DocID027893 Rev 1 [English Rev 3] 19/38 37

4.4.2 存放 IP-Code 如前所述,PCROP 保护的代码不能在中断向量表所在的第一个扇区中 这就是为什么我们要把 IP-Code 放在内部闪存的 Sector 2 BANK1 中, 而用户代码和向量表则从第一个扇区开始存放, 如图 12 所示 图 12. STM32F429ZIT 内部闪存映射 0x08000000 0x08007FFF 0x08008000 0x0800BFFF 0x0800C000 0x0800FFFF PCROP IP-Code IP-Code 0x081FFFFF MS38272V1 Keil 分散文件 要将 IP-Code 放入 Sector 2, 需按照以下顺序 : 进入 Project Options for Target, 选择连接器选项卡, 然后从 Target Dialog 中取消选中 Use Memory Layout, 如图 13 中所示, 然后点击 Edit 按钮来修改 PCROP-w-XO.sct 分散文件 然后打开分散文件 IP-Code 对象文件应放在名为 LR_PCROP 的新的专用加载区域中, 如下所示 : LR_PCROP 0x08008000 0x000040000 { ; IP Code dedicated load region ER_PCROP 0x080080000 0x00004000 { arm_fir_f32.o (+XO) arm_fir_init_f32.o (+XO) FIR_Filter.o (+XO) 20/38 DocID027893 Rev 1 [English Rev 3]

} } 图 13. 分散文件修改 IAR ICF 文件 要使用 IAR 将 IP-Code 放在 Sector 2 中, 请打开 ICF 文件并添加新的加载区域, 如下所示 : define symbol ICFEDIT_region_PCROP_start = 0x08008000; define symbol ICFEDIT_region_PCROP_end = 0x0800BFFF; define region PCROP_region = mem:[from ICFEDIT_region_PCROP_start to ICFEDIT_region_PCROP_end ]; place in PCROP_region { ro object arm_fir_f32.o, ro object arm_fir_init_f32.o, ro object FIR_Filter.o}; 4.4.3 将常量放在 PCROP 保护扇区之外 所有 IP-Code 常量 ( 例如, 整数, 浮点数或字符串 ) 必须放在 PCROP 保护的区域之外, 因为它们不能被 D-Code 总线进行访问 链接器文件可用来将常量放在特定内存区域中, 如以下示例所示 DocID027893 Rev 1 [English Rev 3] 21/38 37

示例 :IAR ICF 文件 : define symbol ICFEDIT_region_CONST_start = 0x0800C000; define symbol ICFEDIT_region_CONST_end = 0x0800FFFF; define region CONST_region = mem:[from ICFEDIT_region_CONST_start to ICFEDIT_region_CONST_end ]; place in CONST_region {section.rodata}; 对于 IAR 使用 @ operator 定义常量时, 以及对于 Keil 使用 attribute ((at(address))) 定义常量时, 另一种方法是直接将常量放在用户代码中的固定地址 本例中使用了这个方法, 在 fir_filter.c 文件中进行常量定义, 类似于下面的例子 利用 Keil, 将常量放在固定地址 const int k attribute ((at(0x0800c000))) = 500; /* 将常量 k 放在闪存的 0x0800C000 */ 利用 IAR, 将常量放在固定地址 const int k @ 0x0800C000 = 500; /* 将常量 k 放在闪存的 0x0800C000 */ 注意 : 存放 IP-Code 常量时, 用户应该考虑到这些常量可能会被 ST 用户级别 n + 1 删除或修改, 因此 IP-Code 函数将会无效 因而建议将这些常量放在专用扇区, 其中不编程用户代码 然后这个内存区域应在提供给 ST 用户级别 n+1 的闪存映射中突出显示 4.4.4 保护 IP-Code 使用 PCROP_Enable() 函数激活 PCROP 使用 Step1-ST_Customer_level_n project main.c 文件中定义的 PCROP_Enable() 函数, 激活 Sector 2 上的 PCROP, 从而实现 IP-Code 保护 当此函数至少执行了一次时,Sector 2 变为读 / 写保护的, 任何 IP-Code 修改都需要禁用 PCROP, 然后全部闪存内容都会被擦除 使用 STM32 STLink Utility 激活 PCROP 要利用 STM32 STLink 激活 Sector 2 上的 PCROP, 用户必须按照下面所示的顺序 : 板子上电, 然后在 STLink Utility 接口进入 Target Option bytes 下面的窗口中, 将闪存保护模式设置为读 / 写保护, 并使能 Sector 2 上的保护, 如图 14 中所示, 然后点击 Apply 按钮 22/38 DocID027893 Rev 1 [English Rev 3]

图 14. 使用 STM32 STLink Utility 使能 PCROP 4.4.5 Step1-ST_Customer_level_n 项目流程 图 15 说明了采用两种项目配置的 Step1-ST_Customer_level_n 项目流程 : PCROP-IP-Code-XO( 红色表示 ):PCROP 保护的 IP-Code 不包含任何文字池, 然后 FIR 滤波器算法成功运行, 注意如果从 / 向 PCROP 保护区域发送读 / 写请求, 则会产生一个读错误中断并且系统复位 PCROP-IP-Code( 蓝色表示 ):IP-Code 包含文字池, 当开始执行 PCROP 保护的 IP-Code 时, 会产生一个读操作错误中断, 然后启动系统复位, 系统重新开始 DocID027893 Rev 1 [English Rev 3] 23/38 37

图 15. Step1-ST_Customer_level_n 项目流程 LED PCROP 2 PCROP PCROP LED 2 PCROP LED PCROP IP-Code LED FIR LED PCROP-IP-Code PCROP-IP-Code-XO MS38274V1 24/38 DocID027893 Rev 1 [English Rev 3]

4.4.6 执行 PCROP 保护的 IP-Code 一旦 IP-Code 被编程在 Sector 2 上并且受到保护, 则必须通过调用用户代码中的函数来对其进行测试 本章我们将介绍, 如何执行具有两种配置的 Step1-ST_Customer_level_n 项目中 PCROP 保护的 IP-Code, 注意 PCROP-IP-Code 配置仅用于测试, 不能用于 STEP2 PCROP-IP-Code-XO 才是正确的配置, 这里编译器被设置为产生只执行 IP-Code 这是用来运行 Step2- ST_Customer_level_n+1 项目的配置 PCROP-IP-Code-XO( 必须在 STEP2 之前使用 ) 编译器配置为生成只执行 IP-Code, 避免对其进行数据读取 ( 避免文字池 ) 1. 打开位于 Step1-ST_Customer_level_n 目录中的项目, 选择您首选的工具链 2. 选择 PCROP-IP-Code-XO 配置 3. 重建所有文件 4. 按照以下顺序运行示例 : a) 为板子上电, 在载入代码之前, 检查是否存在任何 PCROP 保护或写保护的扇区 如果有, 则使用 STM32 STLink Utility 禁用该保护, 然后载入代码 程序加载完毕后, 红色 LED 应连续闪烁 ; b) 按下用户按钮键来激活 PCROP 保护, 当此完成时, 绿色 LED 会亮起,Sector 2 被 PCROP 保护, 否则红色 Led 亮起,PCROP 激活失败 ; c) 按下用户按钮键来执行在 main.c 文件中调用的 PCROP 保护 IP-Code, 绿色 LED 应连续闪烁 PCROP-IP-Code( 仅用于测试, 不能用于 STEP2) 没有使用特殊的编译器选项, 仅用于测试目的, 说明对于 PCROP 保护的代码, 必须避免代码中的数据 ( 如文字池和分支表 ) 1. 在位于 Step1-ST_Customer_level_n 目录的同一个项目中, 选择 PCROP-IP-Code 配置 2. 重建所有文件 3. 按照以下顺序运行示例 : a) 为板子上电, 在载入代码之前, 检查是否存在任何 PCROP 保护或写保护的扇区 如果有, 则利用 STM32 STLink Utility 禁用该保护, 然后载入代码 ; 当程序加载完毕时, 红色 LED 应连续闪烁 ; b) 按下用户按钮键来激活 PCROP 保护, 当此完成时, 绿色 LED 会亮起,Sector 2 被 PCROP 保护, 否则红色 LED 亮起,PCROP 激活失败 ; c) 按下用户按钮键来执行在 main.c 文件中调用的 PCROP 保护 IP-Code, 会产生一个错误操作中断, 启动系统复位, 并且红色 LED 连续闪烁 DocID027893 Rev 1 [English Rev 3] 25/38 37

解释 低通滤波器函数计算 testinput_f32_1khz_15khz 输入信号, 并输出 1 KHz 正弦波 输出数据 testoutput 随后与 MATLAB 已计算出的参考 refoutput 进行比较, 如果二者匹配, 则绿色 LED 连续闪烁, 否则红色 LED 连续闪烁 对于 PCROP-IP-Code 配置, 其中 PCROP 保护的 IP-Code 包含文字池 : 执行 IP-Code (FIR_lowpass_filter() 函数 ) 时, 不能通过 D-Code 总线访问文字池, 然后 RDERR 标志置位 OPERR 标志也被置位, 并产生一个读操作错误中断, 然后在 HAL_FLASH_OperationErrorCallback() 函数中启动系统复位, 红色 LED 连续闪烁 但是对于 PCROP-IP-Code-XO 配置,IP-Code 可正确执行, 绿色 LED 会连续闪烁 注 : 更多详细内容, 请参考固件包中的 readme.txt 4.4.7 创建头文件并生成符号定义文件 要提供给 ST 用户级别 n+1 的头文件包含要使用的 IP-Code 函数定义 本例中包含在 main.c 文件中的是 fir_filter.h 文件 利用 IAR 产生符号定义文件 IDE 中, 要导出 PCROP 保护的 IP-Code 符号, 请选择 Project Options Build Actions, 并在 Post-build 命令行文本字段中指定以下命令行 : $TOOLKIT_DIR$\bin\isymexport.exe --edit "$PROJ_DIR$\steering_file.txt" "$TARGET_PATH$" "$PROJ_DIR$\fir_filter.o" 这里, 创建 steering_file.txt 用作选项, 使生成的符号文件中只有 IP-Code 函数符号 要使符号文件中只有 IP-Code 函数, 则必须创建 steering_file.txt, 如下所示 : show arm_fir_f32 show arm_fir_init_f32 show FIR_lowpass_filter 这里 show 命令用来保留所生成符号定义文件中的首选函数 所生成符号定义文件 fir_filter.o 可通过将其添加到 STEP2-ST_Customer_level_n+1 IAR 项目中来使用 26/38 DocID027893 Rev 1 [English Rev 3]

图 16. 利用 IAR 产生符号定义文件 利用 Keil 产生符号定义文件 要利用 Keil 生成符号定义文件, 请进入 Linker 选项卡中的 Project 选项, 添加命令 -- symdefs=fir_filter.txt 并重新构建项目 DocID027893 Rev 1 [English Rev 3] 27/38 37

图 17. 利用 Keil 产生符号定义文件 名为 fir_filter.txt 的符号定义文件随后会在 Step1-ST_Customer_level_n\MDK- ARM\PCROP-IP-Code-XO 目录中创建 该文件包含项目的所有符号, 因此只能保留最终用户所调用的那些 IP-Code 函数 所有其他函数都应该被删除, 然后产生的符号定义文件为 符号定义文件 fir_filter.txt: #<SYMDEFS># ARM Linker, 5050106: Last Updated: Sat May 16 20:25:52 2015 0x08008001 T FIR_lowpass_filter 0x0800804d T arm_fir_f32 0x08008483 T arm_fir_init_f32 28/38 DocID027893 Rev 1 [English Rev 3]

4.5 STEP2:ST 用户级别 n+1 ST 用户级别 n+1 具有来自用户级别 n 的, 预加载 PCROP 保护的 IP-Code 的 STM32F429ZIT MCU, 提供的符号定义文件以及头文件 注意 : 然后参考由 ST 用户级别 n 提供的闪存映射,ST 用户级别 n+1 应 : 创建最终项目 ; 在其项目中包含 ST 用户级别 n 提供的的头文件以及添加其提供的符号定义文件 ; 调用 PCROP 保护的 IP-Code 函数 ; 执行并调试最终用户应用程序 ST 用户级别 n+1 必须使用与 ST 用户级别 n 完全相同的工具链和编译器版本, 来开发和编程 IP-Code, 否则 ST 用户级别 n+1 不能使用该 IP-Code 在所提供的示例中, 对于两个项目 STEP1-ST_Customer_level_n 和 STEP2- ST_Customer_level_n+1, 用户必须使用同样的工具链和编译器版本 例如, 如果使用了 MDK-ARM 工具链 V5.14 来运行 STEP1-ST_Customer_level_n 项目, 则必须也使用它来运行 STEP2-ST_Customer_level_n+1 项目 4.5.1 创建一个最终用户项目 ST 用户级别 n+1 将根据表 4 中所述的闪存映射来存放其代码 Sector 2( 灰色线 ) 不可用, 因为它是 PCROP 保护的, 而 Sector 3( 浅黄色线 ) 不能使用, 因为它包含 IP-Code 常量 因此, 在执行链接器文件时, 用户必须小心, 避免将任何代码放在这些区域 表 4. 预编程 STM32F429ZIT 内部闪存映射 扇区编号 (Sector number) 扇区大小起始地址内容 扇区 0 16 KB 0x08000000 扇区 1 16 KB 0x08004000 扇区 2 16 KB 0x08008000 可提供 PCROP 保护的 IP-Code 扇区 3 16 KB 0x0800C000 IP-Code 常量 扇区 4...... 扇区 11 16 KB...... 128 KB 0x08000800...... 0x080E0000 扇区 12 16 KB 0x08100000.................. 可提供 扇区 22 128 KB 0x081C0000 扇区 23 128 KB 0x081E0000 DocID027893 Rev 1 [English Rev 3] 29/38 37

PCROP 保护的 IP-Code 函数随后用来创建最终用户应用程序 位于 Step2- ST_Customer_level_n+1 目录中的项目是一个示例, 其中 PCROP 保护的 FIR Filter 函数在 main.c 文件中被调用 4.5.2 包含头文件并添加符号定义文件 ST 用户级别 n 所提供的符号定义文件应添加为传统源文件, 这是在链接 Step2- ST_Customer_level_n+1 项目中的 PCROP 保护 IP-Code 所必需的 向 Keil 项目中添加符号定义文件 符号定义文件由第 4.4.7 节中所述的 ST 用户级别 n 提供, 本例中名为 fir_filter.txt, 它必须添加到 FIR-Filter 组中, 如图 18 中所述 图 18. 向 Keil 项目中添加符号定义文件 所添加的 fir_filter.txt 文件类型必须改为 Object 文件, 而不是文本文档文件, 如图 19 中所示 30/38 DocID027893 Rev 1 [English Rev 3]

图 19. 将符号定义文件类型设置为 Object 文件 向 IAR 项目中添加符号定义文件 必须将 fir_filter.o 文件作为目标文件添加到组 FIR_Filter 中, 如图 20 中所示 图 20. 向 IAR 项目中添加符号定义文件 包含头文件 头文件 fir_filter.h 包含在 main.c 文件中, 然后用户可以调用 FIR Filter 函数 DocID027893 Rev 1 [English Rev 3] 31/38 37

4.5.3 调用 PCROP 保护的 IP-Code 函数 当 fir_filter.h 头文件包含在 main.c 文件中, 并且符号定义文件已添加到项目中时, 可调用 PCROP 保护的 IP-Code 函数 FIR_lowpass_filter() 函数 ( 在 fir_filter.c 文件中有描述 ) 在主文件中被调用, 如下所示 : FIR_lowpass_filter(inputF32, outputf32, TEST_LENGTH_SAMPLES) 其中 : inputf32: 指针, 指向包含输入信号数据的表 ; outputf32: 指针, 指向已处理输出信号数据所填充的表 ; TEST_LENGTH_SAMPLES: 待处理输入中的采样数 4.5.4 Step2-ST_Customer_level_n+1 项目流程 图 21 说明了 Step2-ST_Customer_level_n+1 项目流程 如果从 / 向 PCROP 保护的 IP-Code 发送任何读 / 写请求, 则会产生一个读操作错误中断, 启动系统复位, 然后系统重启, 红色 LED 连续闪烁 图 21. Step1-ST_Customer_level_n+1 项目流程 LED PCROP IP-Code LED FIR LED MS38275V1 32/38 DocID027893 Rev 1 [English Rev 3]

4.5.5 运行最终用户应用程序 在此阶段 IP-Code 已经由 STM32F429ZIT MCU 进行预加载并 PCROP 保护, 因此 Step1- ST_Customer_level_n 项目 (PCROP-IP-Code-XO 配置 ) 必须在运行该项目前进行加载和执行 要使程序工作, 请按照下述步骤操作 : 1. 打开位于 Step2-ST_Customer_level_n+1 目录中的项目, 选择与 STEP1 中相同的工具链 2. 重建所有文件 3. 按照以下顺序运行示例 a) 为板子上电, 并加载代码 ( 这里仅加载用户代码 ) b) 按下用户按钮键来执行在 main.c 文件中调用的 PCROP 保护 IP-Code, 绿色 LED 应 连续闪烁 注 : 更多详细内容, 请参考固件包中的 readme.txt 4.5.6 调试模式中的 PCROP 保护 在开发其最终用户应用程序时,ST 用户级别 n+1 需要调试其代码 因此, 在调试最终用户应用程序时,PCROP 保护会阻止任何对 ST 用户级别 n 所开发的 IP-Code 的读访问 本章中, 我们将介绍在调试用户代码时,PCROP 如何保护预编程 IP-Code 不被读取 下述调试示例在 Keil 项目上完成 调试最终用户应用程序 调试最终用户应用程序之前,Step1-ST_Customer_level_n 项目 (PCROP-IP-Code-XO 工作空间 ) 必须加载并执行, 以使 STM32F429ZIT 具有预编程且 PCROP 保护的 IP-Code 要调试 Step2-ST_Customer_level_n+1 项目, 请按照下述步骤操作 : 1. 打开位于 Step2-ST_Customer_level_n+1 目录中的项目, 选择与 STEP1 中相同的工具链 2. 重建所有文件 3. 点击 Start/Stop Debug 会话来开始调试 4. 点击 Run 来运行程序, 红色 LED 会连续闪烁 5. 按下 User 按钮来执行 IP-Code, 绿色 LED 会连续闪烁 6. 要访问 PCROP 保护的 IP-Code, 右键点击 Disassembly 窗口, 然后选择 Show Disassembly at Address, 如图 22 中所示 DocID027893 Rev 1 [English Rev 3] 33/38 37

图 22. PCROP 保护的 IP-Code 汇编代码的读取 7. 在地址栏填写 PCROP 保护扇区起始地址, 并单击 Go To 按钮, 如图 23 中所示 图 23. 填写 PCROP 保护扇区起始地址 如图 24 中所示, 载入到 Sector 2 中的 PCROP 保护 IP-Code 是不可读的, 而位于 0x08008000 地址之前的代码可以被读取 读取 PCROP 保护扇区会将 FLASH_SR 寄存器中的 RDERR 和 OPERR 标志置位 由于调试时通过 D-Code 总线进行了闪存读操作, 因此会产生一个闪存操作错误中断 然后在 HAL_FLASH_OperationErrorCallback() 函数 ( 在 main.c 文件中有描述 ) 中启动软件 Reset,Red LED4 会连续闪烁 34/38 DocID027893 Rev 1 [English Rev 3]

图 24. PCROP 保护的 IP-Code 汇编代码的读取 DocID027893 Rev 1 [English Rev 3] 35/38 37

结论 5 结论 STM32F4 系列微控制器提供了灵活有用的读和 / 或写保护功能, 可用于需要保护的应用 本应用笔记说明了如何使用 STM32F4xx MCU 提供的读 写和 PCROP 保护功能 36/38 DocID027893 Rev 1 [English Rev 3]

版本历史 6 版本历史 表 5. 文档版本历史 日期版本变更 2015 年 7 月 28 日 1 初始版本 2015 年 10 月 12 日 2016 年 11 月 29 日 2 3 增加了 STM32F469/479 产品, 因此更新了前言 更新了 Keil 分散文件和调试最终用户应用程序 增加了 STM32F410 STM32F412 和 STM32F413 产品, 因此更新了前言并增加了表 1: 参考文档 表 6. 中文文档版本历史 日期版本变更 2017 年 8 月 10 日 1 中文初始版本 DocID027893 Rev 1 [English Rev 3] 37/38 37

重要通知 - 请仔细阅读 意法半导体公司及其子公司 ( ST ) 保留随时对 ST 产品和 / 或本文档进行变更 更正 增强 修改和改进的权利, 恕不另行通知 买方在订货之前应获取关于 ST 产品的最新信息 ST 产品的销售依照订单确认时的相关 ST 销售条款 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任 ST 不对任何知识产权进行任何明示或默示的授权或许可 转售的 ST 产品如有不同于此处提供的信息的规定, 将导致 ST 针对该产品授予的任何保证失效 ST 和 ST 徽标是 ST 的商标 所有其他产品或服务名称均为其各自所有者的财产 本文档中的信息取代本文档所有早期版本中提供的信息 本文档的中文版本为英文版本的翻译件, 仅供参考之用 ; 若中文版本与英文版本有任何冲突或不一致, 则以英文版本为准 2017 STMicroelectronics - 保留所有权利 38/38 DocID027893 Rev 1 [English Rev 3]