单片机
返回首页

使用STM32CubeMX创建基于FreeRTOS的lwIP工程

2019-07-24 来源:eefocus

硬件平台:STM32F407VE+DP83848开发板

STM32CubeMX配置:


在Peripherals中ETH的模式选择RMII,在Middlewares中勾选FREERTOS和LWIP,见下图:

在这里插入图片描述

依据硬件环境自行对时钟进行配置,此处略。在LWIP Configuration中对lwIP进行相应的配置,将LWIP_DHCP设为Disable,IP_ADDRESS设为192.168.1.7,NETMASK_ADDRESS设为255.255.255.0,GATEWAY_ADDRESS设为192.168.1.1,见下图:

在这里插入图片描述

在FREERTOS Configuration中新建两个任务,myTaskLED用作控制LED灯的闪烁指示系统运行,myTaskTcpEcho用作TCP服务器,当接收到客户端发来的数据后,把接收到的数据原样返回。注意,myTaskTcpEcho的优先级需较低,以免堵塞其他任务的正常执行,在此Priority设为osPriorityLow,还有就是分配足够的空间以满足任务的执行,在此Stack Size设为1024。见下图:

在这里插入图片描述

最后点击Generate Code生成工程,工程生成后需要将stm32f407xx.h中的宏定义__NVIC_PRIO_BITS由4U改为4,否则编译将会报错。

编译成功后将程序下载至开发板,开发板和电脑用网线直连,至此,在命令行中键入ping 192.168.1.7就可以测试开发板的以太网通讯连接是否正常。另外,参考LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers (AN3966)将开发板配置为TCP服务器,服务器IP为192.168.1.7,端口为7,当接收到客户端发来的数据后,把接收到的数据原样返回。测试效果,见下图:

在这里插入图片描述

通过将AN3966配套的例程代码添加至taskTcpEcho中即可实现上述功能,代码如下:

void taskTcpEcho(void const * argument)

{

  /* USER CODE BEGIN taskTcpEcho */

  struct netconn *conn, *newconn;

  err_t err, accept_err;

  struct netbuf *buf;

  void *data;

  u16_t len;

  err_t recv_err;


  LWIP_UNUSED_ARG(argument);


  /* Create a new connection identifier. */

  conn = netconn_new(NETCONN_TCP);


  if (conn!=NULL)

  {  

    /* Bind connection to well known port number 7. */

    err = netconn_bind(conn, NULL, 7);


    if (err == ERR_OK)

    {

      /* Tell connection to go into listening mode. */

      netconn_listen(conn);


      while (1) 

      {

        /* Grab new connection. */

        accept_err = netconn_accept(conn, &newconn);


        /* Process the new connection. */

        if (accept_err == ERR_OK) 

        {

          recv_err = netconn_recv(newconn, &buf);

          while ( recv_err == ERR_OK) 

          {

            do

            {

              netbuf_data(buf, &data, &len);

              netconn_write(newconn, data, len, NETCONN_COPY);

            }

            while (netbuf_next(buf) >= 0);


            netbuf_delete(buf);

            recv_err = netconn_recv(newconn, &buf);

          }


          /* Close connection and discard connection identifier. */

          netconn_close(newconn);

          netconn_delete(newconn);

        }

      }

    }

    else

    {

      netconn_delete(newconn);

      printf(' can not bind TCP netconn');

    }

  }

  else

  {

    printf('can not create TCP netconn');

  }

  /* USER CODE END taskTcpEcho */

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章