STM32F407+FreeRTOS+LWIP UDP组播

news/2025/2/12 4:59:31/

开发环境介绍:

MCU:STM32F407ZET6

网卡:LAN8720A

LWIP版本:V1.1.0

FreeRTOS 版本:V10.2.1

LAN8720A硬件原理图:

硬件连接说明:

MII_RX_CLK/RMII_REF_CLK ------>PA1                   MII_TXD0 ------>PB12
MII_MDIO  ------>PA2                                                 MII_TXD1 ------>PB13
MII_RESET ------>PA3                                               MII_MDC ------>PC1
MII_RX_DV/RMII_CRSDV ------>PA7                        MII_RXD0 ------>PC4
MII_RX_ER  ------>PB10                                            MII_RXD1 ------>PC5
MII_TX_EN  ------>PB11

Lwip组播配置:

上图中创建了一个10ms的循环定时器,定时器回调函数为: LwipTimCallBack

void LwipTimCallBack(TimerHandle_t xTimer)
{
    uint32_t LocaTime = xTaskGetTickCount();
    LwIP_Periodic_Handle(LocaTime);
}

 netconf.c--->void LwIP_Periodic_Handle(volatile uint32_t localtime)内添加igmp计时器调用算法

ethernetif.c--->static void low_level_init(struct netif *netif)添加

 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;

 在stm32f429_phy.c---->static void ETH_MACDMA_Config(void)方法中进行以下设置:

组播接收消息设置:

接收消息使用的是8081端口,发送消息使用的是8080端口。组播地址239.0.0.1。客户端设置可参考另一篇文章:QT学习笔记_UDP组播通信(加入组播)_qt 实现udp通信工程文件添加什么-CSDN博客

static void MulticastRxTask(void *pcParameter)
{uint32_t NotifyValue = 0;UBaseType_t uxHighWaterMark;struct netconn *udpconn;udpconn = netconn_new(NETCONN_UDP);ip_addr_t destipaddr;IP4_ADDR(&destipaddr,239,0,0,1);netconn_bind(udpconn,IP_ADDR_ANY,8081);netconn_join_leave_group(udpconn,&destipaddr,IP_ADDR_ANY,NETCONN_JOIN);uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL);while(1){struct netbuf *recebuf;if(netconn_recv(udpconn,&recebuf) == ERR_OK)//会自己阻塞{uint16_t ReceByteCount = recebuf->p->len;uint8_t *pData = recebuf->p->payload;if((pData[0] == 0xAA &&pData[1] == 0xBB))memcpy((void *)MulticastBuf,(void *)pData,ReceByteCount);netbuf_delete(recebuf);}uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );}
}

组播发送消息:

void MulticastTxTask(void *pvParameter)
{struct netconn *udpconn;udpconn = netconn_new(NETCONN_UDP);netconn_bind(udpconn, IP_ADDR_ANY, 8080);ip_addr_t ipMultiCast;IP4_ADDR(&ipMultiCast, 239, 0, 0, 1);netconn_connect(udpconn,&ipMultiCast,8080);for(;;){uint32_t NotifyValue = 0;struct netbuf *sendbuf = netbuf_new();xTaskNotifyWait(ULONG_MAX,ULONG_MAX,&NotifyValue,portMAX_DELAY);switch(NotifyValue){//组桢MulticastRxStruct.ReceLen =MakeUpInfoBack(0x3031,MulticastRxStruct.Data);break;default:break;}netbuf_alloc(sendbuf,MulticastRxStruct.ReceLen);netbuf_ref(sendbuf,MulticastRxStruct.Data,MulticastRxStruct.ReceLen);//发送指定长度字符串netconn_send(udpconn,sendbuf);//发送报文netbuf_delete(sendbuf);}
}


http://www.ppmy.cn/news/1412737.html

相关文章

0.开篇:SSM+Spring Boot导学

1. 为什么要使用框架 Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。 几乎当下所有企业级JavaEE开发都离不开SSM(Spring SpringMVC MyBatis)Spring B…

C语言 | Leetcode C语言题解之第19题删除链表的倒数第N个结点

题目: 题解: struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0, dummy->next head;struct ListNode* first head;struct ListNode* second dummy;f…

实验3 交换机基本配置

实验3 交换机基本配置 一、 原理描述二、 实验目的三、 实验内容四、实验步骤1.建立实验拓扑2.设备编址3.检测链路连通性4.交换机双工模式配置 一、 原理描述 交换机(Switch)也称为交换式集线器,其工作在OSI 第二层(数据链路层)上…

go websocket

WebSocket 是一种网络协议,建立在 HTTP 协议之上,允许双向通信。WebSocket 协议允许服务器发送数据到客户端,同时也可以让客户端向服务器发送数据。WebSocket 使用 HTTP 协议的升级请求和响应来建立连接。WebSocket 的主要优点在于它可以通过…

Vue3 + Vite 构建组件库发布到 npm

你有构建完组件库后,因为不知道如何发布到 npm 的烦恼吗?本教程手把手教你用 Vite 构建组件库发布到 npm 搭建项目 这里我们使用 Vite 初始化项目,执行命令: pnpm create vite my-vue-app --template vue这里以我的项目 vue3-xm…

【用户案例】太美医疗基于Apache DolphinScheduler的应用实践

大家好,我叫杨佳豪,来自于太美医疗。今天我为大家分享的是Apache DolphinScheduler在太美医疗的应用实践。今天的分享主要分为四个部分: 使用历程及选择理由稳定性的改造功能定制与自动化部署运维巡检与优化 使用历程及选择理由 公司介绍 …

django celery 异步任务 异步存储

环境:win11、python 3.9.2、django 4.2.11、celery 4.4.7、MySQL 8.1、redis 3.0 背景:基于django框架的大量任务实现,并且需要保存数据库 时间:20240409 说明:异步爬取小说,并将其保存到数据库 1、创建…

C++11:function包装器

包装器,体现了C11中的封装性,包装器可以应用于:函数指针,仿函数,lambda 而包装器function的出现刚好也弥补了上述三种语法的不足之处 函数指针写起来较为复杂,而仿函数之间类型不同,lambda则在…