@@ -341,6 +341,9 @@ struct MPUDomain {
341341
342342 static void configure_dynamic_region (uintptr_t start, uintptr_t end, uint8_t region_num) {
343343 if (end <= start) return ;
344+ // Dx NC (Normal, Non-Cacheable)
345+ // TEX=1, C=0, B=0: Normal, Non-Cacheable
346+ // Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
344347 configure_region (start, end - start, region_num,
345348 MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_DISABLE ,
346349 MPU_ACCESS_SHAREABLE , MPU_ACCESS_NOT_CACHEABLE , MPU_ACCESS_NOT_BUFFERABLE );
@@ -371,39 +374,46 @@ struct MPUDomain {
371374 MPU_ACCESS_SHAREABLE , MPU_ACCESS_NOT_CACHEABLE , MPU_ACCESS_BUFFERABLE );
372375
373376 // Flash (Normal, Cacheable)
374- // TEX=1 , C=1, B=0: Normal, Write-Through (Read optimized)
377+ // TEX=0 , C=1, B=0: Normal, Write-Through, No Read-Allocate (Read optimized)
375378 // Not Shareable to allow full caching
376379 configure_region (reinterpret_cast <uintptr_t >(&__flash_base), reinterpret_cast <size_t >(&__flash_size), MPU_REGION_NUMBER1 ,
377- MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_ENABLE ,
380+ MPU_TEX_LEVEL0 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_ENABLE ,
378381 MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_NOT_BUFFERABLE );
379382
380383 // DTCM (Normal, Cacheable)
381- // Uses Normal memory attributes. TCM access is uncached by hardware, but "Normal" allows unaligned access.
384+ // TEX=1, C=1, B=1: Normal, Write-Back, Write and Read Allocate
385+ // TCMs are like Cache, so they are not really cacheable, and the MPU settings are ignored
382386 configure_region (reinterpret_cast <uintptr_t >(&__dtcm_base), reinterpret_cast <size_t >(&__dtcm_size), MPU_REGION_NUMBER10 ,
383387 MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_DISABLE ,
384388 MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
385389
386390 // ITCM (Normal, Cacheable)
391+ // TEX=0, C=1, B=0: Normal, Write-Through, No Read-Allocate (Read optimized)
392+ // TCMs are like Cache, so they are not really cacheable, and the MPU settings are ignored
387393 configure_region (reinterpret_cast <uintptr_t >(&__itcm_base), reinterpret_cast <size_t >(&__itcm_size), MPU_REGION_NUMBER11 ,
388- MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_ENABLE ,
389- MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
394+ MPU_TEX_LEVEL0 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_ENABLE ,
395+ MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_NOT_BUFFERABLE );
390396
391397 // D1 RAM Cached (Normal, WBWA)
392398 // TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
393- // Not Shareable ensures strict L1 utilization.
399+ // Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
394400 configure_region (reinterpret_cast <uintptr_t >(&__ram_d1_base), reinterpret_cast <size_t >(&__ram_d1_size), MPU_REGION_NUMBER2 ,
395401 MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_DISABLE ,
396- MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
402+ MPU_ACCESS_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
397403
398404 // D2 RAM Cached (Normal, WBWA)
405+ // TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
406+ // Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
399407 configure_region (reinterpret_cast <uintptr_t >(&__ram_d2_base), reinterpret_cast <size_t >(&__ram_d2_size), MPU_REGION_NUMBER4 ,
400408 MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_DISABLE ,
401- MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
409+ MPU_ACCESS_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
402410
403411 // D3 RAM Cached (Normal, WBWA)
412+ // TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
413+ // Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
404414 configure_region (reinterpret_cast <uintptr_t >(&__ram_d3_base), reinterpret_cast <size_t >(&__ram_d3_size), MPU_REGION_NUMBER6 ,
405415 MPU_TEX_LEVEL1 , MPU_REGION_FULL_ACCESS , MPU_INSTRUCTION_ACCESS_DISABLE ,
406- MPU_ACCESS_NOT_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
416+ MPU_ACCESS_SHAREABLE , MPU_ACCESS_CACHEABLE , MPU_ACCESS_BUFFERABLE );
407417 }
408418
409419 static void configure_region (uintptr_t base, size_t size, uint8_t region_num,
0 commit comments