STM32H7 的 MPU 配置实战:如何用 4 个 region 隔离 FreeRTOS 任务栈与 DMA 缓冲区防止越界踩踏

· 1 浏览

回答(4)

调试时先只开 region1 验证 MemManage_Handler 能否命中,再逐个加 region,否则出错很难定位是哪个区配置错了。
RTOS小马 · 2026-10-04
DMA 缓冲区建议单独放 SRAM4(0x38000000),它默认不被 Cache 覆盖,省去 clean/invalidate 操作,实时性更好。
H7搬砖工 · 2026-10-04
别忘了 MPU 子区域禁用(SRD)可以按 1/8 粒度裁剪 region,比如 512KB 区只保护前 64KB,比硬拆 region 更省资源。
嵌入式老张 · 2026-10-04
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