[蓝牙芯片] 【沁恒蓝牙SOC—CH579M篇】以太网例程-DHCP测评

[复制链接]
 楼主| abner_ma 发表于 2025-6-18 18:43 | 显示全部楼层 |阅读模式
  在CH57x系列微控制器功能框图:
B1.png
一、DHCP功能概述
   动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种基于客户端-服务器架构的网络管理协议,用于自动分配IP地址及其他网络配置参数,允许服务器向客户端动态分配IP地址、子网掩码、网关和DNS服务器等网络配置信息。在CH57x系列微控制器中,通过配置和启动DHCP客户端,可以自动从网络中的DHCP服务器获取这些配置信息,从而简化网络配置过程。
二、DHCP功能实现步骤
1. 初始化网络库:
    在使用DHCP功能之前,需要初始化CH57xNET库,配置MAC地址、缓冲区等。
2. 启动DHCP客户端:
    调用`CH57xNET_DHCPStart`函数启动DHCP客户端,并设置回调函数处理DHCP事件。
3. 处理DHCP回调:
    在DHCP回调函数中,根据DHCP的状态(如成功获取IP地址、失败等)执行相应的操作。例如,成功获取IP地址后,可以打印日志或进行后续网络操作。
程序设计:
  1. #include "main.h"
  2. #include "CH57x_common.h"
  3. #include "uart.h"
  4. #include "time.h"

  5. #include "net_init.h"


  6. __align(4) UINT8  RxBuffer[ MAX_PACKET_SIZE ];  // IN, must even address
  7. __align(4) UINT8  TxBuffer[ MAX_PACKET_SIZE ];  // OUT, must even address
  8.                                                                                
  9. //缓存数据使用
  10. unsigned char main_buffer[main_buffer_len];//缓存数据,全局通用
  11. uint32_t  main_len;      //全局通用变量
  12. unsigned char *main_str;    //全局通用变量


  13. void uart0_data(void);//串口数据处理


  14. char net_phy_state=0;

  15. UINT8 net_dhcp_ip[4];   /* CH579IP地址 */
  16. UINT8 net_dhcp_gw[4];   /* CH579网关 */
  17. UINT8 net_dhcp_mask[4]; /* CH579子网掩码 */


  18. /*******************************************************************************
  19. * Function Name  : CH57xNET_DHCPCallBack
  20. * Description    : DHCP回调函数
  21. * Input          : None
  22. * Output         : None
  23. * Return         : 执行状态
  24. *******************************************************************************/
  25. UINT8 CH57xNET_DHCPCallBack(UINT8 status,void *arg)
  26. {
  27.         UINT8 *p;
  28.         if(!status){/* 成功*/
  29.                 p = arg;
  30.                 PRINT("DHCP Success\n");
  31.                 memcpy(net_dhcp_ip,p,4);//获取分配的IP地址
  32.                 memcpy(net_dhcp_gw,&p[4],4);//获取网关
  33.                 memcpy(net_dhcp_mask,&p[8],4);//获取子网掩码
  34.                 printf("IPAddr = %d.%d.%d.%d \r\n",(UINT16)net_dhcp_ip[0],(UINT16)net_dhcp_ip[1],(UINT16)net_dhcp_ip[2],(UINT16)net_dhcp_ip[3]);
  35.                 printf("GWIPAddr = %d.%d.%d.%d \r\n",(UINT16)net_dhcp_gw[0],(UINT16)net_dhcp_gw[1],(UINT16)net_dhcp_gw[2],(UINT16)net_dhcp_gw[3]);
  36.                 printf("IPAddr = %d.%d.%d.%d \r\n",(UINT16)net_dhcp_mask[0],(UINT16)net_dhcp_mask[1],(UINT16)net_dhcp_mask[2],(UINT16)net_dhcp_mask[3]);
  37.                 printf("DNS1: %d.%d.%d.%d\r\n",p[12],p[13],p[14],p[15]);
  38.                 printf("DNS2: %d.%d.%d.%d\r\n",p[16],p[17],p[18],p[19]);
  39.         }
  40.         else{/* 产生此中断,CH57xNET库内部会将此socket清除,置为关闭*/
  41.                 PRINT("DHCP Fail %02x\n",status);
  42.         }                                                      
  43.         return 0;
  44. }

  45. int main()
  46. {
  47.         int i;
  48.         PWR_UnitModCfg(ENABLE, UNIT_SYS_PLL);//使能PLL(给以太网提供时钟)                              
  49.         DelayMs(3);
  50. //    SetSysClock(CLK_SOURCE_HSE_32MHz);/* 外部晶振 PLL 输出32MHz */
  51.         uart_init();//初始化串口
  52.         net_init();//初始化以太网
  53.         time0_init();//初始化定时器
  54.         printf("start\r\n");
  55.         while(1)
  56.         {
  57.                 CH57xNET_MainTask();/* CH57xNET库主任务函数,需要在主循环中不断调用 */
  58.                
  59.                 if(net_phy_state != CH57xInf.PHYStat){//网线连接状态改变
  60.                         net_phy_state = CH57xInf.PHYStat;
  61.                         if(net_phy_state==2){//连接
  62.                                 printf("net_phy_connected\r\n");
  63.                                 CH57xNET_DHCPStart(CH57xNET_DHCPCallBack);/* 启动DHCP */
  64.                         }
  65.                         else{//断开
  66.                                 printf("net_phy_disconnected\r\n");
  67.                                 CH57xNET_DHCPStop();//关闭DHCP
  68.                         }
  69.                 }
  70.         }
  71. }


  72. /**
  73. * [url=home.php?mod=space&uid=247401]@brief[/url]   串口数据处理
  74. * @param   None
  75. * @retval  None
  76. * [url=home.php?mod=space&uid=157211]@warning[/url] None
  77. * @example
  78. **/
  79. void uart1_data(void)
  80. {
  81.         //读取串口接收的数据
  82.         if(usart1_idle_flag){
  83.                 usart1_idle_flag=0;
  84.                
  85.                 /*获取模组返回的数据*/
  86.                 main_len = rbCanRead(&rb_t_usart1_read);
  87.                 memset(usart1_read_buff_copy,0,rb_t_usart1_read_buff_len);
  88.                 if(main_len > 0)//如果里面的数据个数大于0
  89.                 {
  90.                         rbRead(&rb_t_usart1_read, usart1_read_buff_copy, main_len);
  91.                        
  92.                 }
  93.         }
  94. }

B2.png
初始化:需要初始化CH57xNET库,配置MAC地址、缓冲区等。
启动DHCP:调用CH57xNET_DHCPStart函数启动DHCP客户端,并设置回调函数处理DHCP事件。
回调处理:在DHCP回调函数中,处理DHCP成功或失败的情况,例如获取到IP地址后,可以打印日志或进行后续网络操作。
处理DHCP交互流程
发现阶段:设备发送DHCP DISCOVER请求IP地址。
提供阶段:服务器返回DHCP OFFER,包含IP、子网掩码、网关等参数。
请求阶段:设备发送DHCP REQUEST确认选择。
确认阶段:服务器返回DHCP ACK,完成IP分配。
超时与重试机制
若未收到响应,设备通过定时器超时后重新发送DHCP DISCOVER,直至成功或达到最大重试次数。
结果:
BB.png


三、DHCP功能实现中的注意事项
1. 网络稳定性:
    确保网络连接稳定,避免因网络波动导致DHCP请求失败。
    可以加入看门狗逻辑,防止设备因异常而死机。
2. DHCP服务器配置:
    检查DHCP服务器是否正常运行,并确保有足够的IP地址可供分配。
    如果网络中使用了DHCP中继,需要检查中继设备是否正常工作。
3. MAC地址处理:
    某些路由器可能对MAC地址有特殊要求,可以尝试修改MAC地址的前几字节以避免冲突。
4. 重连机制:
    在网络断开或DHCP失败时,需要实现重连机制。这通常涉及关闭原先的Socket、重新初始化网络库(如果需要)、重新启动DHCP客户端等步骤。
5. 错误处理:
    在DHCP回调函数中,需要处理各种可能的错误情况,如DHCP服务器无响应、IP地址分配失败等。
四、DHCP功能优化
1. 超时设置:
    调整DHCP的超时时间,避免长时间等待。
2. 日志记录:
    在DHCP回调函数中加入日志记录功能,方便调试和排查问题。
3. 电源稳定性:
    确保设备的电源稳定,避免因电源波动导致网络异常。

灵犀幻影 发表于 2025-7-7 10:37 | 显示全部楼层
这个DHCP例程很详细,对于CH57x系列微控制器来说,自动获取网络配置参数确实能简化很多工作。
不想起床喵星人 发表于 2025-7-16 09:01 | 显示全部楼层
这个DHCP例程非常详细,对于CH57x系列微控制器来说,自动配置网络参数是个很大的便利。
迷雾隐者 发表于 2025-7-16 19:29 | 显示全部楼层
这个帖子很详细地介绍了CH57x系列微控制器中DHCP功能的实现步骤和注意事项,对于嵌入式开发者来说非常有用。
AuroraWaltz 发表于 2025-7-19 13:02 | 显示全部楼层
这个DHCP例程很详细,介绍了CH57x系列微控制器中DHCP功能的实现步骤和注意事项。
WispOfReverie 发表于 2025-7-23 16:18 | 显示全部楼层
这个DHCP例程非常详细,自动获取网络配置参数确实能简化很多工作
魔法森林精灵 发表于 2025-7-25 10:30 | 显示全部楼层
这个DHCP实现步骤很详细,对于CH57x系列微控制器来说,自动配置网络参数确实能简化很多工作。
Teardrop 发表于 2025-8-16 14:36 | 显示全部楼层
魔法森林精灵 发表于 2025-7-25 10:30
这个DHCP实现步骤很详细,对于CH57x系列微控制器来说,自动配置网络参数确实能简化很多工作。
...

是的确实是一份很详细的以太网例程-DHCP测评!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

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