/* -------------------------------------------------------------------------- */
/* CM7 MPU config */
/* -------------------------------------------------------------------------- */
#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;
#else
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();
/* Region 0: deny all (speculative prefetch workaround) */
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);
/* Region 1: Device, non-shareable, non-cacheable */
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);
/* Region 2: Device, non-shareable, non-cacheable */
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);
/* Region 3: Device, non-shareable, non-cacheable */
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);
/* Region 4: Normal, 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);
/* Region 5: Normal, 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);
/* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */
/* Region 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);
/* Region 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);
/* Region 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
/* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */
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
/* Region 12: overlay first 8MB as cacheable (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);
#else
/* Region 12: overlay first 8MB as cacheable (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)
/* Region 8: XIP external flash, RO, cacheable WB, cover full 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
/* Peripheral windows */
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 config */
/* -------------------------------------------------------------------------- */
#if __CORTEX_M == 4
void BOARD_ConfigMPU(void)
{
/* ---- Disable code bus cache (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;
}
/* ---- Disable system bus cache (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();
/* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Device/non-cache.
* Keep the original attributes here: UART/SPI/SD DMA buffers live in this
* window and require the proven non-cache behavior with CM4 LMEM. */
MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0,
1, /* shareable recommended */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_128KB);
/* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */
MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal */
0, /* not shareable */
1, /* cacheable */
1, /* bufferable (WB) */
0,
ARM_MPU_REGION_SIZE_128KB);
/* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> original non-cache attrs */
MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0,
1, /* shareable */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_512KB);
/* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */
MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0,
1, /* shareable */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_256KB);
#if USE_SDRAM
/* Linker split:
* m_sdram_c = 0x80000000..0x807FFFFF (8MB)
* m_sdram_nc = 0x80800000..0x83FFFFFF (56MB)
*
* The MPU cannot describe 56MB directly, so region 4 makes the full 64MB
* SDRAM window Device/non-cache and region 5 overlays the first 8MB as
* cacheable. Higher-numbered MPU regions take precedence. */
(void)SDRAM_NC_BASE;
(void)SDRAM_NC_SIZE;
/* Region 4: full SDRAM default, 0x80000000..0x83FFFFFF -> Device/non-cache */
MPU->RBAR = ARM_MPU_RBAR(4, SDRAM_BASE_EXPECTED);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
2, /* Device */
0, /* not shareable */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_64MB);
#if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH
/* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-through */
MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal */
0, /* not shareable */
1, /* cacheable */
0, /* write-through */
0,
ARM_MPU_REGION_SIZE_8MB);
#else
/* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-back */
MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal */
0, /* not shareable */
1, /* cacheable */
1, /* write-back */
0,
ARM_MPU_REGION_SIZE_8MB);
#endif
#endif /* USE_SDRAM */
ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
/* Invalidate and enable system bus cache (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;
/* Invalidate and enable code bus cache (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 */
I also tried this with similar results but got missmatching checksums when writing from non cacheable ocram to non cacheable sdram using 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;
#else
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();
/* Region 0: deny all (speculative prefetch workaround) */
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);
/* Region 1: Device, non-shareable, non-cacheable */
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);
/* Region 2: Device, non-shareable, non-cacheable */
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);
/* Region 3: Device, non-shareable, non-cacheable */
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);
/* Region 4: Normal, 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);
/* Region 5: Normal, 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);
/* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */
/* Region 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);
/* Region 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);
/* Region 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
/* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */
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
/* Region 12: overlay first 8MB as cacheable (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);
#else
/* Region 12: overlay first 8MB as cacheable (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)
/* Region 8: XIP external flash, RO, cacheable WB, cover full 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
/* Peripheral windows */
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 config */
/* -------------------------------------------------------------------------- */
#if __CORTEX_M == 4
void BOARD_ConfigMPU(void)
{
/* ---- Disable code bus cache (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;
}
/* ---- Disable system bus cache (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();
/* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Normal non-cacheable */
MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal */
1, /* shareable recommended */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_128KB);
/* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */
MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal */
0, /* not shareable */
1, /* cacheable */
1, /* bufferable (WB) */
0,
ARM_MPU_REGION_SIZE_128KB);
/* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> Normal (shareable) */
MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal */
1, /* shareable */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_512KB);
/* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> Normal (shareable) */
MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U);
MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
0, /* Normal*/
1, /* shareable */
0, /* non-cacheable */
0,
0,
ARM_MPU_REGION_SIZE_256KB);
ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
/* Invalidate and enable system bus cache (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;
/* Invalidate and enable code bus cache (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 */