[AN4838] STM32 MPU (3)

MPU setting example with STM32Cube HAL on Armv6 and Armv7 architectures

아래 표는 내부 SRAM, 플래시 메모리 및 주변 장치와 같은 메모리 영역으로 MPU를 설정하는 예를 설명합니다.

기본 메모리 맵은 권한 있는 액세스에 백그라운드 영역으로 사용되며 MPU는 HardFault 핸들러 및 NMI에 대해 활성화되지 않습니다.

Internal SRAM: 8 Kbytes of internal SRAM is configured as Region0

내부 SRAM: 8KB의 내부 SRAM이 Region0으로 구성됨

Memory attributes: shareable memory, write through with no write allocate, full access permission and code execution enabled

메모리 속성: 공유 가능한 메모리, 쓰기 할당 없이 연속 쓰기, 전체 액세스 권한 및 코드 실행 활성화

Flash memory: the whole Flash memory is configured as Region.

플래시 메모리: 전체 플래시 메모리가 영역으로 구성됩니다.

Memory attributes: non-shareable memory, write through with no write allocate, full access permission and code execution enabled

메모리 속성: 공유할 수 없는 메모리, 쓰기 할당 없이 연속 쓰기, 전체 액세스 권한 및 코드 실행 활성화

Peripheral region: is configured as Region2

주변 영역: Region2로 구성됨

Memory attributes: shared device, full access permission and execute never

메모리 속성: 공유 장치, 전체 액세스 권한 및 실행 안 함

Setting the MPU with STM32Cube HAL

void MPU_RegionConfig(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct;
  /* Disable MPU */
  HAL_MPU_Disable();
  /* Configure RAM region as Region N°0, 8kB of size and R/W region */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x20000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_8KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Configure FLASH region as REGION N°1, 1MB of size and R/W region */
  MPU_InitStruct.BaseAddress = 0x08000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_1MB;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Configure FMC region as REGION N°2, 0.5GB of size, R/W region */
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512MB;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enable MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

 

Conclusion

STM32 마이크로컨트롤러에서 MPU를 사용하면 애플리케이션 작업이 다른 작업에서 사용하는 스택 및 데이터 메모리에 액세스하거나 손상되는 것을 방지하여 견고하고 안정적이며 경우에 따라 더 안전합니다.

이 애플리케이션 노트는 다양한 메모리 속성, 유형 및 MPU 레지스터에 대해 설명합니다. 또한 STM32 MCU에서 MPU를 구성하는 방법을 설명하기 위해 STM32Cube HAL로 MPU를 설정하는 예를 제공합니다.

MPU 레지스터에 대한 자세한 내용은 Cortex 코어 프로그래밍 매뉴얼을 참조하십시오.