LAT1023
Local Application Tips
LAT1023 Rev 1.0 Oct. 2021
STM32H750 上使用 PCROP 后导致 Hard Fault
关键字:PCROPHard Fault,
STM32H750
1. 引言
PCROP 全称为 Proprietary code read out protection(专用代码保护),它提供了一种新的代码
保护机制,在 PCROP 区域的内容只能为可执行,不能读取或写入。这种机制可以为 OEM 厂商
提供保护,方便保护自 IP 的代码。本文主要记录在使用 PCROP 上遇到的 Hardfault 问题。
如何使用 PCROP ?
参考 AN4968 PCROP 的描述,PCROP 的使用大致有以下几个步骤:
1. 将需要保护的文件,在 IDE 中标识为仅可执行,IAR KEILCubeIDE 都有此类标识。
2. 需要修改 Link 文件,将受保护文件中的 rw data ro data ro code 进行分区存放。
3. 通过修改选项字,将受保护文件中 ro code 中的内容进行 PCROP 保护。
4. 编译工程产生保护文件.o 文件,并把符号导出给实际应用工程使用。
2. 问题描述
在我使用 IAR 进行 PCROP 的测试时,发生了如下错误。
1. IAR 中的 Hard Fault 提示窗口
3. 问题分析与定位
PCROP 调试时,会遇到一个问题,那就是由于代码已经被保护起来,无法单步调试。目前知道
的只是当 PCROP 打开的时候会导致 Hard Fault,而不使用 PCROP 没有问题。那么这个问题和
PCROP 强相关了。
接下来,只能通过一些简单的测试来定位发生问题的大概位置了,比如在函数入口添加一些简单
的汇编代码,比如 IAR 中可以添加代码往寄存器 R5 中写入特殊测试值:__ASM(" MOVS R5,
LAT1023
LAT1023 - Rev 1.0 page 2/11
#11"),通过这个简单的测试,发现函数并没有执行到这里来。所以大概在跳转之后,执行这一
句代码之前就已经发生了问题。
Hard Fault 的错误描述为INVSTATE,无效状态代表的是试图切换到 ARM 状态,查看文档后
有以下信息:
2. UFSR 寄存器描述
PCROP 取消掉以后,查看汇编代码如下图 3
3. 编窗口
0x9003 开头的是外部 flash 地址,首先会跳转到 0x9003’6fd8 去执行,如下图 4
4. 汇编窗口