关键字:STM32H5,LwIP,STM32CubeMX
1. 引言
STM32CubeMX为了简化工程,通常情况下,会把一些它认为不再需要的文件删掉,
但是对于有些用户自己添加第三方软件包的情况来说,会给用户带来一定的困扰。
2. 问题
2.1. 问题详情
客户在开发其产品过程中,使用了STM32H563ZIT6。因为STM32CubeH5这个
Cube包中,可以看到STM32H5默认使用的是AzureRTOS的产品,包括THREADX,
NETXDUO,等等。也就是说,同样在STM32CubeMX的界面中,在RTOS这块只能看
到AzureRTOS的配置。如果客户要使用FreeRTOS,就只能再添加X-CUBE
FREERTOS。要使用LwIP的话,只能自己移植。
客户将LwIP的软件包复制到\Middlewares\Third_Party下,如图1。

图1. 重新生成代码前的\Middlewares\Third_Party文件夹
成功调试以太网功能后,客户就直接在这个工程上继续添加其他功能。当在
STM32CubeMX添加其他外设,并重新生成代码时,客户发现,在Keil下编译代码出现
了一大堆的错误,如图2。
图2. 编译错误
2.2. 问题分析
从图2的错误来看,用户放进去的LwIP相关的文件都不见了。于是从资源管理器中进
入到工程里的文件,可以看到确实在\Middlewares\Third_Party下的LwIP文件夹不见
了,如图3。

图3. 生成代码后的\Middlewares\Third_Party 文件夹
可见,在生成代码的时候,STM32CubeMX把用户复制进来的LwIP文件夹删掉了,
导致编译失败。
2.3. 解决方法
对于这种情况,最直观的想法就是在重新生成代码后,把LwIP的文件夹重新拷贝过
来。这个办法可行,但是当一个项目很大的时候,用户添加了更多的文件夹和文件之后,
用这个办法的工作量可能会大大增加了,也不方便。
那么是否有一劳永逸的办法呢?
来看一下STM32CubeMX的用户手册,可以看到在代码生成的"生成的文件"选项
的介绍中提到了一个删除先前的文件的选项,如图4所示。
图4. 代码生成之"生成的文件"选项
这里的意思是说,如果之前生成的文件,在当前的配置中不再需要,那么这些之前生
成的文件将被删除。比如,之前的代码生成的时候使用了UART外设,从而生成了
uart.c/.h 文件,现在这个配置中不再使用UART外设了,那么重新生成的时候就删掉
uart.c/.h 文件。
所以,看起来Middleware文件夹也是受STM32CubeMX管理的,也能解释为什么
我们放到\Middlewares\Third_Party 下面的 LwIP文件夹会被删掉,因为
STM32CubeMX并没有配置LwIP,它会认为\Middlewares\Third_Party\LwIP这个文件
夹是没有用的,就直接将其删除。
现在要做的是看看如何阻止STM32CubeMX删除这些文件。
既然在用户手册看到了这个"生成的文件"选项,那么就可以到STM32CubeMX的
用户界面去查看这些选项,在Project Manager页面中,如图5所示。

图5. STM32CubeMX界面之"生成的文件"选项
可以看到,"Delete previously generated files when not re-generated "选项是
默认打勾的,也就是默认会删除之前已经生成的但是现在用不到的文件。
那么,来尝试一下把这个勾去掉,会发生什么样的事情?先把把LwIP文件夹再复制到
\Middlewares\Third_Party 下,再去除"Delete previously generated files when not
re-generated "前面的打勾。再重新生成代码,这个时候就可以看到LwIP文件夹依然躺
在\Middlewares\Third_Party 下,证明确实是可以的。
打开Keil工程,进行编译,编译成功。
3. 问题解决
当担心STM32CubeMX删掉用户的文件时,可以考虑在重新生成代码前先去除
"Delete previously generated files when not re-generated "前面的打勾。
4. 小结
STM32CubeMX为了让工程项目更简洁,会删掉一些它认为不再需要的文件,但是这
些文件也可能来自于用户自己复制进去的文件。要避免误删除这些用户文件,需要在
Project Manager 页面中将"Delete previously generated files when not re
generated "选项前的打勾去除。
意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利