單芯片解決方案,開啟全新體驗——W55MH32高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第二章 W55MH32 DHCP示例
本篇文章我們將詳細講解DHCP協議的基本信息、優勢特點、工作原理、應用場景,并通過實戰例程,為大家講解如何使用W55MH32動態獲取IP信息,幫助讀者更好地了解并運用這一協議。
有關W55MH32的初始化過程,請參考相關章節,這里將不再詳述。
1 DHCP協議簡介
DHCP(Dynamic Host Configuration Protocol)即動態主機配置協議,是一個應用層協議。它主要用于在 IP網絡中為客戶端自動分配 IP地址及其他相關網絡配置參數,如子網掩碼、默認網關、DNS服務器地址等。這種動態分配的方式大大簡化了網絡管理員的工作,并且能夠更有效地利用有限的 IP地址資源。
2 DHCP協議特點
便捷配置與管控:DHCP可自動分配IP地址、子網掩碼、網關、DNS等網絡參數,設備入網即自動獲取,用戶無需手動操作。管理員能通過服務器集中管理IP分配,網絡架構調整時,修改服務器設置,客戶端自動適配;靜態IP則要逐臺手動輸入、調整,流程繁瑣還易出錯。
靈活資源利用:DHCP動態分配IP,設備離線后地址回池再利用,契合公共場所臨時大量接入需求,提升地址利用率;還能按需靈活調配,為關鍵設備保留靜態IP,其余動態分配。靜態IP固定占用,閑置浪費資源,靈活性差。
高效維護與排障:DHCP自動分配,規避手動配置錯誤與IP地址沖突,服務器詳細記錄分配情況。網絡故障時,管理員依服務器日志鎖定故障設備排查;靜態IP手動配置易沖突,故障排查缺少有效記錄,難度大、耗時久。
適配移動與拓展:移動設備橫跨網絡時,DHCP讓其自動獲取IP配置,無需手動切換;網絡規模擴大、新增設備時,DHCP自動分配地址,助力快速擴容。靜態IP需提前規劃,易現地址不足、分配不合理問題,還增加設備移動操作難度。
3 DHCP工作原理
DHCP工作原理如圖所示:

從圖示中我們可以直觀明了地看出DHCP地工作原理,一般為四個階段:
發現階段:客戶端接入網絡時以廣播形式發送DHCP Discover報文(目的IP是255.255.255.255,源IP是0.0.0.0)尋找DHCP服務器,報文中含客戶端MAC地址。若服務器和客戶端不在同一子網,會通過中繼代理(如路由器)轉發。
提供階段:DHCP服務器收到Discover報文后,從IP地址池選一個未分配的IP地址,將其和子網掩碼、默認網關、DNS服務器地址等信息封裝進DHCP Offer報文,以廣播或單播方式發給客戶端,可能會有多個Offer報文。
請求階段:客戶端收到多個Offer后選擇一個,以廣播形式發送DHCP Request報文請求分配該IP地址等配置信息,且發送ARP請求檢查IP地址唯一性。
確認階段:服務器收到Request報文后,檢查IP地址是否可用。若可用,將以廣播或單播的形式發送DHCP Ack報文,客戶端收到后完成網絡配置正常上網。若不可用,發送DHCP Nak報文,客戶端收到后重新發起Discover流程。
4 DHCP協議報文
DHCP的報文格式如下:
| 0~7 bit | 8~15 bit | 16~23 bit | 24~31 bit |
| op(1) | htype(1) | hlen(1) | hops(1) |
| Xid(4) | |||
| secs(2) | flags(2) | ||
| ciaddr(4) | |||
| yiaddr(4) | |||
| siaddr(4) | |||
| giaddr(4) | |||
| chaddr(16) | |||
| sname(64) | |||
| file(128) | |||
| options(variable) | |||
DHCP報文各字段的說明如下表所示:
| 字段 | 長度 | 含義 |
| op(op code) | 1字節 |
表示報文的類型,取值為1或2,含義如下: 1:客戶端請求報文。 2:服務器響應報文。 |
| htype(hardware type) | 1字節 | 表示硬件類型。不同的硬件類型取值不同,常見值為1,表示以太網(10Mb)。 |
| hlen(hardware length) | 1字節 | 表示硬件地址長度,以太網的值為6。 |
| hops | 1字節 | 表示DHCP報文經過的DHCP中繼數目。客戶端或服務器初始設為0,每經過一個中繼則加1,用于限制DHCP報文經過的中繼數量,且服務器與客戶端間中繼數目不能超16個(Hops值不能大于16),否則報文將被丟棄。 |
| xid | 4字節 | 表示DHCP客戶端選取的隨機數,使DHCP服務器的回復與DHCP客戶端的報文相關聯。 |
| secs(seconds) | 2字節 | 表示客戶端從開始獲取地址或地址續租更新后所用的時間,單位是秒。 |
| flags | 2字節 |
表示標志字段。只有標志字段的最高位才有意義,其余的15位均被置為0。最高位被解釋為單播或者廣播響應標志位,內容如下所示: 0:客戶端請求服務器以單播形式發送響應報文。 1:客戶端請求服務器以廣播形式發送響應報文。 |
| ciaddr(client ip address) | 4字節 |
表示客戶端的IP地址??梢允欠掌鞣峙浣o客戶端的IP地址或者客戶端已有的IP地址。客戶端在初始化狀態時沒有IP地址,此字段為0.0.0.0。 IP地址0.0.0.0僅在采用DHCP方式的系統啟動時允許本主機利用它進行臨時的通信,不是有效目的地址。 |
| yiaddr(your client ip address) | 4字節 | 表示服務器分配給客戶端的IP地址。當服務器進行DHCP響應時,將分配給客戶端的IP地址填入此字段。 |
| siaddr(server ip address) | 4字節 | DHCP客戶端獲得啟動配置信息的服務器的IP地址。 |
| giaddr(gateway ip address) | 4字節 | 表示首個DHCP中繼的IP地址??蛻舳税lDHCP請求,若服務器與客戶端不在同一網段,首個中繼轉發請求報文給服務器時填入自身IP地址,服務器據此判斷客戶端網段地址,選地址池分配對應IP地址,再按此地址回發響應報文給該中繼,由中繼轉發給客戶端。若存在多個中繼,此字段作為客戶端網段標記,填好首個中繼IP地址后不再變更,每經過一個中繼,hops字段數值加1。 |
| chaddr(client hardware address) | 16字節 | 表示客戶端的MAC地址,此字段與前面的“hardware type”和“hardware length”保持一致。當客戶端發出DHCP請求時,將自己的硬件地址填入此字段。對于以太網,當“hardware type”和“hardware length”分別為“1”和“6”時,此字段必須填入6字節的以太網MAC地址。 |
| sname(server host name) | 64字節 | 表示客戶端獲取配置信息的服務器名字。此字段由DHCP服務器填寫,是可選的。如果填寫,必須是一個以0結尾的字符串。 |
| file(file name) | 128字節 | 表示客戶端需獲取的啟動配置文件名。由DHCP服務器填寫,隨DHCP地址分配下發至客戶端。該字段可選,若填寫則須是以0結尾的字符串。 |
| options | 可變 | 表示DHCP的選項字段,最多1200字節,包含DHCP報文類型、服務器分配給終端的配置信息(如網關IP地址、DNS服務器IP地址、客戶端IP地址有效租期等)。詳情參見IETF官網“DHCP Options”部分的描述。 |
Discover報文實例:客戶端通過UDP廣播的方式發送DHCP發現報文,報文中包含了客戶端MAC地址、主機名和請求的IP地址等信息
|報文解析| Message type: Boot Request (1)(op code為1,客戶端請求報文) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xbf600589 Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) Client IP address: 0.0.0.0 Your (client) IP address: 0.0.0.0 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Discover) Option: (61) Client identifier Option: (50) Requested IP Address (192.168.1.115) Option: (12) Host Name Option: (60) Vendor class identifier Option: (55) Parameter Request List Option: (255) End Padding: 0000000000000000 |報文原文| 01 01 06 00 bf 60 05 89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 3d 07 01 64 4e d7 b1 37 11 32 04 c0 a8 01 73 0c 05 46 41 45 5f 33 3c 08 4d 53 46 54 20 35 2e 30 37 0e 01 03 06 0f 1f 21 2b 2c 2e 2f 77 79 f9 fc ff 00 00 00 00 00 00 00 00
Offer報文實例:DHCP服務器收到Discover報文后,從IP地址池選一個未分配的IP地址,將其和子網掩碼、默認網關等信息封裝進Offer報文以廣播或單播(這里為廣播的方式)方式發給客戶端
|報文解析| Message type: Boot Reply (2)(op code為2,服務器響應報文) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xbf600589 Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) Client IP address: 0.0.0.0 Your (client) IP address: 192.168.1.115 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Offer) Option: (54) DHCP Server Identifier (192.168.1.1) Option: (51) IP Address Lease Time Option: (6) Domain Name Server Option: (1) Subnet Mask (255.255.255.0) Option: (3) Router Option: (255) End |報文原文| 02 01 06 00 bf 60 05 89 00 00 00 00 00 00 00 00 c0 a8 01 73 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 02 36 04 c0 a8 01 01 33 04 00 00 1c 20 06 08 ca 60 86 21 ca 60 80 56 01 04 ff ff ff 00 03 04 c0 a8 01 01 ff
其他報文信息這里就不一一展示了,感興趣的朋友可以自行抓取查看。
5 DHCP應用場景
DHCP的應用場景通常集中在需要動態分配IP地址的局域網環境中。例如,在大型的辦公環境或者學校中,由于有大量的網絡設備需要連接到網絡,手動為每個設備分配和管理IP地址會非常繁瑣且容易出錯。使用DHCP可以集中管理IP地址的分配,提高網絡管理員的工作效率,減少錯誤的發生,且可以適應網絡變化。
6實現過程
接下來,我們一起來看看如何在W55MH32上實現DHCP動態獲取網絡地址信息。
注意:使用DHCP動態獲取IP時,必需將網絡結構體配置中dhcp的值改為NETINFO_DHCP,這樣才能運行DHCP模式。
步驟一:注冊DHCP定時器中斷到1s定時器中:
/**
* @brief 1ms timer IRQ Handler
* @param none
* @return none
*/
void TIM3_IRQHandler(void)
{
static uint32_t tim3_1ms_count = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
tim3_1ms_count++;
if (tim3_1ms_count >= 1000)
{
DHCP_time_handler();
tim3_1ms_count = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
注冊DHCP定時器中斷主要為了DHCP超時處理。
在dhcp.h文件中,定義了DHCP超時時間、重試次數、端口號和主機名等內容:
/* Retry to processing DHCP */ #define MAX_DHCP_RETRY 2 ///< Maximum retry count #define DHCP_WAIT_TIME 10 ///< Wait Time 10s /* UDP port numbers for DHCP */ #define DHCP_SERVER_PORT 67 ///< DHCP server port number #define DHCP_CLIENT_PORT 68 ///< DHCP client port number #define MAGIC_COOKIE 0x63825363 ///< You should not modify it number. #define DCHP_HOST_NAME "WIZnet"
步驟二:啟用DHCP動態獲?。?/strong>
首先需要將默認網絡地址信息結構體中的模式改為DHCP模式
/* network information */
wiz_NetInfo default_net_info = {
.mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
.ip = {192, 168, 1, 30},
.gw = {192, 168, 1, 1},
.sn = {255, 255, 255, 0},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_DHCP
};
步驟三:DHCP獲取網絡地址信息
首先是在初始化完硬件和TOE之后調用network_init進行網絡地址信息配置
network_init(ethernet_buf, &default_net_info);
這個函數需要將DHCP處理用到的緩存數組以及默認網絡地址信息傳入,函數具體內容如下:
/** * @brief set network information * * First determine whether to use DHCP. If DHCP is used, first obtain the Internet Protocol Address through DHCP. * When DHCP fails, use static IP to configure network information. If static IP is used, configure network information directly * * @param sn: socketid * @param ethernet_buff: * @param net_info: network information struct * @return none */ void network_init(uint8_t *ethernet_buff, wiz_NetInfo *conf_info) { int ret; wizchip_setnetinfo(conf_info); // Configuring Network Information if (conf_info->dhcp == NETINFO_DHCP) { ret = wiz_dhcp_process(0, ethernet_buff); if (ret == 0) { conf_info->dhcp = NETINFO_STATIC; wizchip_setnetinfo(conf_info); } } print_network_information(); }
在這個函數中,會先設置一遍網絡地址到W55MH32中,然后判斷模式是否為DHCP模式,如果為DHCP模式,則使用wiz_dhcp_process函數來執行DHCP進程,在通過DHCP方式成功獲取到網絡地址后更新到W55MH32中,最后將網絡地址信息打印出來。wiz_dhcp_process函數內容如下:
/**
* @brief DHCP process
* @param sn :socket number
* @param buffer :socket buffer
*/
static uint8_t wiz_dhcp_process(uint8_t sn, uint8_t *buffer)
{
wiz_NetInfo conf_info;
uint8_t dhcp_run_flag = 1;
uint8_t dhcp_ok_flag = 0;
/* Registration DHCP_time_handler to 1 second timer */
DHCP_init(sn, buffer);
printf("DHCP runningrn");
while (1)
{
switch (DHCP_run()) // Do the DHCP client
{
case DHCP_IP_LEASED: // DHCP Acquiring network information successfully
if (dhcp_ok_flag == 0)
{
dhcp_ok_flag = 1;
dhcp_run_flag = 0;
}
break;
case DHCP_FAILED:
dhcp_run_flag = 0;
break;
}
if (dhcp_run_flag == 0)
{
printf("DHCP %s!rn", dhcp_ok_flag ? "success" : "fail");
DHCP_stop();
if (dhcp_ok_flag)
{
getIPfromDHCP(conf_info.ip);
getGWfromDHCP(conf_info.gw);
getSNfromDHCP(conf_info.sn);
getDNSfromDHCP(conf_info.dns);
conf_info.dhcp = NETINFO_DHCP;
getSHAR(conf_info.mac);
wizchip_setnetinfo(&conf_info); // Update network information to network information obtained by DHCP
return 1;
}
return 0;
}
}
}
在該函數體中,首先會調用DHCP_init函數進行初始化DHCP配置:
void DHCP_init(uint8_t s, uint8_t * buf)
{
uint8_t zeroip[4] = {0,0,0,0};
getSHAR(DHCP_CHADDR);
if((DHCP_CHADDR[0] | DHCP_CHADDR[1] | DHCP_CHADDR[2] | DHCP_CHADDR[3] | DHCP_CHADDR[4] | DHCP_CHADDR[5]) == 0x00)
{
// assigning temporary mac address, you should be set SHAR before call this function.
DHCP_CHADDR[0] = 0x00;
DHCP_CHADDR[1] = 0x08;
DHCP_CHADDR[2] = 0xdc;
DHCP_CHADDR[3] = 0x00;
DHCP_CHADDR[4] = 0x00;
DHCP_CHADDR[5] = 0x00;
setSHAR(DHCP_CHADDR);
}
DHCP_SOCKET = s; // SOCK_DHCP
pDHCPMSG = (RIP_MSG*)buf;
DHCP_XID = 0x12345678;
{
DHCP_XID += DHCP_CHADDR[3];
DHCP_XID += DHCP_CHADDR[4];
DHCP_XID += DHCP_CHADDR[5];
DHCP_XID += (DHCP_CHADDR[3] ^ DHCP_CHADDR[4] ^ DHCP_CHADDR[5]);
}
// WIZchip Netinfo Clear
setSIPR(zeroip);
setGAR(zeroip);
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_INIT;
}
然后是在DHCP主循環中運行DHCP_run函數,它的主要作用是進行DHCP組包,發送發現、請求等報文,對服務器的提供、響應等內容進行解析以及超時處理,這里只需要根據DHCP_run函數的返回值進行相應處理即可。DHCP_run函數內容如下:
uint8_t DHCP_run(void)
{
uint8_t type;
uint8_t ret;
if(dhcp_state == STATE_DHCP_STOP) return DHCP_STOPPED;
if(getSn_SR(DHCP_SOCKET) != SOCK_UDP)
socket(DHCP_SOCKET, Sn_MR_UDP, DHCP_CLIENT_PORT, 0x00);
ret = DHCP_RUNNING;
type = parseDHCPMSG();
switch ( dhcp_state ) {
case STATE_DHCP_INIT :
DHCP_allocated_ip[0] = 0;
DHCP_allocated_ip[1] = 0;
DHCP_allocated_ip[2] = 0;
DHCP_allocated_ip[3] = 0;
send_DHCP_DISCOVER();
dhcp_state = STATE_DHCP_DISCOVER;
break;
case STATE_DHCP_DISCOVER :
if (type == DHCP_OFFER){
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_OFFERrn");
#endif
DHCP_allocated_ip[0] = pDHCPMSG->yiaddr[0];
DHCP_allocated_ip[1] = pDHCPMSG->yiaddr[1];
DHCP_allocated_ip[2] = pDHCPMSG->yiaddr[2];
DHCP_allocated_ip[3] = pDHCPMSG->yiaddr[3];
send_DHCP_REQUEST();
dhcp_state = STATE_DHCP_REQUEST;
} else ret = check_DHCP_timeout();
break;
case STATE_DHCP_REQUEST :
if (type == DHCP_ACK) {
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_ACKrn");
#endif
if (check_DHCP_leasedIP()) {
// Network info assignment from DHCP
dhcp_ip_assign();
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_LEASED;
} else {
// IP address conflict occurred
reset_DHCP_timeout();
dhcp_ip_conflict();
dhcp_state = STATE_DHCP_INIT;
}
} else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_NACKrn");
#endif
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_DISCOVER;
} else ret = check_DHCP_timeout();
break;
case STATE_DHCP_LEASED :
ret = DHCP_IP_LEASED;
if ((dhcp_lease_time != INFINITE_LEASETIME) && ((dhcp_lease_time/2) < dhcp_tick_1s)) {
#ifdef _DHCP_DEBUG_
printf("?> Maintains the IP address rn");
#endif
type = 0;
OLD_allocated_ip[0] = DHCP_allocated_ip[0];
OLD_allocated_ip[1] = DHCP_allocated_ip[1];
OLD_allocated_ip[2] = DHCP_allocated_ip[2];
OLD_allocated_ip[3] = DHCP_allocated_ip[3];
DHCP_XID++;
send_DHCP_REQUEST();
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_REREQUEST;
}
break;
case STATE_DHCP_REREQUEST :
ret = DHCP_IP_LEASED;
if (type == DHCP_ACK) {
dhcp_retry_count = 0;
if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] ||
OLD_allocated_ip[1] != DHCP_allocated_ip[1] ||
OLD_allocated_ip[2] != DHCP_allocated_ip[2] ||
OLD_allocated_ip[3] != DHCP_allocated_ip[3])
{
ret = DHCP_IP_CHANGED;
dhcp_ip_update();
#ifdef _DHCP_DEBUG_
printf(">IP changed.rn");
#endif
}
#ifdef _DHCP_DEBUG_
else printf(">IP is continued.rn");
#endif
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_LEASED;
} else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
printf("> Receive DHCP_NACK, Failed to maintain iprn");
#endif
reset_DHCP_timeout();
dhcp_state = STATE_DHCP_DISCOVER;
} else ret = check_DHCP_timeout();
break;
default :
break;
}
return ret;
}
8運行結果
燒錄例程運行后,首先打印了PHY鏈路檢測的結果以及DHCP日志信息,然后打印了網絡地址信息,這里可以看到配置方式為DHCP,IP地址為192.168.1.117,最后是PING提示消息。
接著在PC端打開CMD,PING W55MH32的IP地址,可以正常PING通。

7總結
本文介紹 DHCP協議,包括其在 IP網絡自動分配參數的功能、便捷配置等特點、工作原理、報文格式和應用場景。通過 W55MH32實戰例程展示動態獲取網絡地址信息過程,含注冊定時器中斷、啟用模式和獲取信息等步驟,燒錄后可完成檢測與信息打印,PC端能 PING通設備。
下一篇文章將講解如何在 W55MH32芯片上實現 TCP客戶端模式,解析 TCP客戶端連接服務器進行回環測試的核心原理及應用,同時通過實戰例程講解具體實現步驟與要點,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網
+關注
關注
41文章
5997瀏覽量
180795 -
物聯網
+關注
關注
2945文章
47818瀏覽量
414799
發布評論請先 登錄
第二章 開發板與芯片介紹 詳解W55MH32芯片及開發板
第三章 W55MH32 TCP Client示例
第五章 W55MH32 UDP示例
第六章 W55MH32 UDP?Multicast示例
第九章 W55MH32 HTTP Server示例
第十章 W55MH32 SNTP示例
第十二章 W55MH32 NetBIOS示例
第十四章 W55MH32 TFTP示例
第十五章 W55MH32 SNMP示例
第十六章 W55MH32 PING示例
第十七章 W55MH32 ARP示例
第十八章 W55MH32 FTP_Server示例
第二十六章 W55MH32?上位機搜索和配置示例
第二十七章 W55MH32?Interrupt示例
第三十章 W55MH32 HTTP_Server&NetBIOS示例
第二章 W55MH32 DHCP示例
評論