FLASH_BBAttributesTypeDef FLASH_BBAttributesStruct; FLASH_BBAttributesStruct.BBAttributesType = FLASH_BB_SEC; FLASH_BBAttributesStruct.BBAttributes_array[3] = 0xFF000000; FLASH_BBAttributesStruct.Bank = FLASH_BANK_1; if(HAL_FLASHEx_ConfigBBAttributes(&FLASH_BBAttributesStruct) != HAL_OK) { Error_Handler(); } 特别要注意的是,SecBB的配置需要在安全侧完成,下图是SecBB寄存器的访问规则,并且SecBB的范围不能和Flash Watermark有重叠。 ▲ 图6. SecBB寄存器的访问条件2.3. 其他注意事项 1. 如果程序中开启了ICACHE,还需要为EDATA区域设置MPU的保护。以下是设置MPU的示例代码:复制void MPU_Config(void){ MPU_Attributes_InitTypeDef attr; MPU_Region_InitTypeDef region; /* Disable MPU before perloading and config update */HAL_MPU_Disable(); /* Define cacheable memory via MPU */ attr.Number = MPU_ATTRIBUTES_NUMBER0; attr.Attributes = 0 ; HAL_MPU_ConfigMemoryAttributes(&attr); /* BaseAddress-LimitAddress configuration */ region.Enable = MPU_REGION_ENABLE; region.Number = MPU_REGION_NUMBER0; region.AttributesIndex = MPU_ATTRIBUTES_NUMBER0; region.BaseAddress = EDATA_USER_START_ADDR;region.LimitAddress = EDATA_USER_END_ADDR;region.AccessPermission = MPU_REGION_ALL_RW;region.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; region.IsShareable = MPU_ACCESS_NOT_SHAREABLE;HAL_MPU_ConfigRegion(®ion); /* Enable the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);}2. 编译顺序:TrustZone架构中,需要先编译S工程,然后再编译NS工程;但下载不区分先后顺序。2.4. 选项字节的配置 除了代码有安全的配置外,对于TrustZone架构中,芯片的选项字节同样也要有对应的配置。1. 使能TrustZone ▲ 图7. 使能TrustZone2. 配置Flash Watermark ▲ 图8. 配置Flash Watermark3. 配置EDATA ▲ 图9. 配置EDATA在完成上述配置之后,我们便可以将S和NS的程序分别下载到芯片中,然后按下开发板的复位按钮。03验证 在代码中,我们分别向两个EDATA区域写入了0xAA55AA55的值,所以现在我们可以通过STM32CubeProgrammer来验证EDATA区域写入的结果。注意要使用“under reset”的模式连接芯片查看。 ▲ 图10. NS侧EDATA数据 ▲ 图11. S侧EDATA数据04小结 本文实验附有完整的实验工程供大家直接使用。在TrustZone结构中,代码通常会多出一些安全的属性设置,本文仅针对常见场景设置,在实际操作中还可能涉及到privileged/unprivileged等访问规则以及DMA的配置,大家根据应用灵活配置即可,希望对大家有所帮助。
void MPU_Config(void){ MPU_Attributes_InitTypeDef attr; MPU_Region_InitTypeDef region; /* Disable MPU before perloading and config update */HAL_MPU_Disable(); /* Define cacheable memory via MPU */ attr.Number = MPU_ATTRIBUTES_NUMBER0; attr.Attributes = 0 ; HAL_MPU_ConfigMemoryAttributes(&attr); /* BaseAddress-LimitAddress configuration */ region.Enable = MPU_REGION_ENABLE; region.Number = MPU_REGION_NUMBER0; region.AttributesIndex = MPU_ATTRIBUTES_NUMBER0; region.BaseAddress = EDATA_USER_START_ADDR;region.LimitAddress = EDATA_USER_END_ADDR;region.AccessPermission = MPU_REGION_ALL_RW;region.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; region.IsShareable = MPU_ACCESS_NOT_SHAREABLE;HAL_MPU_ConfigRegion(®ion); /* Enable the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);}2. 编译顺序:TrustZone架构中,需要先编译S工程,然后再编译NS工程;但下载不区分先后顺序。2.4. 选项字节的配置 除了代码有安全的配置外,对于TrustZone架构中,芯片的选项字节同样也要有对应的配置。1. 使能TrustZone ▲ 图7. 使能TrustZone2. 配置Flash Watermark ▲ 图8. 配置Flash Watermark3. 配置EDATA ▲ 图9. 配置EDATA在完成上述配置之后,我们便可以将S和NS的程序分别下载到芯片中,然后按下开发板的复位按钮。03验证 在代码中,我们分别向两个EDATA区域写入了0xAA55AA55的值,所以现在我们可以通过STM32CubeProgrammer来验证EDATA区域写入的结果。注意要使用“under reset”的模式连接芯片查看。 ▲ 图10. NS侧EDATA数据 ▲ 图11. S侧EDATA数据04小结 本文实验附有完整的实验工程供大家直接使用。在TrustZone结构中,代码通常会多出一些安全的属性设置,本文仅针对常见场景设置,在实际操作中还可能涉及到privileged/unprivileged等访问规则以及DMA的配置,大家根据应用灵活配置即可,希望对大家有所帮助。
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
1612
2110
25
本站内容禁止未经授权用于AI模型训练。如需商业数据合作,请联系我们。
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号