STM32CubeMx + LWIP(实现UDP组播/MQTT/热插拔)系列 一 ----- CubeMx配置

本配置是我在实际项目中的配置。具体:MCU是STM32F107,PHY为DP83848,接口为RMII。若使用其他芯片,只可作为参考。

时钟配置

DP83848使用的时钟来源为MCU提供。DP83848可支持10M/100M的线速。由于RMII为双线,所以MCO应输出50MHZ。

STM32F107对外输出时钟引脚为PA8,

在RCC中需要选择Master Clock Output输出时钟频率,然后将PA8的引脚输出速度为High,默认的low不足以支撑PHY所需要的频率。

外部晶振使用的为25MHZ,时钟树如下图:

设置MCO为50MHZ,SYSCLK为72MHZ。

ETH设置

直接使能的默认设置即可,PHY需要选择DP83848_PHY_ADDRESS,地址一般为1。若不确定

### 实现Zynq平台上的LwIP通信 为了实现在Zynq平台上利用LwIP进行通信,可以基于已有的网络接口和LwIP库来构建应用程序。下面提供了个基本框架以及些关键函数调用来帮助理解如何设置并运行个多客户端。 #### 初始化多环境 首先,在启动任何其他操作之前,必须确保已经正确设置了LwIP堆栈,并且有个可用的网络连接。这通常涉及到创建个初始化任务[^1]: ```c void lwip_init_task(void *pvParameters){ /* Initialize the LwIP stack */ tcpip_init(NULL, NULL); // Additional initialization code... } ``` 接着要加入特定的多,可以通过`igmp_join_group()`函数完成此过程。需要注意的是,对于IPv6,则应使用相应的`mld6_join_soliciation()`或其他相关API。 #### 加入/离开多 当准备接收来自某个或多些指定地址的数据包时,需调用如下所示的方法之以通知路由器本设备希望成为该成员: ```c err_t join_multicast_group(struct netif *netif, ip_addr_t *group_ip) { err_t result; if (IP_IS_V4(group_ip)) { result = igmp_joingroup(netif, group_ip); // For IPv4 multicast groups. } else { result = mld6_joingroup(netif, group_ip); // For IPv6 multicast groups. } return result; } // Example usage of joining a multicast group with an IP address like "239.0.0.8" struct ip_addr multiaddr; multiaddr.addr = inet_addr("239.0.0.8"); join_multicast_group(&your_netif_structure, &multiaddr); ``` 同样地,如果不再需要监听这些消息,应该适时地退出对应的多群体: ```c /* Leave Multicast Group */ err_t leave_multicast_group(struct netif *netif, const ip_addr_t *group_ip) { ... } ``` #### 接收多报文 旦成功加入了目标多之后,就可以像处理普通的UDP数据报样对待接收到的信息了。这里给出段用于读取消息的例子: ```c static void udp_receive_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { char buf[1500]; // Buffer to hold incoming packets memcpy(buf, p->payload, p->len); printf("Received message: %s\n", buf); pbuf_free(p); // Free up memory used by packet buffer after processing it. } ``` 最后步是建立UDP端口绑定到上述回调函数上,以便能够捕获发送至所关注的多地址的消息。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值