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

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

第十章 W55MH32中斷應(yīng)用概覽
評(píng)論