[STM32F7] NUCLEOF767测试之网络DHCP

[复制链接]
1943|2
 楼主| netlhx 发表于 2016-7-30 10:37 | 显示全部楼层 |阅读模式
第一个测试程序中跑了个COREMARK,不尽与人意。

今天来跑个DHCP网络测试。

MCU内置ETH设备,同是开发板上配备 PHY LAN8742A-CZ-TR (U9) 及RJ45 connector (CN14),所以网络功能是妥妥的。官方连接原理图


2016-07-30_101504.png

在STM32CUBEMX上的PIN设置应该参考这个图,不要使用默认的配置,因为很多PIN都是可以复用的。

2016-07-30_101707.png

接下就是简单的配置,基本不需要修改,不过要注意,PHY的默认地址,在CUBEMX中配置为1,实际上需要修改为0。

程序基本框架如果是用CUBEMX来生成的话,基本不需要修改。只是本人测试的时候,不知道是不是路由器的原因,使用DHCP来获取IP地址的时候,基本上不能一次性获取成功,需要反复尝试几次才能获取成功。所以最佳的使用方式还是结合RTOS来多试几次,一般不超过5次为宜。

  1. void MX_LWIP_Init(void)
  2. {
  3.   /* Initilialize the LwIP stack with RTOS */
  4.   tcpip_init( NULL, NULL );

  5.   /* IP addresses initialization with DHCP (IPv4) */
  6.   ipaddr.addr = 0;
  7.   netmask.addr = 0;
  8.   gw.addr = 0;

  9.   /* add the network interface (IPv4/IPv6) with RTOS */
  10.   netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);

  11.   /* Registers the default network interface */
  12.   netif_set_default(&gnetif);

  13.   if (netif_is_link_up(&gnetif))
  14.   {
  15.     /* When the netif is fully configured this function must be called */
  16.     netif_set_up(&gnetif);
  17.   }
  18.   else
  19.   {
  20.     /* When the netif link is down this function must be called */
  21.     netif_set_down(&gnetif);
  22.   }

  23.   /* Start DHCP negotiation for a network interface (IPv4) */
  24.   dhcp_start(&gnetif);

  25. /* USER CODE BEGIN 3 */

  26. /* USER CODE END 3 */
  27. }
  28. /* USER CODE BEGIN 4 */


这里是从初始化ETH硬件到获取DHCP地址的完整代码,只是如果仅仅是这样的话,很难一次性获取代码成功。参考官方例程中,也是使用了一个专门的任务来获取IP地址,所以没办法,还是结合RTOS一起来使用吧。再者LWIP如果要使用高级API如NETCONN及SOCKET来使用网络的话,由于这些API都是顺序类型的API,所以要实现非阻塞效果,也是必须要使用RTOS来支持的。

下面是获取DHCP的线程代码

  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]  DHCP Process
  3. * @param  argument: network interface
  4. * @retval None
  5. */
  6. void StartDHCPTask(void const * argument)
  7. {
  8.   struct netif *netif = (struct netif *) argument;
  9.   ip_addr_t ipaddr;
  10.   ip_addr_t netmask;
  11.   ip_addr_t gw;
  12.   uint32_t IPaddress;
  13.   
  14.   for (;;)
  15.   {
  16.     switch (DHCP_state)
  17.     {
  18.     case DHCP_START:
  19.       {
  20.         netif->ip_addr.addr = 0;
  21.         netif->netmask.addr = 0;
  22.         netif->gw.addr = 0;
  23.         IPaddress = 0;
  24.         dhcp_start(netif);
  25.         DHCP_state = DHCP_WAIT_ADDRESS;
  26.       }
  27.       break;
  28.       
  29.     case DHCP_WAIT_ADDRESS:
  30.       {
  31.         /* Read the new IP address */
  32.         IPaddress = netif->ip_addr.addr;
  33.         
  34.         if (IPaddress!=0)
  35.         {
  36.           DHCP_state = DHCP_ADDRESS_ASSIGNED;       
  37.          
  38.           /* Stop DHCP */
  39.           dhcp_stop(netif);

  40.         }
  41.         else
  42.         {
  43.           /* DHCP timeout */
  44.           if (netif->dhcp->tries > 3)
  45.           {
  46.             DHCP_state = DHCP_TIMEOUT;
  47.             
  48.             /* Stop DHCP */
  49.             dhcp_stop(netif);
  50.             
  51.             /* Static address used */
  52.             IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
  53.             IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
  54.             IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
  55.             netif_set_addr(netif, &ipaddr , &netmask, &gw);

  56.             
  57.           }
  58.           else
  59.           {

  60.           }
  61.         }
  62.       }
  63.       break;
  64.       
  65.     default: break;
  66.     }
  67.    
  68.     /* wait 250 ms */
  69.     osDelay(250);
  70.   }
  71. }  


这里将最大尝试次数设为5,如果DHCP获取不成功,则按指定的STATIC IP地址来设置,如果STATIC IP的指定如下

  1. /*Static IP ADDRESS*/
  2. #define IP_ADDR0   192
  3. #define IP_ADDR1   168
  4. #define IP_ADDR2   99
  5. #define IP_ADDR3   10
  6.    
  7. /*NETMASK*/
  8. #define NETMASK_ADDR0   255
  9. #define NETMASK_ADDR1   255
  10. #define NETMASK_ADDR2   255
  11. #define NETMASK_ADDR3   0

  12. /*Gateway Address*/
  13. #define GW_ADDR0   192
  14. #define GW_ADDR1   168
  15. #define GW_ADDR2   99
  16. #define GW_ADDR3   1


具体在使用的时候,根据连接的路由器设置不同。下面是调试的结果

2016-07-30_102738.png

DHCP尝试的次数

2016-07-30_102818.png


从这里可以看到,一次性获取IP地址成功。


另外如果要监测网络的状态变化,最好另外准备一个线程,当网络接口状态发生改变时,自行调整IP地址设备等。

下一个任务准备测试WEB SERVER,以实现RESTFULL WEB服务。






 楼主| netlhx 发表于 2016-7-30 10:40 | 显示全部楼层
沙发是自己的
mmuuss586 发表于 2016-7-30 10:50 | 显示全部楼层

不错,支持下;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

144

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部