使用STM32CubeMX 配置 LWIP参数时 TCP_QUEUE_OOSEQ 参数必须配置为Disable ,如下图所示,其他可以使用默认配置。

工程默认将 LWIP 配置文件放在inc文件夹中的 lwipopts.h 文件中,其实 LWIP 真正的配置在其源代码中的 opt.h 文件中,这个 lwipopts.h 文件是被后者包含了,让使用者去自定义,其实如果一个参数在 lwipopts.h 中没有配置在 opt.h 文档中已经有各种参数的默认配置,具体可以查看 opt.h 源代码。lwip移植 freertos这些配置中需要重点注意以下信息:
TCP_QUEUE_OOSEQ 这个上面提到了,必须关了。 LWIP_UDP 开启TCP/IP协议的UDP功能。 TCPIP_THREAD_STACKSIZE 这个很重要,用于配置tcp_input任务的堆栈大小,这个默认128就可以了,关于tcp_input 下面会讲。 TCPIP_THREAD_PRIO 这就tcp_input任务的优先级设置了。 LWIP_TIMEVAL_PRIVATE 如若使用GCC 自带 timeval 结构体定义,这个必须关了,也就是定义为零,不然编译会报错。 LWIP_BROADCAST_PING 这个要使用 ping 功能时必须开启,定义为 1。 TCPIP_MBOX_SIZE tcp_input 任务中需要用到,一个消息邮件中邮箱大小。 LWIP_ICMP 要使用 ping 这个功能必须开启,定义为 1, 因为 ping 就是使用的这个协议。 LWIP_SOCKET 这个就很明显了,一看就知道这个 嵌套字编程(socket)功能开启使能。 LWIP_COMPAT_MUTEX 在任务中使用信号量必须开启这个。
LWIP 的移植就是要实现 ethernetif.c 文件中的函数,其实 STM32CubeMX 已经帮我们做好了一些通用函数的实现,我们要做的就是根据自己的实际情况对驱动程序进行适当的修改,比如,PHY 芯片不一样一些底层控制寄存器地址就会不一样,芯片复位引脚不一样,等等,这就根据实际情况修改就行,特别需要注意配置PHY芯片的中断优先级别设置的太高,要是使用了STM32芯片的 MCO 引脚输出时钟给PHY芯片还需要配置 MCO 的时钟输出频率。
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(ETH_IRQn, 9, 0);
HAL_NVIC_EnableIRQ(ETH_IRQn);
在 low_level_init 函数中开启网卡功能后可以读取网口PHY芯片的寄存器值用于判断是否配置成功,具体可以查看PHY 芯片的 Datasheet 。
/* create a binary semaphore used for informing ethernetif of frame reception */
osSemaphoreDef(SEM);
s_xSemaphore = osSemaphoreCreate(osSemaphore(SEM) , 1 );
/* create the task that handles the ETH_MAC */
osThreadDef(EthIf, ethernetif_input, osPriorityRealtime, 0, INTERFACE_THREAD_STACK_SIZE);
osThreadCreate (osThread(EthIf), netif);
/* Enable MAC and DMA transmission and reception */
HAL_ETH_Start(&heth);
/* USER CODE BEGIN PHY_PRE_CONFIG */
HAL_ETH_ReadPHYRegister(&heth,0x02,®value);
printf("reg #2 :%ld\r\n",regvalue);
HAL_ETH_ReadPHYRegister(&heth,0x03,®value);
printf("reg #3 :%ld\r\n",regvalue); // 读取芯片ID验证驱动
/* 配置网口PHY芯片中断 */
HAL_ETH_ReadPHYRegister(&heth, PHY_MICR, ®value);
regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE);
/* Enable Interrupts */
HAL_ETH_WritePHYRegister(&heth, PHY_MICR, regvalue );
其实 网卡要能工作并接收数据主要是在low_level_init函数中创建了ethernetif_input 的任务,如上代码所示,这个任务将接收到的数据发送给 lwip/tcpip.c 文档中 tcpip_init 函数建立的tcpip_thread系统任务中,所以要看工作是否正常(可以用ping,看能否ping通),只要这两个任务(ethernetif_input 和 tcpip_thread)能正常运行就没问题了 。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-33609-2.html
火腿
公司正在筹划进军蛋白饮品领域