stm32开发之netxduo网口通讯,网线热插拔处理

前言

  1. 在使用netxduo组件时,如果在上电过程中,未插入网线,eth驱动使能过程中未正常初始化
  2. 本次使用以下几种方式进行设置

问题原因

在这里插入图片描述

使用定时器+事件回调方式

网络组件中进行调整

/*
 * Copyright (c) 2024-2024,shchl
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-4-15     shchl   first version
 */
#include <nx_ip.h>

#include "lan8742.h"
#include "main.h"
#include "nx_stm32_eth_driver.h"
#include "nx_stm32_phy_driver.h"

#if 1


#define     APP_NX_PACKET_SIZE              1536 /*数据包大小*/
#define     APP_NX_PACKET_POOL_SIZE         ((sizeof(NX_PACKET) + APP_NX_PACKET_SIZE) * 16)

#define     APP_NX_IP_STACK_SIZE            2048
#define     APP_NX_IP_PRIORITY              10

#define     APP_NX_ARP_CACHE_SIZE           1024

#define     APP_NX_IP_ADDR                  IP_ADDRESS(192,168,8,9)
#define     APP_NX_IP_SUB_MASK              IP_ADDRESS(255,255,255,0)

/*
*******************************************************************************************************
*                               外部引入变量
*******************************************************************************************************
*/

/*
*******************************************************************************************************
*                               变量
*******************************************************************************************************
*/

void *loc_ip_area;
void *packet_pool_area;
void *arp_cache_area;

NX_PACKET_POOL g_packet_pool; /*全局packet pool 池*/
NX_IP g_loc_ip; /*全局 本地ip实例*/
static TX_TIMER nx_link_status_timer;
/*
*********************************************************************************************************
*                                       静态全局变量
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                      函数声明
*********************************************************************************************************
*/
static VOID phy_link_status_change_notify(NX_IP *ip_ptr, UINT i, UINT link_up);

static VOID check_phy_link(ULONG id);

/*
*********************************************************************************************************
*                                      外部函数
*********************************************************************************************************
*/
int nx_application_define(void) {
    UINT stat = 0;
#if 1
    /*内存分配*/
    static CHAR nx_packet_pool[APP_NX_PACKET_POOL_SIZE];
    static CHAR nx_arp_cache[APP_NX_ARP_CACHE_SIZE];
    static CHAR nx_ip_stack[APP_NX_IP_STACK_SIZE];

    packet_pool_area = nx_packet_pool;
    loc_ip_area = nx_ip_stack;
    arp_cache_area = nx_arp_cache;
#else
    packet_pool_area = app_malloc(APP_NX_PACKET_POOL_SIZE);
    loc_ip_area = app_malloc(APP_NX_IP_STACK_SIZE);
    arp_cache_area = app_malloc(APP_NX_ARP_CACHE_SIZE);
#endif

    /*创建packet pool*/
    stat += nx_packet_pool_create(&g_packet_pool, "NX PACKET POOL",
                                  APP_NX_PACKET_SIZE,
                                  packet_pool_area, APP_NX_PACKET_POOL_SIZE);

    stat += nx_ip_create(&g_loc_ip,
                         "NX IP",
                         APP_NX_IP_ADDR,
                         APP_NX_IP_SUB_MASK,
                         &g_packet_pool,
                         nx_stm32_eth_driver,
                         loc_ip_area,
                         APP_NX_IP_STACK_SIZE,
                         APP_NX_IP_PRIORITY);

    nx_ip_link_status_change_notify_set(&g_loc_ip, phy_link_status_change_notify);
    /*ip 相关配置*/
    {
        /* 启用 ARP 并为 IP 实例  提供 ARP 缓存内存。 */
        stat += nx_arp_enable(&g_loc_ip, arp_cache_area, APP_NX_ARP_CACHE_SIZE);
        /* 启用 ICMP */
        stat += nxd_icmp_enable(&g_loc_ip);
        /* 为IP 实例启用 TCP 处理.  */
        stat += nx_tcp_enable(&g_loc_ip);
        /*禁止分包 */
        stat += nx_ip_fragment_disable(&g_loc_ip);
    }
    if (stat) {
        LOG_E("app_nx_ip_instance_create error:%d", stat);
    }
    tx_timer_create(&nx_link_status_timer, "phy check",
                    check_phy_link, 0, 1000, 5000, TX_AUTO_ACTIVATE);

    return NX_SUCCESS;
}

TX_APP_DEFINE_EXPORT(nx_application_define); /*首先创建模块应用*/


/*
*********************************************************************************************************
*                                      内部函数
*********************************************************************************************************
*/

static VOID check_phy_link(ULONG id) {
    // ;

    int32_t status = nx_eth_phy_get_link_state();
    UINT nx_link_status = g_loc_ip.nx_ip_interface[0].nx_interface_link_up;

    // 判断
    if (((nx_link_status == TX_TRUE) && status <= LAN8742_STATUS_LINK_DOWN) ||
        (nx_link_status == TX_FALSE && status > LAN8742_STATUS_LINK_DOWN)) {
        g_loc_ip.nx_ip_interface[0].nx_interface_link_status_change = TX_TRUE;
        _tx_event_flags_set(&g_loc_ip.nx_ip_events,NX_IP_LINK_STATUS_EVENT,TX_OR);
    }
}

/**
 *
 * @brief  物理链接状态改变通知回调函数
 * @param ip_ptr
 * @param i
 * @param link_up
 */
static VOID phy_link_status_change_notify(NX_IP *ip_ptr, UINT i, UINT link_up) {
    NX_IP_DRIVER driver_request;
    if (link_up == NX_TRUE) {
        LOG_D("nx link enable ", link_up);
        driver_request.nx_ip_driver_ptr = ip_ptr;
        driver_request.nx_ip_driver_command = NX_LINK_ENABLE;
        ip_ptr->nx_ip_interface[i].nx_interface_link_driver_entry(&driver_request);
    } else {
        // ip_ptr->nx_ip_interface[i].nx_interface_link_up=NX_FALSE;
        LOG_D("nx link diasble ", link_up);
        driver_request.nx_ip_driver_ptr = ip_ptr;
        driver_request.nx_ip_driver_command = NX_LINK_DISABLE;
        ip_ptr->nx_ip_interface[i].nx_interface_link_driver_entry(&driver_request);
    }
}


#endif

关键部分

在这里插入图片描述

关于这个事件接收部分的代码(设计到的源码重点部分说明)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

禁用部分(调整)

在这里插入图片描述

测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

詩不诉卿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值