STM32cube使用LAN8720芯片生成lwip初始代码的一些操作

 

​​​​3月25日优化精简项目:

首先使用cude设置好所有lan8720的引脚定义,包括REST和PHYAD0,下面是需要小改动的部分

  1. Cube  PHY address 根据PHYAD0选0,注意初始化引脚
  2. PHY_SR 0x001F
  3. PHY_SPEED_STATUS 0x0004
  4. PHY_DUPLEX_STATUS 0x0010
  5. While(1)加入MX_LWIP_Process();函数
  6. low_level_init加入LAN8720_RESET();函数

void LAN8720_RESET(void)
{
    HAL_GPIO_WritePin(ETH_PHYAD0_GPIO_Port, ETH_PHYAD0_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(ETH_REST_GPIO_Port, ETH_REST_Pin, GPIO_PIN_RESET);
    HAL_Delay(55);
    HAL_GPIO_WritePin(ETH_REST_GPIO_Port, ETH_REST_Pin, GPIO_PIN_SET);
    HAL_Delay(55);
}

3月26日 udp调试纪录

循环里直接加入udp_new(); udp_connect(); udp_bind(); udp_recv();


//UDP服务器发送数据

void udp_demo_senddata(struct udp_pcb *upcb)

{
       struct pbuf *ptr;
       ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)tcp_demo_sendbuf),PBUF_POOL); //申请内存
       if(ptr)
       {
              pbuf_take(ptr,(char*)tcp_demo_sendbuf,strlen((char*)tcp_demo_sendbuf)); //将tcp_demo_sendbuf中的数据打包进pbuf结构中
              udp_send(upcb,ptr);        //udp发送数据
              pbuf_free(ptr);//释放内存
       }
}

 7月14日 之前完成的上电后插网线DHCP获取,热插拔实现

if(HAL_GetTick()>time_check_eth)
{
    time_check_eth=HAL_GetTick()+1000;		
    if(!netif_is_link_up(&gnetif))
    {
        HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &phyreg);
        if(phyreg & PHY_LINKED_STATUS)
        {
            HAL_ETH_DeInit(&heth);
        //  HAL_ETH_Init(&heth);
            MX_LWIP_ReInit();
        }
    }
    else if(DHCP_OK==0&&gnetif.ip_addr.addr)
    {
        DHCP_OK=1;
        UDP_START();
        printf("\r\nSTM32 SYSTEM start!\r\n");
    }
}


void MX_LWIP_ReInit(void)
{
  /* Initilialize the LwIP stack without RTOS */
//  lwip_init();
	dhcp_stop(&gnetif);
  /* IP addresses initialization with DHCP (IPv4) */
  ipaddr.addr = 0;
  netmask.addr = 0;
  gw.addr = 0;

  /* add the network interface (IPv4/IPv6) without RTOS */
	netif_remove(&gnetif);
  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);
  }

  /* Start DHCP negotiation for a network interface (IPv4) */
	
  dhcp_start(&gnetif);
}

上电等待网络连接超时太长(stm32f1xx_hal_eth.c)

#define  ETH_TIMEOUT_LINKED_STATE  5000U
改为
#define  ETH_TIMEOUT_LINKED_STATE  500U

7月15日 针对STM32F429 的MCO2无法输出问题

void EnablePLLI2S(void)
{
    RCC_PLLI2SInitTypeDef RCC_PLLI2SInitStruct;
	
    RCC_PLLI2SInitStruct.PLLI2SN = 50;
    RCC_PLLI2SInitStruct.PLLI2SQ = 2;
    RCC_PLLI2SInitStruct.PLLI2SR = 2;
    if (HAL_RCCEx_EnablePLLI2S(&RCC_PLLI2SInitStruct) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
}

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用STM32CubeMX、LAN8720、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,并启动任务调度器。 通过以上步骤,我们可以利用STM32CubeMX、LAN8720、LwIP和FreeRTOS实现网络通信功能。这样我们就可以在STM32微控制器上实现网络连接、数据传输等网络应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值