STM32F407+FreeRTOS+LWIP UDP组播

开发环境介绍:

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 );
	}
}

组播发送消息:

objectivec 复制代码
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);
  }
}
相关推荐
国科安芯10 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
梁朝辉15 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
崇山峻岭之间17 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious17 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng21 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计1 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32
wuyk5551 天前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机