STM32H7xx 运行 LWIP 时的 MPU 配置介绍 LAT1510
关键字: LWIP,STM32CubeMX,MPU 配置
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 上。
对于 STM32H7xx 运行 FreeRTOS+LWIP 时的内存分配,ST 官方 Demo 提供的参考配置如下。
以 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
(2) 实现 MPU 对 LWIP 堆栈区的设置(TEX=1,C=0,B=0),其属性为 Normal。
(3) 实现 MPU 对 ETH TX/RX 数据缓存区的设置(TEX=0,C=0,B=1),其属性设置为 Device. LWIP 协议栈并为实现 Cache 一致性操作,cacheable 需要处于 disable 状态。
(4) 指定 ETH 发送、接收缓冲区地址 配置 LWIP 堆栈缓冲区地址和大小 至此,对于 STM32H7 运行 LWIP 与 MPU 相关的部分就介绍到这里,其它配置可参考 HAL 库里面的例程即可。
配置 LWIP 堆栈缓冲区地址和大小
至此,对于 STM32H7 运行 LWIP 与 MPU 相关的部分就介绍到这里,其它配置可参考 HAL 库里面的例程即可。
意法半导体公司及其子公司 (“ST”)保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是 ST 中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与 ST 官网资料不一致,请以实际应用验证结果和 ST 官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利