/* -------------------------------------------------------------------------- */
/* CM7 MPU 設定 */
/* -------------------------------------------------------------------------- */
#if __CORTEX_M == 7
void BOARD_ConfigMPU ( void )
{
#if defined ( __ICCARM__ ) || defined ( __GNUC__ )
extern uint32_t __NCACHE_REGION_START [] ;
extern uint32_t __NCACHE_REGION_SIZE [] ;
uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START;
uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE;
#それ以外
uint32_t nonCacheStart = OCRAM_BASE_EXPECTED;
uint32_t size = OCRAM_SIZE_EXPECTED;
#endif
( void )nonCacheStart;
( void )size;
#if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT
if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR ))
{
SCB_DisableICache ();
}
#endif
#if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT
if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR ))
{
SCB_DisableDCache ();
}
#endif
ARM_MPU_Disable ();
/* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */
MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U );
MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB);
/* リージョン 1: デバイス、共有不可、キャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB);
/* リージョン 2: デバイス、共有不可、キャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB);
/* リージョン 3: デバイス、共有不可、キャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB);
/* リージョン 4: ノーマル、WB */
MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB);
/* リージョン 5: ノーマル、WB */
MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB);
/* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */
/* 領域 6: 0x20240000..0x2027FFFF (256KB) */
MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB);
/* 領域 7: 0x20280000..0x202FFFFF (512KB) */
MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB);
/* 領域 10: 0x20300000..0x2033FFFF (256KB) */
MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB);
#if USE_SDRAM
/* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */
MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB);
#if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH
/* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */
MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB);
#それ以外
/* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */
MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB);
#endif
#endif /* USE_SDRAM */
#if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 )
/* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */
MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB);
#endif
/* ペリフェラル ウィンドウ */
MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB);
MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB);
MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB);
ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
#if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT
SCB_EnableDCache ();
#endif
#if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT
SCB_EnableICache ();
#endif
}
#endif /* __CORTEX_M == 7 */
/* -------------------------------------------------------------------------- */
/* CM4 MPU 設定 */
/* -------------------------------------------------------------------------- */
#if __CORTEX_M == 4
void BOARD_ConfigMPU ( void )
{
/* ---- コードバスキャッシュ (LMEM) を無効にする ---- */
if ( LMEM_PCCCR_ENCACHE_MASK == ( LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR ))
{
LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK ;
while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {}
LMEM -> PCCCR &= ~ ( LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK );
LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK ;
}
/* ---- システムバスキャッシュ (LMEM) を無効にする ---- */
if ( LMEM_PSCCR_ENCACHE_MASK == ( LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR ))
{
LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK ;
while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {}
LMEM -> PSCCR &= ~ ( LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK );
LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK ;
}
ARM_MPU_Disable ();
/* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> デバイス/非キャッシュ。
* 元の属性はここに保持します: UART/SPI/SD DMA バッファはここに存在します
* ウィンドウがあり、CM4 LMEM で実証済みの非キャッシュ動作が必要です。*/
MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL ,
0 、
1 、 /*共有推奨*/
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_128KB );
/* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */
MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL ,
0 、 /* 通常 */
0 、 /* 共有不可 */
1 、 /* キャッシュ可能 */
1 、 /* バッファリング可能 (WB) */
0 、
ARM_MPU_REGION_SIZE_128KB );
/* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 元の非キャッシュ属性 */
MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL ,
0 、
1 、 /* 共有可能 */
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_512KB );
/* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 元の非キャッシュ属性 */
MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL ,
0 、
1 、 /* 共有可能 */
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_256KB );
#if USE_SDRAM
/* リンカー分割:
* m_sdram_c = 0x80000000..0x807FFFFF (8MB)
* m_sdram_nc = 0x80800000..0x83FFFFFF (56MB)
*
* MPUは56MBを直接表現できないため、領域4で64MB全体を構成する。
* SDRAM ウィンドウ デバイス/非キャッシュおよび領域 5 は最初の 8MB をオーバーレイします
* キャッシュ可能。番号の大きいMPU領域が優先されます。*/
( void ) SDRAM_NC_BASE ;
( void ) SDRAM_NC_SIZE ;
/* 領域 4: フル SDRAM デフォルト、0x80000000..0x83FFFFFF -> デバイス/非キャッシュ */
MPU -> RBAR = ARM_MPU_RBAR ( 4 , SDRAM_BASE_EXPECTED );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL ,
2 、 /* デバイス */
0 、 /* 共有不可 */
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_64MB );
#if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH
/* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトスルー */
MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE);
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL,
0 、 /* 通常 */
0 、 /* 共有不可 */
1 、 /* キャッシュ可能 */
0 、 /* ライトスルー */
0 、
ARM_MPU_REGION_SIZE_8MB);
#それ以外
/* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトバック */
MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL ,
0 、 /* 通常 */
0 、 /* 共有不可 */
1 、 /* キャッシュ可能 */
1 、 /* ライトバック */
0 、
ARM_MPU_REGION_SIZE_8MB );
#endif
#endif /* USE_SDRAM */
ARM_MPU_Enable ( MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk );
/* システムバスキャッシュ (PSCCR) を無効化および有効化します */
LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK ;
while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {}
LMEM -> PSCCR &= ~ ( LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK );
LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK ;
/* コードバスキャッシュ(PCCCR)を無効化および有効化する */
LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK ;
while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {}
LMEM -> PCCCR &= ~ ( LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK );
LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK ;
}
#endif /* __CORTEX_M == 4 */
私も同様の結果で試してみましたが、キャッシュ不可能なOCRAMからキャッシュ不可能なSDRAMへDMAを使用して書き込む際に、チェックサムの不一致が発生しました。
#if __CORTEX_M == 7
void BOARD_ConfigMPU ( void )
{
#if defined ( __ICCARM__ ) || defined ( __GNUC__ )
extern uint32_t __NCACHE_REGION_START [] ;
extern uint32_t __NCACHE_REGION_SIZE [] ;
uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START;
uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE;
#それ以外
uint32_t nonCacheStart = OCRAM_BASE_EXPECTED;
uint32_t size = OCRAM_SIZE_EXPECTED;
#endif
( void )nonCacheStart;
( void )size;
#if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT
if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR ))
{
SCB_DisableICache ();
}
#endif
#if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT
if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR ))
{
SCB_DisableDCache ();
}
#endif
ARM_MPU_Disable ();
/* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */
MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U );
MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB);
/* リージョン 1: デバイス、共有不可、キャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB);
/* リージョン 2: デバイス、共有不可、キャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB);
/* リージョン 3: デバイス、共有不可、キャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB);
/* リージョン 4: ノーマル、WB */
MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB);
/* リージョン 5: ノーマル、WB */
MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB);
/* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */
/* 領域 6: 0x20240000..0x2027FFFF (256KB) */
MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB);
/* 領域 7: 0x20280000..0x202FFFFF (512KB) */
MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB);
/* 領域 10: 0x20300000..0x2033FFFF (256KB) */
MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB);
#if USE_SDRAM
/* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */
MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB);
#if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH
/* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */
MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB);
#それ以外
/* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */
MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB);
#endif
#endif /* USE_SDRAM */
#if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 )
/* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */
MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB);
#endif
/* ペリフェラル ウィンドウ */
MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB);
MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB);
MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB);
ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
#if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT
SCB_EnableDCache ();
#endif
#if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT
SCB_EnableICache ();
#endif
}
#endif /* __CORTEX_M == 7 */
/* -------------------------------------------------------------------------- */
/* CM4 MPU 設定 */
/* -------------------------------------------------------------------------- */
#if __CORTEX_M == 4
void BOARD_ConfigMPU ( void )
{
/* ---- コードバスキャッシュ (LMEM) を無効にする ---- */
if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR ))
{
LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK;
while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {}
LMEM -> PCCCR &= ~ (LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK);
LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK;
}
/* ---- システムバスキャッシュ (LMEM) を無効にする ---- */
if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR ))
{
LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK;
while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {}
LMEM -> PSCCR &= ~ (LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK);
LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK;
}
ARM_MPU_Disable ();
/* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 通常のキャッシュ不可 */
MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE);
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL,
0 、 /* 通常 */
1 、 /*共有推奨*/
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_128KB);
/* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */
MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE);
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL,
0 、 /* 通常 */
0 、 /* 共有不可 */
1 、 /* キャッシュ可能 */
1 、 /* バッファリング可能 (WB) */
0 、
ARM_MPU_REGION_SIZE_128KB);
/* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 通常 (共有可能) */
MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL,
0 、 /* 通常 */
1 、 /* 共有可能 */
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_512KB);
/* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 通常 (共有可能) */
MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U );
MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL,
0 、 /* 通常 */
1 、 /* 共有可能 */
0 、 /* キャッシュ不可 */
0 、
0 、
ARM_MPU_REGION_SIZE_256KB);
ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
/* システムバスキャッシュ (PSCCR) を無効化および有効化します */
LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK;
while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {}
LMEM -> PSCCR &= ~ (LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK);
LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK;
/* コードバスキャッシュ(PCCCR)を無効化および有効化する */
LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK;
while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {}
LMEM -> PCCCR &= ~ (LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);
LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK;
}
#endif /* __CORTEX_M == 4 */