單芯片解決方案,開啟全新體驗——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的無限可能。
第二十七章 W55MH32Interrupt示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面使用TOE中斷功能,并通過實戰例程,為大家講解如何通過中斷進行回環數據測試。
該例程用到的其他網絡協議,請參考相關章節。有關W55MH32的初始化過程,請參考Network Install章節,這里將不再贅述。
1 TOE中斷簡介
在TOE中斷模式下,可以設置多種中斷事件,例如網絡建立連接、數據接收、數據發送完成等。當某個事件發生時,通過PD9通知給處理器,處理可以立即響應中斷,并進行相應的處理。這種方式可以提高系統的響應速度和效率,減少處理器在輪詢狀態下的資源浪費。
2中斷特點
實時性:在中斷事件發生后,處理器會暫停當前正在執行的任務,立刻響應中斷,當存在多個中斷處理時,處理器會基于優先級進行對應處理。
提高系統效率:如果沒有中斷機制,處理器需要不斷輪詢寄存器狀態,以檢查是否需要進行處理,這會占用大量的處理器資源,而中斷方式可以讓處理器專注運行主程序,需要處理時再去處理相應的任務,提高了系統資源的利用率。
事件驅動:中斷是由事件驅動的,這些事件可以是外部的(如外部設備的操作、信號變化等),也可以是內部的(如定時器溢出、計算結果異常等)
中斷服務程序:每個中斷源通常都有對應的中斷服務程序,它們是專門為處理該中斷事件而編寫的一段獨立的程序代碼。
3 TOE中斷應用場景
網絡喚醒: 啟用魔術包中斷后,當W55MH32接收到魔術包時會觸發中斷,進而通知設備執行喚醒操作。
網絡配置: 啟用Socket接收中斷后,W55MH32在接收到數據時觸發中斷,系統在中斷觸發后才進行消息讀取配置,無需持續輪詢,從而節省系統資源。
錯誤處理:當遇到錯誤時(例如IP地址沖突,網絡不可達),W55MH32可以立即進行處理,提高系統的穩定性。
4 TOE中斷源
IP沖突:在收到ARP請求時,發現發送方IP與本地IP重復時觸發中斷。
目標不可抵達:在接收到ICMP(目的端口不可達)包后觸發中斷。
PPPoE連接關閉:在PPPoE模式下,PPPoE連接斷開時觸發中斷。
Magic Packet:當網絡喚醒模式啟用并通過UDP接收到Magic Packet網絡喚醒包時觸發中斷。
以下為Socket中斷:
發送完成:成功發送數據給對方時觸發中斷。
超時:當ARP超時或者TCP超時時觸發中斷。
接收到數據:接收到對方數據時觸發中斷。
關閉連接:接收到對方的FIN或 FIN/ACK包時觸發中斷。
建立連接:成功與對方建立連接時觸發中斷。
5使用中斷接收數據的流程
初始化中斷引腳;
開啟對應Socket的中斷功能,相關寄存器及描述如下:
開啟Socket RECV中斷功能,相關寄存器及描述如下:
編寫中斷處理函數,在接收到數據時進行處理。
6實現過程
接下來,我們看看如何在W55MH32上實現中斷回環數據測試。
注意:測試實例需要PC端和W55MH32處于同一網段。
步驟1:初始化中斷引腳
1. void wizchip_int_init(void) 2. { 3. GPIO_InitTypeDef GPIO_InitStructure; 4. NVIC_InitTypeDef NVIC_InitStructure; 5. EXTI_InitTypeDef EXTI_InitStructure; 6. 7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO, ENABLE); 8. 9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 10. GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; 11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 12. GPIO_Init(GPIOD,&GPIO_InitStructure); 13. 14. 15. GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource8); 16. 17. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; 18. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2; 19. NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; 20. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 21. NVIC_Init(&NVIC_InitStructure); 22. 23. 24. EXTI_InitStructure.EXTI_Line = EXTI_Line8; 25. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 26. EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling; 27. EXTI_InitStructure.EXTI_LineCmd= ENABLE; 28. EXTI_Init(&EXTI_InitStructure); 29. } 30.
步驟2:中斷處理
1. void EXTI9_5_IRQHandler(void) 2. { 3. if(EXTI_GetITStatus(EXTI_Line8)== SET) 4. { 5. if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8)== RESET) 6. { 7. wizchip_ISR(); 8. } 9. } 10. EXTI_ClearITPendingBit(EXTI_Line8); 11. } 12. 13. 14. /** 15. * @brief Determine the interrupt type and store the value in I STATUS 16. * @param none 17. * @returnnone 18. */ 19. void wizchip_ISR(void) 20. { 21. uint8_t SIR_val=0; 22. uint8_t tmp, sn; 23. SIR_val= getSIR(); 24. if(SIR_val!=0xff) 25. { 26. setSIMR(0x00); 27. for(sn=0; sn< _WIZCHIP_SOCK_NUM_; sn++) 28. { 29. tmp?=?0; 30. if?(SIR_val?& IR_SOCK(sn)) 31. { 32. tmp? = getSn_IR(sn); 33. I_STATUS[sn]?|= tmp; 34. tmp? &=?0x0f; 35. setSn_IR(sn, tmp); 36. } 37. } 38. setSIMR(0xff); 39. } 40. } 41.
在TOE成功觸發中斷后,會調用wizchip_ISR()函數,在這里會記錄中斷標志位并清空中斷標志。
步驟3:開啟中斷功能
1. setSIMR(0x01);// enable socket0 interrupt 2. setSn_IMR(SOCKET_ID,0x0f);//enable all interrupt functions of socket 0. 3.
步驟4:主循環中運行TCP回環服務器
1. void loopback_tcps_interrupt(uint8_t sn,uint8_t*buf,uint16_t port) 2. { 3. uint16_t len=0; 4. uint8_t destip[4]; 5. uint16_t destport; 6. 7. if(I_STATUS[sn]== SOCK_CLOSED) 8. { 9. if(!ch_status[sn]) 10. { 11. #ifdef INTERRUPT_DEBUG 12. printf("%d:TCP server startrn", sn); 13. #endif 14. ch_status[sn]= ready_status; 15. 16. if(socket(sn,Sn_MR_TCP, port,0x00)!= sn) 17. { 18. ch_status[sn]= closed_status; 19. } 20. else 21. { 22. #ifdef INTERRUPT_DEBUG 23. printf("%d:Socket openedrn", sn); 24. #endif 25. listen(sn); 26. #ifdef INTERRUPT_DEBUG 27. printf("%d:Listen, TCP server loopback, port [%d]rn", sn, port); 28. #endif 29. } 30. } 31. } 32. if(I_STATUS[sn]&Sn_IR_CON) 33. { 34. getSn_DIPR(sn, destip); 35. destport= getSn_DPORT(sn); 36. #ifdef INTERRUPT_DEBUG 37. printf("%d:Connected - %d.%d.%d.%d : %drn", sn, destip[0], destip[1], destip[2], destip[3], destport); 38. 39. #endif 40. ch_status[sn] = connected_status; 41. I_STATUS[sn] &=~(Sn_IR_CON); 42. } 43. 44. if(I_STATUS[sn]&Sn_IR_DISCON) 45. { 46. printf("%d:Socket disconnectedrn", sn); 47. if((getSn_RX_RSR(sn))>0) 48. { 49. if(len> ETHERNET_BUF_MAX_SIZE) 50. { 51. len= ETHERNET_BUF_MAX_SIZE; 52. } 53. recv(sn, buf, len); 54. buf[len]=0x00; 55. printf("%d:recv data:%srn", sn, buf); 56. I_STATUS[sn]&=~(Sn_IR_RECV); 57. send(sn, buf, len); 58. } 59. disconnect(sn); 60. ch_status[sn] = closed_status; 61. I_STATUS[sn] &=~(Sn_IR_DISCON); 62. } 63. 64. if(I_STATUS[sn]&Sn_IR_RECV) 65. { 66. setIMR(0x00); 67. I_STATUS[sn]&=~(Sn_IR_RECV); 68. setIMR(0xff); 69. if((len= getSn_RX_RSR(sn))>0) 70. { 71. if(len> ETHERNET_BUF_MAX_SIZE) 72. { 73. len= ETHERNET_BUF_MAX_SIZE; 74. } 75. len = recv(sn, buf, len); 76. buf[len]=0x00; 77. printf("%d:recv data:%srn", sn, buf); 78. send(sn, buf, len); 79. } 80. } 81. 82. if(I_STATUS[sn]&Sn_IR_SENDOK) 83. { 84. I_STATUS[sn]&=~(Sn_IR_SENDOK); 85. } 86. }
進入函數后,首先檢查Socket狀態。如果Socket處于關閉狀態,則啟動一個TCP服務器。接著,根據記錄的中斷標志位判斷是否觸發了中斷,并根據中斷類型進行相應的處理。
7運行結果
燒錄例程運行后,首先可以看到進行了PHY鏈路檢測,然后打印了設置的網絡地址信息,接著是TCP中斷回環測試,W55MH32接收到Socket數據后觸發中斷并進行回傳。如下圖所示:
8總結
本文講解了如何在 W55MH32芯片上使用 TOE中斷功能并進行回環數據測試,通過實戰例程展示了從初始化中斷引腳、處理中斷、開啟中斷功能到在主循環中運行 TCP回環服務器的完整過程。文章詳細介紹了 TOE中斷的概念、特點、應用場景、中斷源以及使用中斷接收數據的流程,幫助讀者理解其在提升系統響應速度和資源利用率方面的實際應用價值。
下一篇文章將講解在 W55MH32 芯片上實現以太網測速功能,解析其核心原理及在網絡性能評估中的應用,同時通過實戰例程講解如何借助 Jperf工具進行測速,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
SF
-
單片機
+關注
關注
6068文章
45032瀏覽量
651915 -
Interrupt
+關注
關注
0文章
9瀏覽量
14672
發布評論請先 登錄
第三十章 W55MH32 HTTP_Server&NetBIOS示例

第二十九章 W55MH32 Modbus_TCP_Server示例

第二十六章 W55MH32?上位機搜索和配置示例

第二十五章 W55MH32 TCP_Server_Multi_Socket示例

第二十三章 W55MH32 MQTT_OneNET示例

第二十二章 W55MH32 MQTT&Aliyun示例

第二十一章 W55MH32 PHY配置示例

第十七章 W55MH32 ARP示例

第十五章 W55MH32 SNMP示例

第十章 W55MH32 SNTP示例

第九章 W55MH32 HTTP Server示例

第五章 W55MH32 UDP示例

第二章 W55MH32 DHCP示例

共赴之約 | 第二十七屆中國北京國際科技產業博覽會圓滿落幕

評論