STM32H7 的 MPU 有 16 个 region,每个最小 32 字节且必须按 size 对齐。实战建议:region0 配 0x00000000 起 4GB 背景区,Normal、Non-shareable、无缓存,作为兜底;region1 给 DTCM(0x20000000,128KB),Normal、Write-Back、Non-shareable,放 FreeRTOS 任务栈和内核对象,禁止 DMA 访问;region2 给 AXI SRAM(0x24000000,512KB),Normal、Write-Back、Shareable,放普通任务堆;region3 给 DMA 缓冲区(如 0x30000000 SRAM1/2/3 或 0x24040000 段),Normal、Non-cacheable 或 Write-Through,并设为 Shareable,避免 Cache 一致性问题。关键点:任务栈区设为只读+特权可写,DMA 区设为特权只读写、非特权不可访问,这样越界写会立即触发 MemManage Fault。注意 region 优先级:编号小的优先,重叠时高优先级覆盖低优先级;配置前先 __DMB(),改完再 __DSB()+__ISB()。FreeRTOS 中可用 configTASK_RETURN_ADDRESS 和 vApplicationStackOverflowHook 配合 MPU 做双重保护。
mcuku 阿沐 · 2026-10-04