| 
 
| 本帖最后由 STM新闻官 于 2025-10-29 22:49 编辑 
 1. 前言
 在使用 STM32H7 系列进行开发产品时,客户经常忽略对 MPU 进行配置,一般出现问题来找原因时往往感到无从下手。对于 STM32H7 原因最多的是没有对 MPU 进行合理配置,这个问题很容易被忽略,因为当我们应用比较简单时,往往不容易出现错误。但是,当我们的应用较为复杂时,如有外扩存储器、GUI、ETH、USB 等出错概率就高了。笔者,最近就遇到一个案例,客户反馈不运行 LWIP 时程序正常,但是运行 LWIP 系统经常死机,不知道什么原因。
 笔者以点代面,以运行 LWIP 为例说明怎样使用 STM32CubeMX 对 STM32H7 特定存储区间进行配置,并对 STM32CubeMX MPU 相关参数进行了解释说明。
 
 2. 问题调研
 首先我们使用 STM32CubeMX 创建一个基于 STM32H723ZG 的工程,MPU 默认配置如下:
 
 
   
 因此,在使用 STM32CubeMX创建工程时,默认就对 MPU 进行了初步配置,关于H7为什么要对 MPU 进行配置,其配置原理及 MPU 的更详细理解,有兴趣的读者可参考 LAT1240和 LAT1448,笔者不再做详细解释,其配置含义如下图所示:
 
 
   
 3.  问题分析与解决办法
 通过上一章节里可以看到在使用 STM32CubeMX 创建工程时,已经对 MPU 进行了一个默认的基础配置,这就是为什么对于一般应用,我们即使不对 MPU 进行配置也能跑起来的原因。但是,为什么我们运行 LWIP 如果不对 MPU 进行正确配置就跑不起来了呢,或者会出现各种各样的问题呢? 主要有以下几个方面:
 (1) 以太网数据是通过 ETH 专用 DMA 进行的,以太网发送/接收缓存不能存储在 DTCM RAM 中,而 STM32CubeMX 创建工程时默认可能把数据存储在 DTCM RAM 中去。
 (2) Cortex-M7 内核访问 normal 属性的存储区域时,是按乱序访问操作的,按这种方式将数据写入到 ETH 寄存器显然是要出错的。应当将 LWIP 发送/接收缓冲区配置成Device memory 或 Strongly-ordered 类型。
 (3) 根据 STM32H7 内部总线框图,可知 ETH_MAC 只能访问位于 D2 域内的 SRAM。因此,我们需要将 LWIP 所需的缓存分配到 D2 域的 SRAM 上。
 
 
 | 
 |