[信息] LAT1510 STM32H7xx运行LWIP时的MPU配置介绍

[复制链接]
440|10
STM新闻官 发表于 2025-10-29 22:45 | 显示全部楼层 |阅读模式
, , , ,
本帖最后由 STM新闻官 于 2025-11-1 18:58 编辑

1. 前言           
在使用 STM32H7 系列进行开发产品时,客户经常忽略对 MPU 进行配置,一般出现问题来找原因时往往感到无从下手。对于 STM32H7 原因最多的是没有对 MPU 进行合理配置,这个问题很容易被忽略,因为当我们应用比较简单时,往往不容易出现错误。但是,当我们的应用较为复杂时,如有外扩存储器、GUI、ETH、USB 等出错概率就高了。笔者,最近就遇到一个案例,客户反馈不运行 LWIP 时程序正常,但是运行 LWIP 系统经常死机,不知道什么原因。         
笔者以点代面,以运行 LWIP 为例说明怎样使用 STM32CubeMX 对 STM32H7 特定存储区间进行配置,并对 STM32CubeMX MPU 相关参数进行了解释说明。

2. 问题调研         
首先我们使用 STM32CubeMX 创建一个基于 STM32H723ZG 的工程,MPU 默认配置如下:

96674690228e97ce6a.png

因此,在使用 STM32CubeMX创建工程时,默认就对 MPU 进行了初步配置,关于H7为什么要对 MPU 进行配置,其配置原理及 MPU 的更详细理解,有兴趣的读者可参考 LAT1240和 LAT1448,笔者不再做详细解释,其配置含义如下图所示:

824276902294c1f93d.png

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 上。
35086905e685c856a.png
818746905e693c945c.png

对于 STM32H7xx 运行 FreeRTOS+LWIP 时的内存分配,ST 官方 Demo 提供的参考配置如下。
145296905e6b7804a1.png

44796905e6c3bcf04.png


以 STM32H723ZG 为例,说明使用 STM32CubeMX 实现配置 LWIP 缓存的配置:
(1) 在 STM32CubeMX 里面关于 TEX、C、B,三者组合值的关系(参见 AN4838)。
其中,TEX&C&B 的组合决定了对应 MPU 区域对应存储器的属性,其与
STM32CubeMX 里面的配置项对应关系如下:
TEX -- MPU TEX field level
C -- MPU Cacheable Permission
B -- MPU Bufferable Permission

327786905e6f70dcb5.png

(2) 实现 MPU 对 LWIP 堆栈区的设置(TEX=1,C=0,B=0),其属性为 Normal。

467306905e71fb5bae.png


(3) 实现 MPU 对 ETH TX/RX 数据缓存区的设置(TEX=0,C=0,B=1),其属性设置为
Device.
LWIP 协议栈并为实现 Cache 一致性操作,cacheable 需要处于 disable 状态。

975296905e736e8074.png

(4) 指定 ETH 发送、接收缓冲区地址

106846905e748d6f4e.png

配置 LWIP 堆栈缓冲区地址和大小
89986905e79fa5af0.png

至此,对于 STM32H7 运行 LWIP 与 MPU 相关的部分就介绍到这里,其它配置可参考HAL 库里面的例程即可

参考文献
382086905e7d126eb4.png


xiaoqizi 发表于 2025-11-4 18:36 | 显示全部楼层
MPU配置的核心目标是解决CPU缓存与DMA控制器之间的数据一致性问题
木木guainv 发表于 2025-11-4 20:59 | 显示全部楼层
还需要确保网络数据缓冲区的高效访问
Jiangxiaopi 发表于 2025-11-5 08:44 | 显示全部楼层
LWIP堆内存区必须是非缓存、共享且非缓冲,保证网络数据包收发的原子性操作正确
荣陶陶 发表于 2025-11-5 11:08 | 显示全部楼层
// Region 0: DMA描述符区(256字节)
MPU_InitStruct.BaseAddress = 0x30000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
// Region 1: LWIP堆内存(16KB)
MPU_InitStruct.BaseAddress = 0x30004000;
MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;


Zhiniaocun 发表于 2025-11-5 13:31 | 显示全部楼层
LWIP堆起始地址需满足4字节对齐,并与[size=0.875]lwipopts.h中的[size=0.875]LWIP_RAM_HEAP_POINTER宏严格匹配
Zuocidian 发表于 2025-11-5 16:06 | 显示全部楼层
手动指定DMA描述符和缓冲区的物理位置,避免动态分配导致越界
Puchou 发表于 2025-11-5 18:31 | 显示全部楼层
在STM32CubeMX的“Connectivity”选项卡中激活ETH外设,随后进入“Memory Protection Unit”界面进行设置
Xiashiqi 发表于 2025-11-5 20:49 | 显示全部楼层
RW_DMARxDscrTab 0x30000000 0x80 { *(.RxDescripSection) }
RW_DMATxDscrTab 0x30000080 0x80 { *(.TxDescripSection) }
RW_RAM_POOL 0x30004000 0x4000 { *(.Rx_PoolSection) }


小海师 发表于 2025-11-5 23:03 | 显示全部楼层
Ping不通或丢包的原因可能是DMA访问了CPU独享的高速缓存区,导致数据未持久化至物理内存

Haizangwang 发表于 2025-11-6 09:07 | 显示全部楼层
增大RX/TX描述符队列长度,并在MPU中为其分配独立区域以避免总线争用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1439

主题

1790

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部