例としてSTM32H735マイコンにOCTOSPIフラッシュメモリを接続して使う場合を示します。
図2に示す通り、STM32H735マイコンは、0x90000000〜0x9FFFFFFFをOCTOSPI1メモリ領域として使用可能です。STM32H735マイコンに接続しているOCTOSPIフラッシュメモリの最大サイズを16MBとします。
図3に示すように、STM32H735マイコンのOCTOSPI1領域はメモリタイプが「Normal」であるため、OCTOSPIフラッシュメモリの終端付近をアクセスしている時に、その付近の領域に対してCortex-Mコアが投機的アクセスを実行する可能性があります。
図4のようにメモリサイズ外のOCTOSPIメモリ領域に投機的アクセスがかかるとトラブルが発生します。
このトラブルを回避するには、図5が示す下記のMPU設定が有効です。
(1)OCTOSPIメモリ領域全域(256MB)を対象にしたMPUリージョンを作成し、アクセス不可、キャッシュ非対象、バッファー非対象に設定
(2)OCTOSPIフラッシュメモリ領域(16MB)を対象にしたMPUリージョンを作成し、アクセス可、キャッシュ対象、バッファー非対象に設定
MPU_Region_InitTypeDef MPU_InitStruct = {0};
HAL_MPU_Disable();
// MPU region (k)
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.BaseAddress = 0x90000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;
MPU_InitStruct.SubRegionDisable = 0x0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
// MPU region (k+1)
MPU_InitStruct.Number = MPU_REGION_NUMBER1;
MPU_InitStruct.Size = MPU_REGION_SIZE_16MB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
HAL_MPU_Enable(MPU_HFNMI_PRIVDEF);
Copyright © ITmedia, Inc. All Rights Reserved.