历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2018年04月22日 | STM32F407的UDP发送数据

2018-04-22 来源:eefocus

探究WaveShare的F407的板子好几天了,这两天一直止步于网卡模块的udp发包,因为截包工具总是收不到我代码里面发出去的数据包,我的要求是只发特定数据,不管收到的数据包


记录下整个测试过程,以便以后翻阅


使用开发板自带的例程,udp_echo_server的例子,在此基础上修改,main函数是


int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured to 
       168 MHz, this is done through SystemInit() function which is called from
       startup file (startup_stm32f4xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f4xx.c file
     */
#ifdef SERIAL_DEBUG
  DebugComPort_Init();
#endif


  
  /*Initialize LCD and Leds */ 
  LCD_LED_Init();
  
  /* configure ethernet */ 
  ETH_BSP_Config();
    
  /* Initilaize the LwIP stack */
  LwIP_Init();
  
  /* UDP echoserver */
  udp_echoserver_init();
  
  
  /* Infinite loop */
  while (1)
  {  
    
    /* check if any packet received */
    if (ETH_CheckFrameReceived())
    { 
      /* process received ethernet packet */
      LwIP_Pkt_Handle();
    }
    /* handle periodic timers for LwIP */
    LwIP_Periodic_Handle(LocalTime);
  }   
}


我发现串口不能用,可能是其初始化方式有些问题,我做了些修改

将DebugComPort_Init函数改成下面两个函数

  USART_Configuration();
USART_NVIC_Config();

串口1就可以正常使用了

void USART_Configuration(void)

  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure; 


  RCC_AHB1PeriphClockCmd(Open_USART_TX_GPIO_CLK,ENABLE);
  RCC_AHB1PeriphClockCmd(Open_USART_RX_GPIO_CLK,ENABLE);


  #ifdef USART1_OPEN
  RCC_APB2PeriphClockCmd(Open_USART_CLK,ENABLE);
  #else
  RCC_APB1PeriphClockCmd(Open_USART_CLK,ENABLE);
  #endif




  GPIO_PinAFConfig(Open_USART_TX_GPIO_PORT, Open_USART_TX_SOURCE, Open_USART_TX_AF);
  GPIO_PinAFConfig(Open_USART_RX_GPIO_PORT, Open_USART_RX_SOURCE, Open_USART_RX_AF);


  /*
  *  Open_USART_TX -> PA9 , Open_USART_RX -PA10
  */
  GPIO_InitStructure.GPIO_Pin = Open_USART_TX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(Open_USART_TX_GPIO_PORT, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = Open_USART_RX_PIN;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(Open_USART_RX_GPIO_PORT, &GPIO_InitStructure);


/*
    USARTx configured as follow:
         - BaudRate = 115200 baud  
- Word Length = 8 Bits
         - One Stop Bit
         - No parity
         - Hardware flow control disabled (RTS and CTS signals)
         - Receive and transmit    
 */


  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(Open_USART, &USART_InitStructure);
  /* Enable the Open_USART Transmit interrupt: this interrupt is generated when the 
     Open_USART transmit data register is empty */
  USART_ITConfig(Open_USART,USART_IT_RXNE,ENABLE);


  USART_Cmd(Open_USART, ENABLE);


}


void USART_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;


  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = Open_USART_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


然后将udp_echoserver_init();注释掉

在while(1)里面添加一下函数

 udp_send_data(udp_data, sizeof(udp_data));

代码是

unsigned char udp_data[]= "hello world!";

void udp_send_data(uint8_t* pData, uint16_t len)
{
   struct udp_pcb *upcb;
   struct pbuf* buff;
   struct ip_addr ipaddr;
   err_t err;
  
   buff = pbuf_alloc(PBUF_TRANSPORT, 1024, PBUF_ROM);
  buff->payload = pData;
  buff->len = len;
  buff->tot_len = len;

   upcb = udp_new();//建立一个新的UDP包
   udp_bind(upcb, IP_ADDR_ANY, 7);
   IP4_ADDR(&ipaddr, 192, 168, 1, 11); //切记,此处的IP是PC的IP,因为使用PC的截包软件接收
    
  
     err = udp_connect(upcb, &ipaddr, 7);

    if(err == ERR_OK)
    {
       err = udp_send(upcb, buff);
      if(ERR_IS_FATAL(err))
        printf("udp_send...%d\r\n",err);
    }
    
   udp_disconnect(upcb);
   pbuf_free(buff);
   udp_remove(upcb);
}


最终main函数是

int main(void)
{

  USART_Configuration();
  USART_NVIC_Config();


  
  /*Initialize LCD and Leds */ 
  LCD_LED_Init();
  
  /* configure ethernet */ 
  ETH_BSP_Config();
    
  /* Initilaize the LwIP stack */
  LwIP_Init();
  
  /* UDP echoserver */
  //udp_echoserver_init();
  
  
  /* Infinite loop */
  while (1)
  {  
     udp_send_data(udp_data, sizeof(udp_data));
     //Delay(100);    
    /* check if any packet received */
    if (ETH_CheckFrameReceived())
    { 
      /* process received ethernet packet */
      LwIP_Pkt_Handle();
    }
    /* handle periodic timers for LwIP */
    LwIP_Periodic_Handle(LocalTime);
  }   
}


注意

udp_send_data函数里面的ip,一开始我就是因为把此处的IP设置成开发板的IP了,后来就没想到是这出了问题,所以截包工具一直截不到数据,后来单步调试,发现udp_recv的回调函数udp_echoserver_receive_callback的结构体udp_pcb的upcb的remote_ip一直是PC端的IP才想起来是这个问题


推荐阅读

史海拾趣

ECI公司的发展小趣事

ECI公司深知人才是企业发展的关键因素。因此,公司高度重视人才的引进、培养和激励。公司建立了完善的人才选拔机制,选拔具有潜力和才华的员工进行重点培养。同时,公司还提供了丰富的培训和发展机会,帮助员工提升自身素质和能力。此外,ECI还建立了科学合理的薪酬制度和激励机制,让员工在为公司创造价值的同时也能获得相应的回报。这种对人才的重视和投入让ECI公司汇聚了一批优秀的员工队伍,为公司的发展提供了有力的保障。

Atlanta Micro公司的发展小趣事

近年来,电子行业经历了快速的发展和变革,新技术、新产品层出不穷。面对这一形势,Atlanta Micro积极应对挑战,不断调整战略和业务模式。公司加强了与产业链上下游企业的合作,共同应对市场变化;同时,也加大了对新兴技术的研发投入,力求在新技术领域取得突破。这些努力使得Atlanta Micro在激烈的市场竞争中保持了稳健的发展态势。

以上便是关于Atlanta Micro在电子行业发展的5个故事。这些故事展示了公司从创业初期到逐渐发展壮大的过程,以及面对挑战和变革时所采取的应对策略。虽然这些故事只是公司发展历程中的一部分,但它们足以体现出Atlanta Micro在电子行业中的坚韧和拼搏精神。

Hoffman_Enclosures__Inc.公司的发展小趣事

Hoffman始终将技术创新视为企业发展的核心驱动力。公司不断投入研发资源,致力于开发更加高效、节能、环保的电气机柜和温控产品。其中,数据中心液体冷却技术的推出,更是引领了行业潮流。Hoffman还积极参与国际标准的制定工作,通过遵循和践行全球行业标准,确保产品的通用性和高质量。这些努力不仅提升了公司的技术实力,也进一步巩固了其在行业内的领先地位。

FILTRONIC公司的发展小趣事

随着市场需求的不断增长,FILTRONIC开始着手拓展产品线,从单一的滤波器产品扩展到包括射频模块、天线等在内的多种无线通信产品。同时,公司也积极实施国际化战略,通过参加国际展会、设立海外办事处等方式,逐步打开了国际市场的大门。FILTRONIC的产品以其卓越的性能和可靠的质量赢得了全球客户的信赖,公司也因此实现了业务的快速增长。

BULGIN公司的发展小趣事

在1939年至1945年的二战期间,BULGIN的产能被英国政府全面征用。为了满足战时需求,BULGIN公司开发出能够适应全世界各地区苛刻使用环境的产品。在这段时间里,公司为英国政府制造了超过1千万只零部件,并在密封技术领域积累了宝贵的经验,这些经验一直延续至今。

Azoteq公司的发展小趣事

最近,Azoteq宣布推出了一款电容、电感和霍尔效应组合传感器——IQS620。这款传感器是传感领域的重大突破,它将电容式触摸和接近传感、电感传感以及霍尔效应传感集成在一个低姿态的封装中。这种高度集成化的设计使得IQS620在可穿戴设备、移动设备和安全等多个领域都有广泛的应用前景。IQS620的推出,不仅展示了Azoteq在传感技术方面的深厚实力,也为其在未来的市场竞争中注入了新的活力。

这些故事展示了Azoteq公司在电子行业中的发展历程和取得的成就。从创立初期的LightSense™系列产品,到后续的电容式触摸和接近感应市场拓展,再到PowerSense™和ProxFusion®产品系列的推出,以及最新的IQS620传感器的发布,Azoteq始终紧跟市场趋势,不断创新,为客户提供高质量的半导体解决方案。

问答坊 | AI 解惑

A/D转换

老师我们的硬件电路做好了,但软件不知道从何入手呢…

查看全部问答>

硬盘被重新分区后重装了系统,如何恢复里面的数据啊!跪求!!

  硬盘被重新分区后重装了系统,如何恢复里面的数据啊!跪求!!急!…

查看全部问答>

请教关于ARM启动代码中堆栈的初始化?

启动代码中堆栈的初始化是不是只是定义一下要用到的堆的长度,比如IRQ中断,按书上说堆空间是要自己申请的,而栈是系统自动分配的,要是这样的话那初始化就应该是只对堆的长度进行定义了?还有就是我怎么确定要定义多长的堆栈空间呢?谢谢了!…

查看全部问答>

大家帮我看看,我用厂家提供的BSP生成的OS 在开发板上无法启动,有详细信息,该如何修改

下面的情况均在厂家提供的开发板上试验 内存情况:       内存:64MByte SDRAM(2片16位的SDRAM芯片组成32位接口)       NOR Flash:32MByte内存(2片intel E28F128组成32位接口) 测试的BSP有下面两个 ...…

查看全部问答>

请问“要通过中断来实时接收100ms的数据”,这个机制怎么建立阿

我最近想做一个红外码学习器,在按下遥控按钮后,就把接收到的红外数据保存下来。但是,在多进程里面由于有调度问题,实时性很难控制,不知哪位高手做过没有,请帮忙指点一下阿…

查看全部问答>

快过年了,希望eeworld能组织个TI DSP开发板的团购!

快过年了,还有点余钱,希望eeworld能组织个TI DSP开发板的团购,这样在假期中能够边玩边学,两不误。 希望有相同想法的同学们顶起!!!!!!!!!!…

查看全部问答>

Kinetis DAC模块

DAC简介    Kinetis10包含两个独立的12位数模转换模块,DAC0和DAC1,用于将数字转换成对应的模拟电压。转换后的模拟电压可由外部引脚输出,也可以通过芯片内部连接输入到比较器模块、放大器模块、和模数转换模块。    DAC的参 ...…

查看全部问答>

通过使用MSP430G2452微控制器的LaunchPad Value Line开发包实现基于心电图的心率监测

这是一个基于Launchpad的心率监测评估工程,资料非常详细,包括原理图,光绘文件,BOM表,源码,说明文档(中文)。 好好享受吧! …

查看全部问答>

电源变换

信号输入端加10V交流信号,偏置为5V直流,经电容电阻后怎么变为了正负5V的交流信号,求高手解释…

查看全部问答>