本帖最后由 sky.sun.zz 于 2017-5-21 13:52 编辑
STM32F723E-Discovery 评测 (3) PCROP
STM32F723具有专有代码读出保护的功能PCROP(Proprietary code readout protection ),当使用 PCROP时,用户扇区(0--23)Flash 能够阻止D-Bus的读取指令;保护功能选择通过FLASH_OPTCR寄存器的SPRMOD选择位进行选择:它是针对Flash 的某些特定区域进行代码的读写保护。它可以被用来保护一些IP代码,方便进行二次开发。
受PCROP保护的区域无法使用D-Code 总线进行读访问的,在这片区域中只允许执行代码(通过I-Code 总线取指令),数据读取被禁止了。因此,受保护的IP代码不能访问存储于同一块区域内的关联数据,比如文字池(literal pools)、分支表(branch tables)以及在执行过程需要通过D-code总线进行读取的常量数据。所以受PCROP 保护的代码只能是只执行的指令代码,不包含任何数据。因此,我们在编译受PCROP保护的IP 代码时,必须对其进行配置,以避免生成文字池。
本评测参考ST官方的《STM32F4xxPCROP功能使用说明》一文, 使用IAR7.80.4在STM32F723IE 运行跑马灯并进行PCROP的过程。
STM32F4xx PCROP应用.rar
(229.17 KB)
参阅STM32F723I Discovery官方用户手册可知:PA7、PB1分别驱动LD5、LD6。
编写一个简单函数控制2只LED闪烁,并建立LD5的熄灭函数在Sector_Test.c中,我们要把这段不含变量的代码载入0X08008000供主函数调用。然后对这段代码进行读保护。
在Options->C++/C Compiler-Code里打勾“No datareads in code memory"
参照《STM32F4xxPCROP应用》修改startup_stm32f723xx.s
参照《STM32F4xxPCROP应用》修改stm32f723xx_flash.icf
编译运行,LD5、LD6交替闪烁。
在反汇编栏里可以读到Clear_a()函数的反汇编代码和地址
从STM32 ST-Link Utility 4.0的在Targwe memory栏里我们可以看到到这段代码的二进制值。
代码已正确加载到预期的存储区域0x08008000-ox0800800C。
点击Target->Option Bytes
在Flash protrction mode栏里选择Read/Wrint protrtion
把地址0x08008000的Sector 2选项打勾把PCROP_RDP选项打勾点击Apply。
回到Targwe memory栏,我们已经可以看到0x08007FFF地址以后的内容都看不见了。
复位开发板,LD5、LD6交替闪烁,而欲保护的代码已经被保护。
警告:切勿将保护级别设定到Level2级,此举为不可逆操作,将使板子FLASH永久失去再写入功能!
|