lwip在stm32f4上的移植

简要记录lwip在stm32f4上的移植步骤:

最简单的lwip移植主要是底层数据收发硬件接口的实现以及配置,在此处主要是ethernetif.c ethernetif.h以及配置文件lwipopt.h的修改

1. main函数

struct netif gnetif;

static void SystemClock_Config(void);
static void BSP_Config(void);
static void Netif_Config(void);
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    /* Configure the BSP */
    BSP_Config();
    /* Initialize the LwIP stack */
    lwip_init();
    Netif_Config();
    /* tcp echo server Init */
    tcp_echoserver_init();
    /* Notify user about the network interface config */
    User_notification(&gnetif);
    while (1)
    {		
		ethernetif_input(&gnetif);
		sys_check_timeouts();
    }
}

其中Netif_Config()是底层的初始化配置; tcp_echoserver_init()是上层(应用层的配置)

1.1 Netif_Config():

其中netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);这句实现了初始化,并注册了接收驱动接口。

static void Netif_Config(void)
{
  ip_addr_t ipaddr;
  ip_addr_t netmask;
  ip_addr_t gw;

#ifdef USE_DHCP
  ip_addr_set_zero_ip4(&ipaddr);
  ip_addr_set_zero_ip4(&netmask);
  ip_addr_set_zero_ip4(&gw);
#else
  IP_ADDR4(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3);
  IP_ADDR4(&netmask,NETMASK_ADDR0,NETMASK_ADDR1,NETMASK_ADDR2,NETMASK_ADDR3);
  IP_ADDR4(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3);
#endif /* USE_DHCP */
  
  /* Add the network interface */    
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);
  
  /* Registers the default network interface */
  netif_set_default(&gnetif);
  
  if (netif_is_link_up(&gnetif))
  {
    /* When the netif is fully configured this function must be called */
    netif_set_up(&gnetif);
  }
  else
  {
    /* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }
  
  /* Set the link callback function, this function is called on change of link status*/
  netif_set_link_callback(&gnetif, ethernetif_update_config);
}

1.2 tcp_echoserver_init()

体现了tcp server 应用层的基本操作, tcp新建-> 端口绑定->监听->等待数据接收。

void tcp_echoserver_init(void)
{
  /* create new tcp pcb */
  tcp_echoserver_pcb = tcp_new();

  if (tcp_echoserver_pcb != NULL)
  {
    err_t err;
    
    /* bind echo_pcb to port 7 (ECHO protocol) */
    err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);
    
    if (err == ERR_OK)
    {
      /* start tcp listening for echo_pcb */
      tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);
      
      /* initialize LwIP tcp_accept callback function */
      tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);
    }
    else 
    {
      /* deallocate the pcb */
      memp_free(MEMP_TCP_PCB, tcp_echoserver_pcb);
    }
  }
}

2. ethernetif.c中的文件接口,(以下还含有ethernet.c中的函数接口)

主要实现网卡驱动

  • 初始化:

- low_level_init

    该函数实现了硬件网卡设备的初始化,通过调用HAL_ETH_Init(&EthHandle),实现了功能(mac addr,rx mode,speed,media interface(MII)等)和端口(通过调用HAL_ETH_MspInit(heth)实现,当然这个接口需要用户提供,用于初始化与网卡间的GPIO)的初始化

- err_t ethernetif_init(struct netif *netif)

    调用low_level_init实现网卡的基本功能初始化,并初始化struct netif部分功能,如netif->output = etharp_output和netif->linkoutput = low_level_output,以及网卡名。

  • 接收数据:low_level_input->ethernetif_input

- static struct pbuf * low_level_input(struct netif *netif)

        实现将底层收到的数据以链表的形式存放到struct pbuf接口中,返回链表的首地址。 后续需要研究HAL_ETH_GetReceivedFrame(&EthHandle)接收实现。

- void ethernetif_input(struct netif *netif)

       该函数调用low_level_input,将收到的底层数据,通过err = netif->input(p, netif); 发送到lwip协议栈中。其中netif->input函数既是 err_t ethernet_input(struct pbuf *p, struct netif *netif);是通过netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);注册的。

  • 发送数据:ethernet_output->low_level_output

- static err_t low_level_output(struct netif *netif, struct pbuf *p)

      该函数通过调用HAL_ETH_TransmitFrame(&EthHandle, framelength);函数将pbuf的数据发送出去。

- err_t ethernet_output(struct netif* netif, struct pbuf* p,const struct eth_addr* src, const struct eth_addr* dst,u16_t eth_type)

      该函数通过调用low_level_output函数将pbuf中的数据发送出去,该函数是lwip协议栈底层发送数据的出口。看程序主要被etharp调用,后续需要细看。

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将RT-Thread和LwIP移植STM32F4平台需要一些步骤,下面是一个简单的指南: 1.下载RT-Thread源代码和LwIP源代码。可以从官方网站获取最新版本。 2.将RT-Thread和LwIP源代码添加到您的工程中。可以直接将源代码文件复制到您的工程目录中,也可以在工程中创建一个新的文件夹,并将源代码添加到该文件夹中。 3.根据您的硬件配置,对STM32F4的寄存器和外设进行初始化。通常,您需要根据硬件手册编写一些初始化代码,以使STM32F4与RT-Thread和LwIP兼容。 4.配置LwIP选项。通过修改lwipopts.h文件,您可以配置LwIP的各种选项,例如IP地址、子网掩码、网关等。 5.在RT-Thread的配置文件rtconfig.h中启用LwIP组件。找到RT-Thread中的lwip组件选项,并确保它被启用。 6.修改RT-Thread的初始化代码,以初始化并启动LwIP。在RT-Thread的应用程序入口函数中,添加初始化LwIP的代码。这包括为LwIP创建一个线程,并为网络接口分配内存等。 7.根据您的需求配置LwIP和RT-Thread的线程、任务和堆栈大小。这些参数的默认值可能不适合您的应用,您可以根据需要进行调整。 8.编译并烧录您的应用程序到STM32F4上。使用合适的编译工具和烧录器,将代码编译成二进制文件,并烧录到STM32F4上。 9.测试和调试。在STM32F4上运行您的应用程序,并使用适当的工具(例如串口终端)检查网络连接。您还可以使用调试器来调试您的应用程序,并解决可能遇到的问题。 这只是一个初步指南,具体的移植过程可能因个人需求和硬件平台的差异而有所不同。对于更深入的了解,建议参考LwIP和RT-Thread的官方文档和社区讨论。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值