原料
硬件
- STM32F407ZGT6
- LAN8742A
- 一根RJ45 线
软件
- STM32CubeMX
- Keil v5.30
- FreeRTOS
问题描述
STM32一侧作为client向server发送数据过程中,如果将 线直接拔掉再插上,就再也连接不上server,也就是说不支持 线热插拔。
解决办法
先使用STM32CubeMX生成工程文件
创建过程就不多讲了,和一般的工程没什么区别,请注意我这里是选用了FreeRTOS,另外需要注意的有以下两点:
- 勾选Middleware->LWIP->Key Options->LWIP_NETIF_STATUS_CALLBACK
出错的函数是:
具体代码片是:
错误原因是 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进行处理,非常感谢!