freertos移植stm32_lwip移植 freertos_lwip移植到windows(2)

电脑杂谈  发布时间:2017-02-21 05:06:50  来源:网络整理

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

freertos移植stm32_lwip移植到windows_lwip移植 freertos

工程默认将 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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 艾丽妃热甫拉提
      艾丽妃热甫拉提

      公司正在筹划进军蛋白饮品领域

    • 马欢杰
      马欢杰

      火腿

    热点图片
    拼命载入中...