当前位置: 首页 > web >正文

基于正点原子阿波罗F429开发板的LWIP应用(2)——设置静态IP和MAC地址修改

说在开头

        正点原子F429开发板主芯片采用的是STM32F429IGT6,网络PHY芯片采用的是LAN8720A(V1)和YT8512C(V2),采用的是RMII连接,PHY_ADDR为0;在代码中将会对不同的芯片做出适配。

        CubeMX版本:6.6.1;

        F4芯片组Pack包版本:STM32Cube FW_F4 V1.27.0;

        本文的基础代码为上一篇文章得到的代码:基于正点原子阿波罗F429开发板的LWIP应用(1)——网络ping通-CSDN博客

1、静态IP和DHCP切换设置

1.1、原理说明

        在LWIP协议中通过“lwipopts.h”文件来对LWIP的各功能进行使能。而其中的“#define LWIP_DHCP 1”语句则是用来设置DHCP功能的,当LWIP_DHCP的值为1时则使能DHCP功能;若LWIP_DHCP的值为1则采用静态IP。

        DHCP和静态IP两中模式的区别就是IP的来源;反映到代码中就是:IP由谁设置。

        当采用DHCP时初始化ETH外设时将网卡的IP、子网掩码和网关都设为NULL,初始化结束后会通过“dhcp_start(&gnetif);”函数来启动DHCP服务向网关发送分配IP请求,只有当网关给它分配了IP之后才可以ping通,这也是为什么上篇文章最后强调“一定要接入路由器”的原因,因为电脑网口和交换机都不具备IP分配能力,只有路由器才具有;

        当采用静态IP的时候初始化ETH外设1时就会将IP信息赋值给网卡,初始化完成后模块的IP就已经可以ping通。

1.2、代码修改

//lwip.c开头增加以下代码:
uint8_t IP_ADDRESS[4] = { NULL };
uint8_t NETMASK_ADDRESS[4] = { NULL };
uint8_t GATEWAY_ADDRESS[4] = { NULL };//修改void MX_LWIP_Init(void)函数为以下内容:
void MX_LWIP_Init(void)
{
#if(LWIP_DHCP == 0)IP_ADDRESS[0] = 192;//自定义IPIP_ADDRESS[1] = 168;IP_ADDRESS[2] = 1;IP_ADDRESS[3] = 251;NETMASK_ADDRESS[0] = 255;//自定义子网掩码NETMASK_ADDRESS[1] = 255;NETMASK_ADDRESS[2] = 252;NETMASK_ADDRESS[3] = 0;GATEWAY_ADDRESS[0] = 192;//自定义默认网关GATEWAY_ADDRESS[1] = 168;GATEWAY_ADDRESS[2] = 1;GATEWAY_ADDRESS[3] = 1;
#endif	/* Initilialize the LwIP stack without RTOS */lwip_init();/* IP addresses initialization with DHCP (IPv4) */#if(LWIP_DHCP == 0)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]);
#elif(LWIP_DHCP == 1)ipaddr.addr = 0;netmask.addr = 0;gw.addr = 0;
#endif/* add the network interface (IPv4/IPv6) without RTOS */netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);/* Registers the default network interface */netif_set_default(&gnetif);#if(LWIP_DHCP == 0)printf("\r\n网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n静态IP地址........................%d.%d.%d.%d\r\n子网掩码..........................%d.%d.%d.%d\r\n默认网关..........................%d.%d.%d.%d\r\n",gnetif.hwaddr[0], gnetif.hwaddr[1], gnetif.hwaddr[2], gnetif.hwaddr[3], gnetif.hwaddr[4], gnetif.hwaddr[5],IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3], NETMASK_ADDRESS[0], NETMASK_ADDRESS[1], NETMASK_ADDRESS[2], NETMASK_ADDRESS[3], GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3] );
#endif /* USE_DHCP */ 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, ethernet_link_status_updated);/* Create the Ethernet link handler thread */#if(LWIP_DHCP == 1)/* Start DHCP negotiation for a network interface (IPv4) */dhcp_start(&gnetif);
#endif
/* USER CODE BEGIN 3 *//* USER CODE END 3 */
}

        修改完之后即可通过修改“lwipopts.h”文件中的“LWIP_DHCP”的值来设置IP的模式,当“LWIP_DHCP”的值为1时表示启用DHCP模式;为0时表示使用静态IP模式,这时候就可以通过修改lwip.c中“IP_ADDRESS”、“NETMASK_ADDRESS”和“GATEWAY_ADDRESS”这三个数组的值来设置模块的IP。

        修改完之后编译同样是0警告0错误,烧录之后模块的IP也能正常ping通。(注意:1、当采用静态IP时需要根据实际情况来设置模块的IP参数,如果不懂请自行百度下IP、子网掩码和默认网关这三个参数之间的关系。2、当采用静态IP模式时需要注意局域网下IP冲突的问题。)

2、MAC地址修改

       MAC地址也叫网络设备的硬件地址,每个设备不同且有特定含义。MAC地址都是由IEEE的注册管理机构RA分配给厂商,分配时只分配前三个字节,后三个字节由各厂商自行分配。 IEEE组织会定期更新oui文件,用于查询mac地址厂商,Oui文件地址: http://standards.ieee.org/develop/regauth/oui/oui.txt

        在通过CubeMX配置的时候可以通过修改"ETH"——>“Parameter Settings”——>“Ethernet MAC Address”的值来修改MAC地址。如下图:

        在生成代码后LWIP的MAC地址是通过“ethernetif.c”文件中的“low_level_init”函数中MACAddr数组的值来设置的,通过修改MACAddr的值即可修改LWIP的MAC地址。在实际开发中会通过一定的规律来设置芯片的MAC地址以保证每个产品的MAC地址不一样,比如芯片ID等。

我们可以通过一个免费软件(Advanced IP Scanner(绿色版))来查看模块IP对应的MAC地址,如下图:

由于本章节内容简单,改动不大就不上传源代码了。

http://www.xdnf.cn/news/7759.html

相关文章:

  • Python代码加密与发布方案详解
  • SpringMVC04所有注解按照使用位置划分| 按照使用层级划分(业务层、视图层、控制层)
  • MCP模型上下文协议:基于FastMCP 2.0的实践(2)
  • 机器学习第十九讲:交叉验证 → 用五次模拟考试验证真实水平
  • Linux基础IO(二)
  • upload-labs通关笔记-第14关 文件上传之文件头绕过(图片马)
  • 建筑墙壁红外热成像裂缝潮湿检测数据集VOC+YOLO格式306张2类别
  • 【项目】—高并发内存池
  • AUTOSAR图解==>AUTOSAR_SRS_SAEJ1939
  • day16-17-磁盘管理
  • 流程控制-循环
  • Robot Studio开发入门指南
  • 频分复用信号在信道中的状态
  • 第11天-Python GUI开发实战:Tkinter从入门到项目实践
  • 鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践
  • 【设计模式】基于 Java 语言实现工厂模式
  • 第二届帕鲁杯时间折叠(TimeFold Paradox)
  • 绝缘栅双极型晶体管IGBT的结构与特点
  • 【Git】常用命令大全
  • Git的windows开发与linux开发配置
  • Dify快速上手 MCP,接入高德地图 Server 实战攻略
  • 香港科技大学物理学理学(科学计算与先进材料物理与技术)硕士招生宣讲会——深圳大学
  • 制作一款打飞机游戏52:子弹模式
  • C++显式声明explicit
  • 1G(第一代移动通信系统)详解
  • python 提交 命令到远程windows服务器并获取作业进程id
  • ABAP - SAP与企业微信集成-推送文件到企业微信
  • DeepSeek提示工程Prompt Engineering
  • multipart/* 响应是否必须使用 chunked 编码?
  • 常用UI自动化测试框架