当前位置:   article > 正文

STM32CubeMX+STM32F407+FreeRTos+LAN8720 以太网通信实现数据收发功能_stm32f407 udp

stm32f407 udp

目录

前言

一、STM32CubeMX配置

二、修改代码

三、硬件测试

总结

前言

该工程应用的以太网芯片是LAN8720,代码是基于STM32CUbeMx6.2.1配置生成的,在CubeMx中配置了ETH和LWIP,还有串口1和FREERTOS,最后通过创建任务函数实现udp的以太网数据收发功能。在测试中,可以在电脑的DOS窗口ping通在LWIP设置的单片机开发板的ip地址,通过网络调试助手可以实现数据的收发功能。

一、STM32CubeMX配置

1、选择STM32F407VET6芯片创建工程,首先配置RCC和SYS,再配置时钟,配置界面如下

 

 2、配置ETH,配置界面如下

  3、配FREERTOS和LWIP,配置界面如下

4、分配中断优先级,配置界面如下(如果需配置串口,先配置一下串口)

5、到这里,CubeMX就算配置完成了,就可以生成代码了

二、修改代码

1、打开生成的工程文件,找到HAL_ETH_MspInit函数,在最下面添加芯片复位的三行代码(作用是在芯片初始化时,对芯片复位一下,该芯片复位引脚对应我单片机开发板上的PA3)

2、在main.c中添加修改函数,首先是包含的文件,然后是创建任务函数,

  1. #include "main.h"
  2. #include "cmsis_os.h"
  3. #include "lwip.h"
  4. #include "usart.h"
  5. #include "gpio.h"
  6. /* Private includes ----------------------------------------------------------*/
  7. /* USER CODE BEGIN Includes */
  8. #include "stdio.h"
  9. #include "udp_echoserver.h"
  10. /* USER CODE END Includes */
  1. /* USER CODE BEGIN 0 */
  2. void controlTask(void * param)
  3. {
  4. MX_LWIP_Init();
  5. vTaskDelete( NULL );
  6. }
  7. void commandTask(void * param)
  8. {
  9. udp_echoserver_init();
  10. while(1)
  11. {
  12. vTaskDelay(2);
  13. }
  14. }
  15. TaskHandle_t StartTaskHandle;
  16. void StartTask(void * arg)
  17. {
  18. taskENTER_CRITICAL();
  19. xTaskCreate(controlTask, "controlTask", 200,NULL,4,NULL);
  20. xTaskCreate(commandTask, "commandTask", 200,NULL,4,NULL);
  21. vTaskDelete(StartTaskHandle);
  22. taskEXIT_CRITICAL();
  23. }
  24. /* USER CODE END 0 */
  25. /**
  26. * @brief The application entry point.
  27. * @retval int
  28. */
  29. int main(void)
  30. {
  31. /* USER CODE BEGIN 1 */
  32. /* USER CODE END 1 */
  33. /* MCU Configuration--------------------------------------------------------*/
  34. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  35. HAL_Init();
  36. /* USER CODE BEGIN Init */
  37. /* USER CODE END Init */
  38. /* Configure the system clock */
  39. SystemClock_Config();
  40. /* USER CODE BEGIN SysInit */
  41. /* USER CODE END SysInit */
  42. /* Initialize all configured peripherals */
  43. MX_GPIO_Init();
  44. MX_USART1_UART_Init();
  45. /* USER CODE BEGIN 2 */
  46. printf("³õʼ»¯Íê±Ï");
  47. xTaskCreate(StartTask,"commanderTask",200,NULL,2,&StartTaskHandle);
  48. vTaskStartScheduler();
  49. /* USER CODE END 2 */
  50. /* Call init function for freertos objects (in freertos.c) */
  51. MX_FREERTOS_Init();
  52. /* Start scheduler */
  53. osKernelStart();
  54. /* We should never get here as control is now taken by the scheduler */
  55. /* Infinite loop */
  56. /* USER CODE BEGIN WHILE */
  57. while (1)
  58. {
  59. /* USER CODE END WHILE */
  60. /* USER CODE BEGIN 3 */
  61. }
  62. /* USER CODE END 3 */
  63. }

2、此时在电脑上是能够PING通在CubeMx中配置的ip地址的,如果需要实现udp数据收发功能,还需要创建功能文件,代码如下

  1. void udp_echoserver_init(void)
  2. {
  3. struct udp_pcb *upcb;
  4. err_t err;
  5. /* Create a new UDP control block */
  6. upcb = udp_new();
  7. if (upcb)
  8. {
  9. /* Bind the upcb to the UDP_PORT port */
  10. /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
  11. err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
  12. if(err == ERR_OK)
  13. {
  14. /* Set a receive callback for the upcb */
  15. udp_recv(upcb, udp_echoserver_receive_callback, NULL);
  16. }
  17. else
  18. {
  19. udp_remove(upcb);
  20. // printf("can not bind pcb");
  21. }
  22. }
  23. else
  24. {
  25. // printf("can not create pcb");
  26. }
  27. }
  1. uint8_t receivebuf[30] = {0};
  2. //uint8_t send_buf[2] = {0x01,0x02};
  3. uint8_t send_buf[] = "ÒѾ­ÊÕµ½Êý¾Ý";
  4. int receivelen = 0;
  5. void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p,const struct ip4_addr *addr, u16_t port)
  6. {
  7. struct pbuf *pq; //´´½¨Ò»¸ö½á¹¹Ìå±äÁ¿
  8. receivelen = p->len;
  9. memcpy(receivebuf,p->payload,p->len);//p->payloadÖ¸½ÓÊÕµ½µÄʵ¼ÊÊý¾Ý£pp->lenÊÇÖ¸½ÓÊÕµ½µÄÊý¾Ý³¤¶È£»£»½«p±äÁ¿½ÓÊÕµ½µÄÊý¾Ý¸´ÖƵ½receivebufÀïÃæ
  10. pbuf_free(p);//ÊÍ·Åp
  11. udp_connect(upcb, addr, UDP_CLIENT_PORT); //½¨Á¢udpÁ¬½Ó
  12. pq = pbuf_alloc(PBUF_TRANSPORT,14,PBUF_POOL);//allocate memory 14Ï൱ÓÚ·ÖÅä14¸ö×Ö½Ú
  13. pbuf_take(pq,(char*)receivebuf,14);//copy data to buf
  14. udp_send(upcb,pq);//send udp data
  15. memset(receivebuf,0x00,30); //Çå³ý»º´æ
  16. udp_disconnect(upcb);
  17. pbuf_free(pq);
  18. // /* Connect to the remote client */
  19. // udp_connect(upcb, addr, UDP_CLIENT_PORT);
  20. //
  21. // /* Tell the client that we have accepted it */
  22. // udp_send(upcb, p);
  23. // /* free the UDP connection, so we can accept new clients */
  24. // udp_disconnect(upcb);
  25. //
  26. // /* Free the p buffer */
  27. // pbuf_free(p);
  28. }

三、硬件测试

1、用网线将开发板和电脑网口连接上,配置电脑的ip地址,然后可以在电脑的DOS串口ping通开发板的IP地址,测试界面如下

2、用网线将开发板和电脑网口连接上,打开网络调试助手,测试数据收发功能

总结

以上是我对LAN8720以太网芯片的应用,希望对大家有帮助

整个工程代码下载:https://download.csdn.net/download/weixin_64705314/87672487?spm=1001.2014.3001.5503

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/743244
推荐阅读
相关标签
  

闽ICP备14008679号