CubeMX有个很麻烦的问题,就是在配置的时候按以前的方案。或者像网上一般人介绍的那样,在ETH配置的时候选择中断模式, 甚至,在CubeMX的配置界面中,已经找不到 ETH_RX_MODE这个选项了, 更麻烦的是生成的代码中,连heth.Init.TxMode也永久性的彻底消失了。。。
一下子就把使用以太网中断接收模式的门槛提到了很高。
而使用轮询方式,如果项目要求不高还行, 如果要求高,,,会有很麻烦的丢包率,特别是当你的项目程序很复杂的时候,,,这个丢包率足以让上位机那边的人天天找你麻烦,。。。
当然, 如果中断设置不当,也会有很多问题。比如频繁进入TCP中断,导致其他部分什么也干不了。因此,必须将中断的优先级设置为最低级, cubeMX能给的就只有 3.3了,,,
/***************************************配置中断*************************************************/
那么要解决这个吓人的网络通讯丢包,那就必须使用中断模式了。目前只能通过改LWIP的内核代码来实现。
配置方法如下(假设你已经完全掌握了CUBEMX的ETH轮询配置方法)
1.还按cubeMX默认的polling模式配置好,并生成代码。 接着打开工程,来修改LWIP的内核代码。
首先修改ethernetif.c文件中的void ethernet_link_check_state(struct netif *netif)函数, 和HAL库的套路基本相通, 想用中断, 直接把启动函数后面加IT即可, 这样在启动的时候就开启了中断。
2.在lwip.c文件中,修改void MX_LWIP_Process(void)函数
将读取数据包的这个函数,注释掉。 当然也不能叫注释掉, 因为还需要它来读取以太网的数据包,只是要把它移动到中断服务函数中去。
3.修改中断服务函数,在中断服务函数中添加处理过程。
/*******************************************结束*****************************************************/
进行抓包测试, 20ms一次,疯狂轰炸, 没有数据丢包情况, 哈哈哈