本帖最后由 sky.sun.zz 于 2017-3-15 15:12 编辑
[STM32F7] NUCLEO-F722ZE评测(7)PCROP测试
STM32F722的一个亮点是具有PCROP功能(Proprietary code readout protection ),这是是一个专有代码读出保护的功能。当使用 PCROP时,用户扇区(0--23)Flash 能够阻止D-Bus的读取指令;保护功能选择通过FLASH_OPTCR寄存器的SPRMOD选择位进行选择:与RDP 对整片Flash读保护不同的是,它只是针对Flash 的某些特定区域进行代码的读写保护。它可以被用来保护一些IP代码,方便进行二次开发。
受PCROP 保护的区域是无法使用D-Code 总线进行读访问的,所以在这片区域中只允许执行代码(通过I-Code 总线取指令),数据读取是被禁止的。因此,受保护的IP代码不能访问存储于同一块区域内的关联数据,比如文字池(literal pools)、分支表(branch tables)以及在执行过程中需要通过D-code总线进行读取的常量数据。所以受PCROP 保护的代码只能是只执行的指令代码,并不包含任何数据。因此,我们在编译受PCROP保护的IP 代码时,必须对其进行配置,以避免生成文字池。
本次评测参考ST官方的《STM32F4xxPCROP应用》一文, 练习了跑马灯例程在STM32F722ZE上运行PCROP的过程。
1、在IAR7.80.4环境下配置PB0、PB7、PB14为输出,驱动3只LED,跑马灯循环中熄灭3只LED的代码写成一个独立函数Light_Clear(),单独存放在名为Sector_Test.c文件中。这个Light_Clear()函数编译时制定存储位置在PCROP保护区,地址在0x08008000,供主函数调用。
//Sector_Test.c
#include "stm32f7xx_hal.h"
#pragma location = ".CODE_Flash"
void Light_Clear(void)
{
GPIOB->ODR &=~0X4081;
}
//--------------------------------------------------------------------------------
//main.c
#include "main.h"
#include "stm32f7xx_hal.h"
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
extern void Light_Clear(void);
int main(void)
{
uint32_t i;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
Light_Clear();
i=0X2FFFFF;
while(i--);
GPIOB->ODR |=0X4000;
i=0X2FFFFF;
while(i--);
Light_Clear();
i=0X2FFFFF;
while(i--);
GPIOB->ODR |=0X0080;
i=0X2FFFFF;
while(i--);
Light_Clear();
i=0X2FFFFF;
while(i--);
GPIOB->ODR |=0X0001;
i=0X2FFFFF;
while(i--);
}
2、在Options->C++/C Compiler-Code里打勾“No datareads in code memory"
3、参照《STM32F4xxPCROP应用》修改Startup_stm32f722zx.s
4、修改stm32f722xxflash.icf
5、先编译下载,试运行,跑马灯可以跑了。
在反汇编栏里可以读到Light_Clear()函数的反汇编代码和地址,
打开STM32 ST-Link Utility 4.0,在Targwe memory栏的相同地址处同样可以看到到这段代码。
到此为止,我们已经把要保护的代码正确加载到预期的存储区域0x08008000-ox08008014。
6、点击Target->Option Bytes
在Flash protrction mode栏里选择Read/Wrint protrtion,把地址0x08008000的Sector 2选项打勾,点击Apply。
此时,回到Targwe memory栏,我们已经可以看到这里的数据都看不见了。
退出TM32 ST-Link Utility 4.0,按一下Reset按键,跑马灯又开始运行了。我们的PCROP成功完成配置。跑马灯的视频太平常了,就不上传了。
|