前言:在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); }
可以看到程序运行状态: