STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例

一、目标实现

     通过网络通信的方式,当上位机发出对应指令给STM32,STM32根据收到的指令来执行对应的操作(例如:亮灯、灭灯、闪灯等)。还有可以将STM32连上路由器,当电脑连上路由器后,也可以通过上位机给STM32发送命令。

二、实现步骤

1、首先使用STM32CubeMX按照对应的开发板生成对应的程序模版。

本人使用的正点原子的STM32F407ZGT6探索者开发板,对应的以太网接口是LAN8720A

在STM32CubeMX中选上ETH、Lwip(不带操作系统)、对应需要点灯的管脚。

  • ETH配制中:按照开发板LAN8720A对应的手册,将特殊标志位地址与芯片的信息一一配对选上(其实Cube生成的默认参数和LAN8720A是对应的上的,如果是其他PHY芯片,则需要查看手册来配制)
  • Lwip配制中:不使用DHCP,使用手动配制的IP。

 在这一步中,其实以及把要做的工作完成了90%了!只剩下在应用层面使用LwIP的raw api接口进行开发了。

注意:PHY Address Value 需要设置成0!

 相应配制如图所示:

ETH配制

LWIP配制1

 2、当生成模版后,给ethernetif.c中的 HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle) 中添加LAN8720A的使能代码,然后在主函数的死循环中添加 MX_LWIP_Process()函数就可以实现在电脑上ping通STM32了

LAN8720A使能

 3、阅读LwIP官方给的RAW API 资料,实现在应用层上建立tcp/ip的应用

这里的流程与其他平台上tcp/ip或者upd通讯有很多的相似性

  • 首先先创建  struct tcp_pcb *tcp_new(void)  创建pcb块(类似创建socket)
  • 其次绑定IP err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)//PCB绑定指定的ip 与 端口号
  • 然后看作为 客户端 还是 服务器
  • 若是作为服务器 则使用进行监听 struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb)//返回新的pcb块

       然后当有连接进来后 则使用建立连接 :

       void tcp_accept(struct tcp_pcb *pcb, err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)) //在回调函数中来执行建立连接后要执行的事情

      连接建立后则可以开始进行读写操作 :

      err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len,  u8_t apiflags)//直接往PCB块中国写入len长度的dataptr指向内容

      void tcp_sent(struct tcp_pcb *pcb, err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) //在回调函数中来执行接受到消息后要执行的事情

      void tcp_recv(struct tcp_pcb *pcb, err_t (* recv)(void *arg, struct tcp_pcb *tpcb,  struct pbuf *p, err_t err))//在回调函数中来执行接受到消息后要执行的事情

      void tcp_recved(struct tcp_pcb *pcb, u16_t len) //从PCB块中接受len长度的数据

 三、有关LwIP的一些理解与生成模版代码的注释

//lwip.c 
void MX_LWIP_Init(void)
{
  /* IP addresses initialization */
  //ip地址、子网掩码、网关
  IP_ADDRESS[0] = 192;
  IP_ADDRESS[1] = 168;
  IP_ADDRESS[2] = 1;
  IP_ADDRESS[3] = 100;
  NETMASK_ADDRESS[0] = 255;
  NETMASK_ADDRESS[1] = 255;
  NETMASK_ADDRESS[2] = 255;
  NETMASK_ADDRESS[3] = 0;
  GATEWAY_ADDRESS[0] = 192;
  GATEWAY_ADDRESS[1] = 168;
  GATEWAY_ADDRESS[2] = 1;
  GATEWAY_ADDRESS[3] = 1;
  
  /* Initilialize the LwIP stack without RTOS */
  //初始化lwip,初始化了mem、pbuf、netif、ip、tcp与udp,检查延迟时间的舒适化等等
  lwip_init();

  /* IP addresses initialization without DHCP (IPv4) */
  //将IP等信息转化成为 大端序 添加到IPV4信息中、ipaddr、netmask、gw
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);

  /* add the network interface (IPv4/IPv6) without RTOS */
  //添加网络接口到 lwip netifs 列表中,调用回调函数来初始化以太网,在netif 网络接口结构体中放置input
  //其中 ethernetif_init 中包括了 low_level_init(用于初始化 以太网管脚接口、MAC信息、使能DMA与MAC的数据交互)
  //其中 ethernet_input 用于接收以太网接口的数据帧
  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);
  }

/* USER CODE BEGIN 3 */

/* USER CODE END 3 */
}

 

  • 18
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
要使用STM32CubeMXLAN8720、LwIP和FreeRTOS实现网络通信,需要注意以下几点。 首先,STM32CubeMX是一个图形化配置工具,用于为STM32微控制器生成初始化的代码框架。我们可以通过选择所需的外设(如以太网控制器)和配置参数来生成代码。 其次,LAN8720是一个用于实现以太网通信的PHY(物理层)芯片,负责将数据从媒介访问控制层(MAC层)转换为物理传输信号。 接下来,LwIP(Lightweight IP)是一个轻量级的网络协议栈,用于实现TCP/IP协议。我们需要将LwIP集成到项目中,并配置好网络参数,如IP地址、子网掩码和网关。 最后,FreeRTOS是一个流行的实时操作系统,用于管理任务调度和资源管理。我们可以将网络通信任务添加到FreeRTOS的任务列表中,并通过队列和信号量等机制进行任务间通信和同步。 总体实现步骤如下: 1. 使用STM32CubeMX选择并配置以太网控制器和PHY,并生成初始化代码。 2. 配置LwIP的网络参数,如IP地址、子网掩码和网关。 3. 将LwIP集成到项目中,包括源代码和相应的头文件。 4. 添加网络通信任务到FreeRTOS的任务列表中。 5. 在网络任务中,使用LwIP提供的API进行网络初始化、连接设置以及数据收发等操作。 6. 通过使用队列或信号量等机制,实现不同任务间的数据共享和同步。 7. 在主函数中初始化FreeRTOS,并启动任务调度器。 通过以上步骤,我们可以利用STM32CubeMXLAN8720、LwIP和FreeRTOS实现网络通信功能。这样我们就可以在STM32微控制器上实现网络连接、数据传输等网络应用。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的猫丿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值