设置
STM32CubeIde 1.10.1
STM32CubeMX 6.6.1.202207061420
关于
激活以太网、LwIP 和 RTOS 功能的 STM32F4/F7/H7 项目(也可能扩展到其他项目)。
特别是在 LwIP>General set
tings 中设置了
WITH_RTOS标志时。
症状
以太网链路重新连接失败,如果在启动时断开连接,则初始连接失败。
使用上述配置创建的 ethernetif.c 文件是使用 ethernet_link_thread 中的
HAL_ETH_Start (&heth)非中断函数调用错误生成的:
- // Part of void ethernet_link_thread(void* argument) in ethernetif.c around line 797
- if(linkchanged)
- {
- /* Get MAC Config MAC */
- HAL_ETH_GetMACConfig(&heth, &MACConf);
- MACConf.DuplexMode = duplex;
- MACConf.Speed = speed;
- HAL_ETH_SetMACConfig(&heth, &MACConf);
- HAL_ETH_Start(&heth);
- netif_set_up(netif);
- netif_set_link_up(netif);
- }
对于
WITH_RTOS配置,调用必须改为
HAL_ETH_Start_IT(&heth) 。
漏洞详情
db/templates 中的 ethernetif.c 文件模板(ethernetif_f4.ftl、ethernetif_f7.ftl 和 ethernetif_h7.ftl)缺少
WITH_RTOS标志的这一行的 if 评估。
ethernetif_f4.ftl 的解决方案(其他 .ftl 文件中的不同行号)
代替
在第 891 行中
- [#if with_rtos == 1]
- HAL_ETH_Start_IT(&heth);
- [#else]
- HAL_ETH_Start(&heth);
- [/#if][#-- endif with_rtos --]
就像在第 848 行中为
HAL_ETH_Stop_IT(&heth)调用所做的那样。