
直接关闭icache功能,貌似有点简单粗暴了。我们还可以使用MPU的功能来做相关配置,从而使得当读取上述区域时,不再需要手动关闭了。办法也在上面图片中的标注上有所说明了——借助 MPU 来改变局部区域的缓存策略。
/**
* @brief Configures the main MPU regions.
* @param None
* @retval None
*/
void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
MPU_Attributes_InitTypeDef MPU_AttributesInit;
/* Disable MPU */
HAL_MPU_Disable();
LAT1622
LAT1622 - Rev 1.0 page 4/6
/* Define cacheable memory via MPU */
MPU_AttributesInit.Number = 0;
MPU_AttributesInit.Attributes = MPU_NOT_CACHEABLE;
HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
/* Configure UID region as Region Number 0 */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x08FFF800;
MPU_InitStruct.LimitAddress = 0x08FFFFFF;
MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Enable MPU (any access not covered by any enabled region will cause a fault) */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}在进行上述配置之后,程序在代码访问 UID 之前,系统将先用 MPU将UID所在地址区域的缓存属性关闭,这样也就不会导致进入到hardfault_handler里面了。
我要赚赏金
