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

基于正点原子阿波罗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地址,如下图:

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

相关文章:

  • 进程之IPC通信一
  • 51单片机编程学习笔记——无源蜂鸣器演奏《祝你生日快乐》
  • 大模型服务如何实现高并发与低延迟
  • SAR ADC 比较器寄生电容对性能的影响
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
  • [特殊字符] jQuery 响应式瀑布流布局插件推荐!
  • 王树森推荐系统公开课 排序04:视频播放建模
  • Mybatis面向接口编程
  • Conda环境管理:确保Python项目精准复现
  • 基于Qwen3-7B FP8与基石智算打造高性能本地智能体解决方案
  • 【Java高阶面经:微服务篇】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略
  • C++:STL
  • 2025华为OD机试真题+全流程解析+备考攻略+经验分享+Java/python/JavaScript/C++/C/GO六种语言最佳实现
  • lasticsearch 报错 Document contains at least one immense term 的解决方案
  • 大模型预训练、微调、强化学习、评估指导实践
  • Token的组成详解:解密数字身份凭证的构造艺术
  • ragas precision计算的坑
  • JavaScript计时器详解:setTimeout与setInterval的使用与注意事项
  • 初步认识HarmonyOS NEXT端云一体化开发
  • 活到老学到老-Spring参数校验注解Validated /Valid
  • 演员朱媛媛去世,其丈夫辛柏青发讣告
  • 错过航班大闹机场女子发声:非母子关系,将起诉视频发布者
  • 顶刊论文现“飙脏话辱骂第二作者”,期刊回应:正积极调查
  • 聚焦智能浪潮下的创业突围,“青年草坪创新创业湃对”走进北杨人工智能小镇
  • 中国证监会副主席李明:目前A股估值水平仍处于相对低位
  • 倒计时1天:走进“中国荔乡”茂名,探寻农交文旅商融合发展新模式