MCU微課堂
CKS32F4xx系列產(chǎn)品NVIC中斷優(yōu)先級管理
第三期 2023.2.2
本課將為大家講解CKS32F4xx系列產(chǎn)品的中斷優(yōu)先級管理單元NVIC。CM4內(nèi)核共支持256個中斷,其中包含了16個內(nèi)核中斷和240個外部中斷,具有256級可編程中斷設(shè)置。但CKS32F4xx系列只使用了CM4內(nèi)核的一部分,共有98個中斷,包括16個帶有FPU核的CM4中斷和82個可屏蔽中斷,而我們常用的就是這82個可屏蔽中斷。
NVIC寄存器簡介
MDK為NVIC相關(guān)寄存器其定義了如下的結(jié)構(gòu)體:
typedef struct { __IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */ uint32_t RESERVED0[24]; __IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */ uint32_t RSERVED1[24]; __IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */ uint32_t RESERVED2[24]; __IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */ uint32_t RESERVED3[24]; __IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */ uint32_t RESERVED4[56]; __IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */ uint32_t RESERVED5[644]; __O uint32_t STIR; /*!< Software Trigger Interrupt Register */ } NVIC_Type;
CKS32F4xx系列的中斷在這些寄存器控制下有序執(zhí)行,只有了解這些中斷寄存器后,才能方便的使用CKS32F4xx系列中斷功能。下面重點介紹這幾個寄存器:
ISER[8]:ISER 全稱是:Interrupt Set-Enable Registers,這是一個中斷使能寄存器組。上面說了CM4內(nèi)核支持256個中斷,這里用8個32位寄存器來控制,每個位控制一個中斷。但是CKS32F4xx系列的可屏蔽中斷最多只有82個,所以對我們來說,有用的就是三個(ISER[0~2]),ISER[0]的bit 0~31分別對應(yīng)中斷0~31;ISER[1]的bit 0~31對應(yīng)中斷32~63;ISER[2]的bit 0~17對應(yīng)中斷64~81,共82個中斷。你要使能某個中斷,必須設(shè)置相應(yīng)的ISER位為 1,使該中斷被使能,另外還要配合中斷分組、屏蔽、IO口映射等設(shè)置才算是一個完整的中斷設(shè)置。具體每一位對應(yīng)哪個中斷,請參考CKS32f4xx.h。
ICER[8]:全稱是:Interrupt Clear-Enable Registers,是一個中斷除能寄存器組。該寄存器組與 ISER 的作用恰好相反,是用來清除某個中斷的使能的。其對應(yīng)位的功能,也和 ICER 一樣。這里要專門設(shè)置一個 ICER 來清除中斷位,而不是向 ISER 寫 0 來清除,是因為 NVIC 的這些寄存器都是寫 1 有效的,寫 0 是無效的。
ISPR[8]:全稱是:Interrupt Set-Pending Registers,是一個中斷掛起控制寄存器組。每個位對應(yīng)的中斷和ISER是一樣的。通過置1,可以將正在進行的中斷掛起,而執(zhí)行同級或更高級別的中斷。寫0是無效的。
ICPR[8]:全稱是:Interrupt Clear-Pending Registers,是一個中斷解掛控制寄存器組。其作用與ISPR相反,對應(yīng)位也和 ISER是一樣的。通過設(shè)置1,可以將掛起的中斷接掛。寫 0 無效。
IABR[8]:全稱是:Interrupt Active Bit Registers,是一個中斷激活標志位寄存器組。對應(yīng)位所代表的中斷和ISER一樣,如果為 1,則表示該位所對應(yīng)的中斷正在被執(zhí)行。這是一個只讀寄存器,通過它可以知道當前在執(zhí)行的中斷是哪一個。在中斷執(zhí)行完了由硬件自動清零。
IP[240]:全稱是:Interrupt Priority Registers,是一個中斷優(yōu)先級控制的寄存器組。CKS32F4的中斷分組與這個寄存器組密切相關(guān)。IP寄存器組由240個8bit的寄存器組成,每個可屏蔽中斷占用8bit,這樣總共可以表示240個可屏蔽中斷。而CKS32F4只用到了其中的82個。IP[81]~IP[0]分別對應(yīng)中斷 81~0。而每個可屏蔽中斷占用的 8bit 并沒有全部使用,而是只用了高4位。這4位,又分為搶占優(yōu)先級和響應(yīng)優(yōu)先級。搶占優(yōu)先級在前,響應(yīng)優(yōu)先級在后。而這兩個優(yōu)先級各占幾個位又要根據(jù) SCB->AIRCR 中的中斷分組設(shè)置來決定。
NVIC中斷分組
這里簡單介紹一下 CKS32F4 的中斷分組:CKS32F4將中斷分為5個組,組0~4。該分組的設(shè)置是由 SCB->AIRCR 寄存器的 bit10~8 來定義的。具體的分配關(guān)系如下:
通過這個表,我們就可以清楚的看到組0~4對應(yīng)的配置關(guān)系,例如組設(shè)置為3,那么此時所有的82個中斷,每個中斷的中斷優(yōu)先寄存器的高四位中的最高3位是搶占優(yōu)先級,低1位是響應(yīng)優(yōu)先級。每個中斷,你可以設(shè)置搶占優(yōu)先級為0~7,響應(yīng)優(yōu)先級為1或0。搶占優(yōu)先級的級別高于響應(yīng)優(yōu)先級。而數(shù)值越小所代表的優(yōu)先級就越高。
這里需要注意兩點:
第一,如果兩個中斷的搶占優(yōu)先級和響應(yīng)優(yōu)先級都是一樣的話,則看哪個中斷先發(fā)生就先執(zhí)行;
第二,高優(yōu)先級的搶占優(yōu)先級是可以打斷正在進行的低搶占優(yōu)先級中斷的。而搶占優(yōu)先級相同的中斷,高優(yōu)先級的響應(yīng)優(yōu)先級不可以打斷低響應(yīng)優(yōu)先級的中斷。
結(jié)合實例說明一下:假定設(shè)置中斷優(yōu)先級組為2,然后設(shè)置中斷3(RTC_WKUP中斷)的搶占優(yōu)先級為2,響應(yīng)優(yōu)先級為1。中斷6(外部中斷0)的搶占優(yōu)先級為3,響應(yīng)優(yōu)先級為0。中斷7(外部中斷1)的搶占優(yōu)先級為2,響應(yīng)優(yōu)先級為0。那么這3個中斷的優(yōu)先級順序為:中斷7>中斷3>中斷6。其中中斷3和中斷7都可以打斷中斷6的中斷。而中斷7和中斷3卻不可以相互打斷!
軟件實現(xiàn)
通過以上介紹,我們熟悉了CKS32F4中斷設(shè)置的大致過程。接下來我們介紹如何使用庫函數(shù)實現(xiàn)以上中斷分組設(shè)置以及中斷優(yōu)先級管理,使得我們以后的中斷設(shè)置簡單化。NVIC中斷管理函數(shù)主要在misc.c文件里面。
首先要講解的是中斷優(yōu)先級分組函數(shù)NVIC_PriorityGroupConfig,其函數(shù)申明如下:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
這個函數(shù)的作用是對中斷的優(yōu)先級進行分組,這個函數(shù)在系統(tǒng)中只能被調(diào)用一次,一旦分組確定就最好不要更改。這個函數(shù)我們可以找到其實現(xiàn):
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) { assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; }
從函數(shù)體可以看出,這個函數(shù)唯一目的就是通過設(shè)置SCB->AIRCR寄存器來設(shè)置中斷優(yōu)先級分組,查看其定義為:
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || ((GROUP) == NVIC_PriorityGroup_1) || ((GROUP) == NVIC_PriorityGroup_2) || ((GROUP) == NVIC_PriorityGroup_3) || ((GROUP) == NVIC_PriorityGroup_4))
可以看到這個定義對應(yīng)上表中的分組范圍0-4。如果我們需要設(shè)置系統(tǒng)的中斷優(yōu)先級分組值為2,那么方法是:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);這樣就確定了一共為“2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級”。設(shè)置好了系統(tǒng)中斷分組,接下來設(shè)置中斷的搶占優(yōu)先級和響應(yīng)優(yōu)先級,這里需要用到一個重要的函數(shù)為中斷初始化函數(shù)NVIC_Init,其函數(shù)聲明為:voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct),其中NVIC_InitTypeDef是一個結(jié)構(gòu)體,我們可以看看結(jié)構(gòu)體的成員變量:
typedef struct { uint8_t NVIC_IRQChannel; uint8_t NVIC_IRQChannelPreemptionPriority; uint8_t NVIC_IRQChannelSubPriority; FunctionalState NVIC_IRQChannelCmd; } NVIC_InitTypeDef;
NVIC_InitTypeDef結(jié)構(gòu)體中間有四個成員變量,這四個成員變量的作用是:
NVIC_IRQChannel:
定義初始化的是哪個中斷,這個我們可以在CKS32f4xx.h中定義的枚舉類型IRQn的成員變量中可以找到每個中斷對應(yīng)的名字。例如串口1對應(yīng)USART1_IRQn。
NVIC_IRQChannelPreemptionPriority:
定義這個中斷的搶占優(yōu)先級別;
NVIC_IRQChannelSubPriority:
定義這個中斷的響應(yīng)優(yōu)先級別。
NVIC_IRQChannelCmd:
該中斷通道是否使能。比如我們要使能串口1的中斷,同時設(shè)置搶占優(yōu)先級為1,響應(yīng)優(yōu)先級位2,初始化的方法是:
NVIC_InitTypeDefNVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//>>串口 1 中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//>> 搶占優(yōu)先級為 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//>> 響應(yīng)優(yōu)先級位 2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //>>IRQ 通道使能 NVIC_Init(&NVIC_InitStructure);
這里我們講解了中斷的分組的概念以及設(shè)定優(yōu)先級值的方法,至于每種優(yōu)先級還有一些關(guān)于清除中斷,查看中斷狀態(tài),這在后面課堂中我們講解每個中斷的時候會詳細講解到。
課程總結(jié)
中斷優(yōu)先級設(shè)置的步驟:
1.系統(tǒng)初始化的時候設(shè)置中斷分組:
確定組號,也就是確定搶占優(yōu)先級和響應(yīng)優(yōu)先級的分配位數(shù)。調(diào)用函數(shù)為NVIC_PriorityGroupConfig();
2.設(shè)置所用到的中斷的中斷優(yōu)先級別:
對每個中斷調(diào)用函數(shù)NVIC_Init();確定具體的搶占優(yōu)先級和響應(yīng)優(yōu)先級,并使能通道。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5423瀏覽量
123429 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1410瀏覽量
41118 -
中斷
+關(guān)注
關(guān)注
5文章
904瀏覽量
42532 -
MDK
+關(guān)注
關(guān)注
4文章
211瀏覽量
32519 -
NVIC
+關(guān)注
關(guān)注
0文章
36瀏覽量
11952
原文標題:MCU微課堂 | CKS32F4xx系列產(chǎn)品 NVIC中斷優(yōu)先級管理
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
MCU微課堂|CKS32F4xx系列產(chǎn)品時鐘配置
STM32學(xué)習(xí)筆記(4)——NVIC中斷優(yōu)先級管理和外部中斷EXTI

STM32f1學(xué)習(xí)筆記五NVIC中斷優(yōu)先級管理

CKS32F4xx系列產(chǎn)品串口DMA傳輸
CKS32F4xx系列產(chǎn)品的定時器使用-基本特征和定時操作

CKS32F4xx系列FSMC功能簡介

評論