关于解决使用STM32F407+LAN8742A的 线热插拔问题

原料

硬件

  1. STM32F407ZGT6
  2. LAN8742A
  3. 一根RJ45 线

软件

  1. STM32CubeMX
  2. Keil v5.30
  3. FreeRTOS

问题描述

STM32一侧作为client向server发送数据过程中,如果将 线直接拔掉再插上,就再也连接不上server,也就是说不支持 线热插拔

解决办法

先使用STM32CubeMX生成工程文件

创建过程就不多讲了,和一般的工程没什么区别,请注意我这里是选用了FreeRTOS,另外需要注意的有以下两点:

  1. 勾选Middleware->LWIP->Key Options->LWIP_NETIF_STATUS_CALLBACK
  2. 出错的函数是:

    具体代码片是:

    错误原因是 LAN8742A 的ISFR寄存器属于只读寄存器,是不能对它设置的

    修正后的代码是(用这段代码替换上面出问题的代码片):

    创建检测 线状态的任务

    其实由于我们在CubeMX中勾选相关选项,CubeMX会在void MX_LWIP_Init(void)中为我们创建一个ethernetif_set_link的任务,这个任务还附带有一个信 量,但是在实际代码中这个信 量并没有用到。我怀疑这可能与某个ST官方的开发板有关,在这个开发板上是有一个按键,按下按键就会释放这个信 量,写这个文档时,我没有再去找这部分代码。大家如果想找的话,可以在CubeMX下载的软件包里找,大致位置是在STM32CubeRepositorySTM32Cube_FW_F4_V1.25.0Projects,另外这里面有很多参考工程可以学习。
    我在实际测试时发现这个任务无法运行,因此我就直接删除了这个任务,然后新建了一个任务。

    具体代码如下:

    当 线连接时gnetif->flags的bit2将会被置1,否则清0。因此我就在TCP发送任务中添加了一下代码片:

    只有 线连接了才会执行new、connect、write等操作。如果发现 线被拔掉,将立即关闭删除相关连接,然后等待 线重新插好。

    结语

    FreeRTOS的任务创建机制以及内存分配还需要仔细研究,如果大家有问题可以留言或者私聊,看到后我会尽力回复,如果想找我要源代码,请免开金口。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月9日
下一篇 2020年4月9日

相关推荐