單芯片解決方案,開啟全新體驗——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 提供了兩種選擇:QFN68和QFN100。
W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、3個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN以及1個USB2.0。在保持與同系列其他版本一致的核心性能基礎上,僅減少了部分GPIO以及SDIO接口,其他參數保持一致,性價比優勢顯著,尤其適合網關模組等對空間布局要求較高的場景。緊湊的尺寸和精簡化外設配置,使其能夠在有限空間內實現高效的網絡連接與數據交互,成為物聯網網關、邊緣計算節點等緊湊型設備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設資源,適用于需要多接口擴展的復雜工控場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32Q這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第六章 外部中斷
在前面幾章的學習中,我們掌握了 W55MH32 的 IO 口最基本的操作。本章我們將介紹如何把 W55MH32 的 IO 口作為外部中斷輸入來使用。
1 NVIC概述
1.1 NVIC簡介
什么是 NVIC?NVIC 即嵌套向量中斷控制器,全稱 Nested vectored interrupt controller。它是內核的器件,所以它的更多描述可以看內核有關的資料《Cortex-M3 權威指南》。M3 內核都是支持 256 個中斷,其中包含了 16 個系統中斷和 240 個外部中斷,并且具有 256 級的可編程中斷設置。然而芯片廠商一般不會把內核的這些資源全部用完,下面我們看看中斷向量表-系統中斷部分:
位置 | 優先級 | 優先級類型 | 名稱 | 說明 | 地址 |
- | - | 保留 | 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 | 可設置 | - | 調試監控 (DebugMonitor) | 調試監控器 | 0x0000_0030 |
- | - | 保留 | 0x0000_0034 | ||
5 | 可設置 | - | PendSV | 可掛起的系統服務 | 0x0000_0038 |
6 | 可設置 | - | SysTick | 系統嘀嗒定時器 | 0x0000_003C |
關于 60 個外部中斷部分在《W55MH32參考手冊_V1.0.0(中文版).pdf》有詳細的列表,這里就不列出來了。
1.2 NVIC寄存器
NVIC 相關的寄存器定義了可以在 core_cm3.h 文件中找到。我們直接通過程序的定義來分NVIC 相關的寄存器,其定義如下:
typedef struct { __IOM uint32_t ISER[8U]; /* 中斷使能寄存器 */ uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; /* 中斷清除使能寄存器 */ uint32_t RSERVED1[24U]; __IOM uint32_t ISPR[8U]; /* 中斷使能掛起寄存器 */ uint32_t RESERVED2[24U]; __IOM uint32_t ICPR[8U]; /* 中斷解掛寄存器 */ uint32_t RESERVED3[24U]; __IOM uint32_t IABR[8U]; /* 中斷有效位寄存器 */ uint32_t RESERVED4[56U]; __IOM uint8_t IP[240U]; /* 中斷優先級寄存器(8Bit 位寬) */ uint32_t RESERVED5[644U]; __OM uint32_t STIR; /* 軟件觸發中斷寄存器 */ } NVIC_Type;
W55MH32 的中斷在這些寄存器的控制下有序的執行的。只有了解這些中斷寄存器,才能方便的使用 W55MH32 的中斷。下面重點介紹這幾個寄存器:
ISER[8]:ISER 全稱是:Interrupt Set Enable Registers,這是一個中斷使能寄存器組。上面說了 CM3 內核支持 256 個中斷,這里用 8 個 32 位寄存器來控制,每個位控制一個中斷。但是W55MH32 的可屏蔽中斷最多只有 60 個,所以對我們來說,有用的就是兩個(ISER[0]和ISER[1]),總共可以表示 64 個中斷。而 W55MH32 只用了其中的 60 個。ISER[0]的 bit0~31 分別對應中斷 0~31;ISER[1]的 bit0~27 對應中斷 32~59,這樣總共 60 個中斷就可以分別對應上了。你要使能某個中斷,必須設置相應的 ISER 位為 1,使該中斷被使能(這里僅僅是使能,還要配合中斷分組、屏蔽、IO 口映射等設置才算是一個完整的中斷設置)。具體每一位對應哪個中斷,請參考 W55MH32 xe.h 里面的第 69 行。
ICER[8]:全稱是:Interrupt Clear Enable Registers,是一個中斷除能寄存器組。該寄存器組與 ISER 的作用恰好相反,是用來清除某個中斷的使能的。其對應位的功能,也和 ICER 一樣。這里要專門設置一個 ICER 來清除中斷位,而不是向 ISER 寫 0 來清除,是因為 NVIC 的這些寄存器都是寫 1 有效的,寫 0 是無效的。具體為什么是這樣子,可以查看《Cortex-M3 權威指南》第 125 頁,NVIC 章節。
ISPR[8]:全稱是:Interrupt Set Pending Registers,是一個中斷使能掛起控制寄存器組。每個位對應的中斷和 ISER 是一樣的。通過置 1,可以將正在進行的中斷掛起,而執行同級或更高級別的中斷。寫 0 是無效的。
ICPR[8]:全稱是:Interrupt Clear Pending Registers,是一個中斷解掛控制寄存器組。其作用與 ISPR 相反,對應位也和 ISER 是一樣的。通過設置 1,可以將掛起的中斷解掛。寫 0 無效。
IABR[8]:全稱是:Interrupt Active Bit Registers,是一個中斷激活標志位寄存器組。對應位所代表的中斷和 ISER 一樣,如果為 1,則表示該位所對應的中斷正在被執行。這是一個只讀寄存器,通過它可以知道當前在執行的中斷是哪一個。在中斷執行完了由硬件自動清零。
IP[240]:全稱是:Interrupt Priority Registers,是一個中斷優先級控制的寄存器組。這個寄存器組相當重要!W55MH32 的中斷分組與這個寄存器組密切相關。IP 寄存器組由 240 個8bit 的寄存器組成,每個可屏蔽中斷占用 8bit,這樣總共可以表示 240 個可屏蔽中斷。而W55MH32 只用到了其中的 60 個。IP[59]~IP[0]分別對應中斷 59~0。而每個可屏蔽中斷占用的 8bit 并沒有全部使用,而是只用了高 4 位。這 4 位,又分為搶占優先級和子優先級。搶占優先級在前,子優先級在后。而這兩個優先級各占幾個位又要根據 SCB->AIRCR 中的中斷分組設置來決定。
1.3 中斷優先級
W55MH32中的中斷優先級可以分為:搶占式優先級和響應優先級,響應優先級也稱子優先級,每個中斷源都需要被指定這兩種優先級。搶占式優先級和響應優先級的區別:搶占優先級:搶占優先級高的中斷可以打斷正在執行的搶占優先級低的中斷。響應優先級:搶占優先級相同,響應優先級高的中斷不能打斷響應優先級低的中斷。
還有一種情況就是當兩個或者多個中斷的搶占式優先級和響應優先級相同時,那么就遵循自然優先級,看中斷向量表的中斷排序,數值越小,優先級越高。
在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 個寄存器控制中斷優先級,每個寄存器的 8 位,所以就有了 240 個寬度為 8bit 的中斷優先級控制寄存器,原則上每個外部中斷可配置的優先級為 0~255,數值越小,優先級越高。但是實際上 M3 芯片為了精簡設計,只使用了高四位[7:4],低四位取零,這樣以至于最多只有 16 級中斷嵌套,即 2^4=16。對于 NVCI 的中斷優先級分組:W55MH32 將中斷分為 5 個組,組 0~4。該分組的設置是由 SCB->AIRCR 寄存器的 bit10~8 來定義的。具體的分配關系如表所示:
優先級分組 | AIRCR[10:8] | bit [7:4] 分配情況 | 分配結果 |
0 | 111 | 0:4 | 0 位搶占優先級,4 位響應優先級 |
1 | 110 | 1:3 | 1 位搶占優先級,3 位響應優先級 |
2 | 101 | 2:2 | 2 位搶占優先級,2 位響應優先級 |
3 | 100 | 3:1 | 3 位搶占優先級,1 位響應優先級 |
4 | 011 | 4:0 | 4 位搶占優先級,0 位響應優先級 |
通過這個表,我們就可以清楚的看到組 0~4 對應的配置關系,例如優先級分組設置為 3,那么此時所有的 60 個中斷,每個中斷的中斷優先寄存器的高四位中的最高 3 位是搶占優先級,低 1 位是響應優先級。每個中斷,你可以設置搶占優先級為 0~7,響應優先級為 1 或 0。搶占優先級的級別高于響應優先級。而數值越小所代表的優先級就越高。
結合實例說明一下:假定設置中斷優先級分組為 2,然后設置中斷 3(RTC_WKUP 中斷)的搶占優先級為 2,響應優先級為 1。中斷 6(外部中斷 0)的搶占優先級為 3,響應優先級為 0。
中斷 7(外部中斷 1)的搶占優先級為 2,響應優先級為 0。那么這 3 個中斷的優先級順序為:
中斷 7>中斷 3>中斷 6。上面例子中的中斷 3 和中斷 7 都可以打斷中斷 6 的中斷。而中斷 7 和中斷 3 卻不可以相互打斷!
1.4 NVIC 相關函數
下面列出我們較為常用的函數進行,想了解更多其他的函數請自行查閱。
1. HAL_NVIC_SetPriorityGrouping 函數
HAL_NVIC_SetPriorityGrouping 是設置中斷優先級分組函數。其聲明如下:
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
?函數描述:用于設置中斷優先級分組。
?函數形參:形參 1 是中斷優先級分組號,可以選擇范圍:NVIC_PRIORITYGROUP_0 到NVIC_PRIORITYGROUP_4(共 5 組)。
?函數返回值:無
?注意事項:這個函數在一個工程里基本只調用一次,而且是在程序 HAL 庫初始化函數里面已經被調用,后續就不會再調用了。因為當后續調用設置成不同的中斷優先級分組時,有可能造成前面設置好的搶占優先級和響應優先級不匹配。
2. HAL_NVIC_SetPriority 函數
HAL_NVIC_SetPriority 是設置中斷優先級函數。其聲明如下:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);
?函數描述:用于設置中斷的搶占優先級和響應優先級(子優先級)。
?函數形參:
······形參 1 是中斷號,可以選擇范圍:IRQn_Type 定義的枚舉類型,定義在 W55MH32 xe.h。
······形參 2 是搶占優先級,可以選擇范圍:0 到 15。
······形參 3 是響應優先級,可以選擇范圍:0 到 15。
?函數返回值:無
3. HAL_NVIC_EnableIRQ 函數
HAL_NVIC_EnableIRQ 是中斷使能函數。其聲明如下:
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
?函數描述:用于使能中斷。
?函數形參:形 參 IRQn 是 中 斷 號 , 可 以 選 擇 范 圍 : IRQn_Type 定 義 的 枚 舉 類 型 , 定 義 在W55MH32 xe.h。
?函數返回值:無
4. HAL_NVIC_DisableIRQ 函數
HAL_NVIC_DisableIRQ 是中斷除能函數。其聲明如下:
void HAL_NVIC_disableIRQ(IRQn_Type IRQn);
? 函數描述:用于中斷除能。
?函數形參:形參 IRQn 是中斷號,可以選擇范圍:IRQn_Type 定義的枚舉類型,定義在 W55MH32 xe.h。
?函數返回值:無
5. HAL_NVIC_SystemReset 函數
HAL_NVIC_SystemReset 是系統復位函數。其聲明如下:
void HAL_NVIC_SystemReset(void);
?函數描述:用于軟件復位系統。
?函數形參:無形參
?函數返回值:無
其他的 NVIC 函數用得較少,我們就不一一列出來了。NVIC 的介紹就到這,下面介紹外部中斷。
2 EXTI概述
2.1 EXTI簡介
EXTI 即是外部中斷和事件控制器,它是由 20 個產生事件/中斷請求的邊沿檢測器組成。每一條輸入線都可以獨立地配置輸入類型(脈沖或掛起)和對應的觸發事件(上升沿或下降沿或者雙邊沿都觸發)。每個輸入線都可以獨立地被屏蔽。掛起寄存器保持著狀態線的中斷求。EXTI 的功能框圖是最直接把有關 EXTI 的知識點連接起來的圖,掌握了該圖的來龍去脈,就會對 EXTI 有了一個整體熟悉,編程時候可以得心應手。
2.2 EXTI功能框圖解析
EXTI 的功能框圖如下圖所示:
從 EXTI 功能框圖可以看到有兩條主線,一條是由輸入線到 NVIC 中斷控制器,一條是由輸入線到脈沖發生器。這就恰恰是 EXTI 的兩大部分功能,產生中斷與產生事件,兩者從硬件上就存在不同。
下面讓我們看一下 EXTI 功能框圖的產生中斷的線路,最終信號是流入 NVIC 控制器中。輸入線是線路的信息輸入端,它可以通過配置寄存器設置為任何一個 GPIO 口,或者是一些外設的事件。輸入線一般都是存在電平變化的信號。
標號①是一個邊沿檢測電路,包括邊沿檢測電路,上升沿觸發選擇寄存器(EXTI_RTSR)和下降沿觸發選擇寄存器(EXTI_FTSR)。邊沿檢測電路以輸入線作為信號輸入端,如果檢測到有邊沿跳變就輸出有效信號‘1’到標號②部分電路,否則輸入無效信號‘0’。邊沿跳變的標準在于開始的時候對于上升沿觸發選擇寄存器或下降沿觸發選擇寄存器對應位的設置。
標號②是一個或門電路,它的兩個信號輸入端分別是軟件中斷事件寄存器(EXTI_SWIER)和邊沿檢測電路的輸入信號。或門電路只要輸入端有信號‘1’,就會輸出‘1’,所以就會輸出‘1’到標號③電路和標號④電路。通過對軟件中斷事件寄存器的讀寫操作就可以啟動中斷/事件線,即相當于輸出有效信號‘1’到或門電路輸入端。
標號③是一個與門電路,它的兩個信號輸入端分別是中斷屏蔽寄存器(EXTI_IMR)和標號②電路輸出信號。與門電路要求輸入都為‘1’才輸出‘1’,這樣子的情況下,如果中斷屏蔽寄存器(EXTI_IMR)設置為 0 時,不管從標號②電路輸出的信號特性如何,最終標號③電路輸出的信號都是 0;假如中斷屏蔽寄存器(EXTI_IMR)設置為 1 時,最終標號③電路輸出的信號才由標號②電路輸出信號決定,這樣子就可以簡單控制 EXTI_IMR 來實現中斷的目的。標號④電路輸出‘1’就會把請求掛起寄存器(EXTI_PR)對應位置 1。最后,請求掛起寄存器(EXTI_PR)的內容就輸出到 NVIC 內,實現系統中斷事件的控制。接下來我們看看 EXTI 功能框圖的產生事件的線路。產生事件線路是從標號②之后與中斷線路有所不用,之前的線路都是共用的。
標號④是一個與門,輸入端來自標號②電路以及來自于事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR 寄存器設置為 0,那不管標號②電路輸出的信號是‘0’還是‘1’,最終標號④輸出的是‘0’;如果 EXTI_EMR 寄存器設置為 1,最終標號④電路輸出信號就由標號③電路輸出的信號決定,這樣子就可以簡單的控制 EXTI_EMR 來實現是否產生事件的目的。標號④電路輸出有效信號 1 就會使脈沖發生器電路產生一個脈沖,而無效信號就不會使其產生脈沖信號。脈沖信號產生可以給其他外設電路使用,例如定時器,模擬數字轉換器等,這樣的脈沖信號一般用來觸發 TIM 或者 ADC 開始轉換。產生中斷線路目的使把輸入信號輸入到 NVIC,進一步運行中斷服務函數,實現功能。而產生事件線路目的是傳輸一個脈沖信號給其他外設使用,屬于硬件級功能。EXTI 支持 19 個外部中斷/事件請求,這些都是信息輸入端,也就是上面提及到了輸入線,具體如下:
?EXTI 線 0~15:對應外部 IO 口的輸入中斷
?EXTI 線 16:連接到 PVD 輸出
?EXTI 線 17:連接到 RTC 鬧鐘事件
?EXTI 線 18:連接到 USB 喚醒事件
?EXTI 線 19:連接到以太網喚醒事件
從上面可以看出,W55MH32 供給 IO 口使用的中斷線只有 16 個,但是 W55MH32 的 IO 口卻遠遠不止 16 個,所以W55MH32把 GPIO 管腳 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分別對應中斷線 0~15。這樣子每個中斷線對應了最多 9 個 IO 口,以線 0 為例:它對應了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0 和 GPIOG.0。而中斷線每次只能連接到 1個 IO 口上,這樣就需要通過配置決定對應的中斷線配置到哪個 GPIO 上了。GPIO 和外部中斷線映射關系是在寄存器 AFIO_EXTICR1 ~ AFIO_EXTICR4 中配置的。
AFIO_EXTICR1 寄存器配置 EXTI0 到 EXTI3 線,對應的外部中斷引腳有 PAx 到 PGx,x=0 到 3。AFIO_EXTICR2 寄存器配置 EXTI4 到 EXTI7 線,對應的外部中斷引腳有 PAx 到PGx,x=4 到 7。AFIO_EXTICR3 寄存器配置 EXTI8 到 EXTI11 線,對應的外部中斷引腳有PAx 到 PGx,x=8 到 11。AFIO_EXTICR4 寄存器配置 EXTI12 到 EXTI15 線,對應的外部中斷引腳有 PAx 到 PGx,x=12 到 15。另外要注意的是,我們配置 AFIO 相關寄存器前,還需要打開 AFIO 時鐘。
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5425瀏覽量
123647 -
NVIC
+關注
關注
0文章
36瀏覽量
11963 -
外部中斷
+關注
關注
1文章
133瀏覽量
16128
發布評論請先 登錄
求王慶利《單片機設計標準教程》第六章的一個函數!!
脈沖波形發生器與整形電路 第六章
三相電路(第六章)
PCB布線設計經驗談附原理圖(第六章)

HT合泰單片機入門教程(第六章 時基中斷)

評論