單芯片解決方案,開啟全新體驗——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中斷應用概覽
本章參考資料《W55MH32-參考手冊》、《 Cortex-M3內核編程手冊》-4.3 章節:NVIC和4.4章節:SCB—4.4.5的AIRCR。
W55MH32中斷非常強大,每個外設都可以產生中斷,所以中斷的講解放在哪一個外設里面去講都不合適,這里單獨抽出一章來做一個總結性的介紹,這樣在其他章節涉及到中斷部分的知識我們就不用費很大的篇幅去講解,只要示意性帶過即可。
1 異常類型
W55MH32在內核水平上搭載了一個異常響應系統, 支持為數眾多的系統異常和外部中斷。 其中系統異常有8個(如果把Reset和HardFault也算上的話就是10個), 外部中斷有60個。除了個別異常的優先級被定死外,其它異常的優先級都是可編程的。 有關具體的系統異常和外部中斷可在標準庫文件w55mh32.h這個頭文件查詢到,在IRQn_Type這個結構體里面包含了W55MH32系列全部的異常聲明。
W55MH32系統異常清單
編號 | 優先級 | 優先級類型 | 名稱 | 說明 | 地址 |
- | - | - | 保留(實際存的是 MSP 地址) | 0X0000 0000 | |
-3 | - | 固定 | Reset | 復位 | 0X0000 0004 |
-2 | - | 固定 | NMI | 不可屏蔽中斷。RCC 時鐘安全系統 (CSS) 連接到 NMI 向量 | 0X0000 0008 |
-1 | - | 固定 | HardFault | 所有類型的錯誤 | 0X0000 000C |
0 | - | 可編程 | MemManage | 存儲器管理 | 0X0000 0010 |
1 | - | 可編程 | BusFault | 預取指失敗,存儲器訪問失敗 | 0X0000 0014 |
2 | - | 可編程 | UsageFault | 未定義的指令或非法狀態 | 0X0000 0018 |
- | - | - | 保留 | 0X0000 001C-0X0000 002B | |
3 | - | 可編程 | SVCall | 通過 SWI 指令調用的系統服務 | 0X0000 002C |
4 | - | 可編程 | Debug Monitor | 調試監控器 | 0X0000 0030 |
- | - | - | 保留 | 0X0000 0034 | |
5 | - | 可編程 | PendSV | 可掛起的系統服務 | 0X0000 0038 |
6 | - | 可編程 | SysTick | 系統嘀嗒定時器 | 0X0000 003C |
W55MH32外部中斷清單
編號 | 優先級 | 優先級類型 | 名稱 | 說明 | 地址 |
0 | 7 | 可編程 | WWDG | 窗口看門狗中斷 | 0X0000 0040 |
1 | 8 | 可編程 | PVD | 連到 EXTI 的電源電壓檢測 (PVD) 中斷 | 0X0000 0044 |
2 | 9 | 可編程 | TAMPER | 侵入檢測中斷 | 0X0000 0048 |
57 | 64 | 可編程 | DMA2 通道 2 | DMA2 通道 2 中斷 | 0X0000 0124 |
58 | 65 | 可編程 | DMA2 通道 3 | DMA2 通道 3z 中斷 | 0X0000 0128 |
59 | 66 | 可編程 | DMA2 通道 4_5 | DMA2 通道 4 和通道 5 中斷 | 0X0000 012C |
2 NVIC簡介
在講如何配置中斷優先級之前,我們需要先了解下NVIC。NVIC是嵌套向量中斷控制器,控制著整個芯片中斷相關的功能,它跟內核緊密耦合,是內核里面的一個外設。但是各個芯片廠商在設計芯片的時候會對Cortex-M3內核里面的NVIC進行裁剪,把不需要的部分去掉,所以說W55MH32的NVIC是Cortex-M 3的NVIC的一個子集。
2.1 NVIC寄存器簡介
在固件庫中,NVIC的結構體定義可謂是頗有遠慮,給每個寄存器都預留了很多位,恐怕為的是日后擴展功能。 不過W55MH32可用不了這么多,只是用了部分而已,具體使用了多少可參考《 Cortex-M3 內核編程手冊》-4.3.11:NVIC寄存器映射。
代碼清單:中斷-1 NVIC結構體定義,來自固件庫頭文件:core_cm3.h
typedef struct { __IO uint32_t ISER[8]; // 中斷使能寄存器 uint32_t RESERVED0[24]; __IO uint32_t ICER[8]; // 中斷清除寄存器 uint32_t RSERVED1[24]; __IO uint32_t ISPR[8]; // 中斷使能懸起寄存器 uint32_t RESERVED2[24]; __IO uint32_t ICPR[8]; // 中斷清除懸起寄存器 uint32_t RESERVED3[24]; __IO uint32_t IABR[8]; // 中斷有效位寄存器 uint32_t RESERVED4[56]; __IO uint8_t IP[240]; // 中斷優先級寄存器(8Bit wide) uint32_t RESERVED5[644]; __O uint32_t STIR; // 軟件觸發中斷寄存器 } NVIC_Type;
在配置中斷的時候我們一般只用ISER、ICER和IP這三個寄存器,ISER用來使能中斷,ICER用來失能中斷,IP用來設置中斷優先級。
2.2 NVIC 中斷配置固件庫
固件庫文件core_cm3.h的最后,還提供了NVIC的一些函數,這些函數遵循CMSIS規則,只要是Cortex-M3 的處理器都可以使用,具體如下:
NVIC 庫函數 | 描述 |
void NVIC_EnableIRQ(IRQn_Type IRQn) | 使能中斷 |
void NVIC_DisableIRQ(IRQn_Type IRQn) | 失能中斷 |
void NVIC_SetPendingIRQ(IRQn_Type IRQn) | 設置中斷懸起位 |
void NVIC_ClearPendingIRQ(IRQn_Type IRQn) | 清除中斷懸起位 |
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) | 獲取懸起中斷編號 |
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) | 設置中斷優先級 |
uint32_t NVIC_GetPriority(IRQn_Type IRQn) | 獲取中斷優先級 |
void NVIC_SystemReset(void) | 系統復位 |
這些庫函數我們在編程的時候用的都比較少,甚至基本都不用。在配置中斷的時候我們還有更簡潔的方法,請看中斷編程小節。
3 優先級的定義
3.1 優先級定義
在NVIC 有一個專門的寄存器:中斷優先級寄存器NVIC_IPRx,用來配置外部中斷的優先級,IPR寬度為8bit, 原則上每個外部中斷可配置的優先級為0~255,數值越小,優先級越高。但是絕大多數CM3芯片都會精簡設計, 以致實際上支持的優先級數減少,在W55MH32中,只使用了高4bit,如下所示:
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
用于表達優先級 | 未使用,讀回為 0 |
用于表達優先級的這4bit,又被分組成搶占優先級和子優先級。如果有多個中斷同時響應,搶占優先級高的就會搶占搶占優先級低的優先得到執行, 如果搶占優先級相同,就比較子優先級。如果搶占優先級和子優先級都相同的話,就比較他們的硬件中斷編號,編號越小,優先級越高。
3.2 優先級分組
優先級的分組由內核外設SCB的應用程序中斷及復位控制寄存器AIRCR的PRIGROUP[10:8]位決定,W55MH32分為了5組,具體如下:主優先級=搶占優先級
PRIGROUP[2:0] | 中斷優先級值 PRI_N [7:4](二進制點) | 主優先級位 | 子優先級位 | 主優先級 | 子優先級 |
0b 011 | 0b xxxx | [7:4] | None | 16 | None |
0b 100 | 0b xxx.y | [7:5] | [4] | 8 | 2 |
0b 101 | 0b xx.yy | [7:6] | [5:4] | 4 | 4 |
0b 110 | 0b x.yyy | [7] | [6:4] | 2 | 9 |
0b 111 | 0b .yyyy | None | [7:4] | None | 16 |
設置優先級分組可調用庫函數NVIC_PriorityGroupConfig()實現,有關NVIC中斷相關的庫函數都在庫文件misc.c和misc.h中。
代碼清單:中斷-2 中斷優先級分組庫函數NVIC_PriorityGroupConfig()
/** * 配置中斷優先級分組:搶占優先級和子優先級 * 形參如下: * @arg NVIC_PriorityGroup_0: 0bit for搶占優先級 * 4 bits for 子優先級 * @arg NVIC_PriorityGroup_1: 1 bit for搶占優先級 * 3 bits for 子優先級 * @arg NVIC_PriorityGroup_2: 2 bit for搶占優先級 * 2 bits for 子優先級 * @arg NVIC_PriorityGroup_3: 3 bit for搶占優先級 * 1 bits for 子優先級 * @arg NVIC_PriorityGroup_4: 4 bit for搶占優先級 * 0 bits for 子優先級 * @注意 如果優先級分組為0,則搶占優先級就不存在,優先級就全部由子優先級控制 */ void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) { // 設置優先級分組 SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; }
優先級分組 | 主優先級 | 子優先級 | 描述 |
NVIC_PriorityGroup_0 | 0 | 0-15 | 主 - 0bit,子 - 4bit |
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 主 - 1bit,子 - 3bit |
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 主 - 2bit,子 - 2bit |
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 主 - 3bit,子 - 1bit |
NVIC_PriorityGroup_4 | 0-15 | 0 | 主 - 4bit,子 - 0bit |
4 中斷編程
在配置每個中斷的時候一般有3個編程要點:
1.使能外設某個中斷,這個具體由每個外設的相關中斷使能位控制。比如串口有發送完成中斷,接收完成中斷,這兩個中斷都由串口控制寄存器的相關中斷使能位控制。
2.初始化NVIC_InitTypeDef結構體,配置中斷優先級分組,設置搶占優先級和子優先級, 使能中斷請求。NVIC_InitTypeDef結構體在固件庫頭文件misc.h中定義。
代碼清單:中斷-3 NVIC初始化結構體
typedef struct { uint8_t NVIC_IRQChannel; // 中斷源 uint8_t NVIC_IRQChannelPreemptionPriority; // 搶占優先級 uint8_t NVIC_IRQChannelSubPriority; // 子優先級 FunctionalState NVIC_IRQChannelCmd; // 中斷使能或者失能 } NVIC_InitTypeDef;
有關NVIC初始化結構體的成員我們一一解釋下:
(1).NVIC_IROChannel:用來設置中斷源,不同的中斷中斷源不一樣,且不可寫錯,即使寫錯了程序也不會報錯,只會導致不響應中斷。 具體的成員配置可參考w55mh32x.h頭文件里面的IRQn_Type結構體定義,這個結構體包含了所有的中斷源。
代碼清單:中斷-4 IRQn_Type中斷源結構體
typedef enum IRQn { //Cortex-M3 處理器異常編號 NonMaskableInt_IRQn = -14, MemoryManagement_IRQn = -12, BusFault_IRQn = -11, UsageFault_IRQn = -10, SVCall_IRQn = -5, DebugMonitor_IRQn = -4, PendSV_IRQn = -2, SysTick_IRQn = -1, /W55MH32 外部中斷編號 WWDG_IRQn = 0, PVD_IRQn = 1, TAMP_STAMP_IRQn = 2, // 限于篇幅,中間部分代碼省略,具體的可查看庫文件W55MH32.h DMA2_Channel2_IRQn = 57, DMA2_Channel3_IRQn = 58, DMA2_Channel4_5_IRQn = 59 } IRQn_Type;
(2).NVIC_IRQChannelPreemptionPriority:搶占優先級,具體的值要根據優先級分組來確定, 具體參考表格 優先級分組真值表 優先級分組真值表 。
(3). NVIC_IRQChannelSubPriority:子優先級,具體的值要根據優先級分組來確定, 具體參考表格 優先級分組真值表 優先級分組真值表 。
(4).NVIC_IRQChannelCmd:中斷使能(ENABLE)或者失能(DISABLE)。 操作的是NVIC_ISER和NVIC_ICER這兩個寄存器。
3.編寫中斷服務函數
在啟動文件startup_w55mh32_hd.s中我們預先為每個中斷都寫了一個中斷服務函數,只是這些中斷函數都是為空,為的只是初始化中斷向量表。 實際的中斷服務函數都需要我們重新編寫,為了方便管理我們把中斷服務函數統一寫在w55mh32_it.c這個庫文件中。
關于中斷服務函數的函數名必須跟啟動文件里面預先設置的一樣,如果寫錯,系統就在中斷向量表中找不到中斷服務函數的入口, 直接跳轉到啟動文件里面預先寫好的空函數,并且在里面無限循環,實現不了中斷。
5 補充說明
后續其他例程的某個外設配置過程的自定義函數如NVIC_Configuration()分別執行了 NVIC_PriorityGroupConfig() 配置中斷優先級分組,NVIC_Init(&NVIC_InitStructure) 配置結構體賦值的將要設置的中斷向量和其優先級, 注意這里的 NVIC_PriorityGroupConfig是整個程序中只需要設置一次 。
當設置好了中斷優先級分組,其他各種外設對應的中斷向量的中斷優先級既是基于目前設置分組來解讀, 假設配置為NVIC_PriorityGroup_0或者NVIC_PriorityGroup_4,那么給多個外設分別填充NVIC_InitStructure的子優先級或主優先級是無效的,所以說如果工程里面有用到許多的外設中斷,那么在確定了想用哪一種優先級分組后再給每個外設對應的中斷向量配置優先級。
在其他例程中很多將NVIC_PriorityGroupConfig寫在了每個外設自己的中斷配置函數里面,有些可能多個外設配置函數下重復了NVIC_PriorityGroupConfig()這句, 這里提醒用戶后續編寫自己程序時只需要調用一次即可,若重復調用相當于對中斷相關寄存器重復賦值多次取最后一次賦值,并且從代碼布局邏輯來說,NVIC_PriorityGroupConfig適合放在main()函數中。
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
芯片
+關注
關注
459文章
52076瀏覽量
435186 -
封裝
+關注
關注
128文章
8442瀏覽量
144660 -
WIZnet
+關注
關注
3文章
21瀏覽量
42362
發布評論請先 登錄
【PDF】C++ GUI Programming with Qt 4 中文版(第一章至第十章)目錄版
【ALIENTEK 戰艦STM32開發板】STM32開發指南--第十章 外部中斷...
《從算法設計到硬線邏輯的實現》中第十章練習6-在Verilog H...
理解流水線編程——四位全加器(夏老師書第十章)代碼
明德揚視頻分享點撥FPGA課程--第十章 ?GVIM的使用
淺析中斷時間和內存管理
CH32V103基礎教程31-ADC-單通道中斷讀取方式
WIZnet高性能以太網單片機W55MH32重磅發布!

即刻啟程,踏上W55MH32高性能以太網單片機學習之路!

評論