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 코어 프로그래밍 매뉴얼을 참조하십시오.
'▶ ARM Core' 카테고리의 다른 글
IRQ Handler table을 RAM에 올리기 (0) | 2023.11.17 |
---|---|
[AN5557] STM32H7 dual-core architecture - Peripherals allocation (0) | 2023.11.17 |
[AN4838] STM32 MPU (2) (0) | 2023.11.17 |
[AN4838] STM32 MPU (1) (0) | 2023.11.17 |
Cortex-M7 Memory Model(feat. MPU) (0) | 2023.11.17 |