前言:在STM32U0微控制器中,ST公司提供了一个内存保护单元(MPU),个人觉得这个一个非常重要的特性,允许开发者自行定义内存区域的访问权限,以防止不受信任的应用程序访问或修改受保护的内存区域。
对于MPU的基本配置,可以使用STM32CubeMX软件工具来完成,该开发工具可以使我们的学习变得更加轻松便捷。
一:使能STM32U0的MPU功能,如下图所示:
在CubeMX中配置MPU涉及到设置内存地址、访问权限和Cache规则,以实现对AXISRAM的高速访问。以下是配置MPU的基本步骤:
设置MPU控制模式: MPU控制模式有四种,可以通过配置MPU_CTRL寄存器来选择。例如,可以选择“Background Region Privileged access only + MPU Enable during hard fault, NMI and FAULTMASK handlers”,这意味着在硬件故障、NMI和FAULTMASK处理程序期间,只有特权软件可以访问默认内存映射。
配置MPU区域: 在MPU区域设置中,需要使能MPU区域,并设置基地址(例如0x1000)和区域大小(例如512KB)。此外,还需要配置子区域禁用、TEX域等级、访问权限、指令访问等等;
MPU软件软件代码分享:
void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct = {0};
/* Disables the MPU */
HAL_MPU_Disable();
/** Initializes and configures the Region and the memory to be protected
*/
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.BaseAddress = 0x1000;
MPU_InitStruct.Size = MPU_REGION_SIZE_512B;
MPU_InitStruct.SubRegionDisable = 0x0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Enables the MPU */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}在主函数中,直接执行之前编写好的串口输出代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
/* Insert delay 500ms */
HAL_Delay(500);
printf("Hello STM32! Hello keyboard007! Hello STM32U083RC!\r\n");
// if (HAL_RNG_GenerateRandomNumber(&hrng, &aRandom32bit) != HAL_OK)
// {
// /* Random number generation error */
// Error_Handler();
// }
// printf("aRandom32bit=%16d\r\n",aRandom32bit);
}可以看到程序运行状态:
