STM32學習心得十三 NVIC中斷優先順序管理

2021-10-04 18:44:21 字數 4245 閱讀 3465

記錄一下,方便以後翻閱~

主要內容:

1) nvic中斷優先順序分組;

2) nvic中斷優先順序設定。

官方資料:《stm32中文參考手冊v10》第9章——中斷和事件

1. nvic中斷優先順序分組

1.1 cm3核心支援256個中斷,其中包含16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定;

1.2 stm32並沒有使用cm3核心的全部東西,只用了它的一部分;

1.3 stm32有84個中斷,包括16個核心中斷和68個可遮蔽中斷,具有16級可程式設計的中斷優先順序;

1.4 stm32f103系列上面,又只有60個可遮蔽中斷(在107系列才有68個)。

2. nvic中斷優先順序向量表(stm32f10xx產品(非互聯型))

3. nvic中斷優先順序管理方法

3.1 對stm32中斷進行分組,組0~4。同時,對每個中斷設定乙個搶占優先順序和乙個響應優先順序值;

3.2 分組配置是在暫存器scb->aircr中配置:

3.3 分組配置是在暫存器scb->aircr中配置。

4. 搶占優先順序和響應優先順序區別

4.1 高優先順序(值越小越高)的搶占優先順序是可以打斷正在進行的低搶占優先順序中斷的;

4.2 搶占優先順序相同的中斷,高響應優先順序不可以打斷低響應優先順序的中斷;

4.3 搶占優先順序相同的中斷,當兩個中斷同時發生的情況下,高響應優先順序先執行;

4.4 如果兩個中斷的搶占優先順序和響應優先順序都是一樣的話,則看哪個中斷先發生就先執行。

舉例:

假定設定中斷優先順序組為2,

設定中斷3(rtc中斷)的搶占優先順序為2,響應優先順序為1;

設定中斷6(外部中斷0)的搶占優先順序為3,響應優先順序為0;

設定中斷7(外部中斷1)的搶占優先順序為2,響應優先順序為0。

那麼這3個中斷的優先順序順序為:中斷7>中斷3>中斷6

**備註:**一般情況下,系統**執行過程中,只設定一次中斷優先順序分組,比如分組2,設定好分組之後一般不會再改變分組。隨意改變分組會導致中斷管理混亂,程式出現意想不到的執行結果。

5. 中斷優先順序分組函式:

void

nvic_prioritygroupconfig

(uint32_t nvic_prioritygroup)

//例如nvic_prioritygroupconfig(nvic_prioritygroup_2);//

6. mdk中nvic暫存器結構體

typedef

struct

nvic_type;

7. 每個中斷的優先順序設定1.1 中斷優先順序控制的暫存器組:ip[240] (全稱:interrupt priority registers)

240個8位暫存器,每個中斷使用乙個暫存器來確定優先順序。stm32f10x系列一共60個可遮蔽中斷,使用ip[59]~ip[0]。每個ip暫存器的高4位用來設定搶占和響應優先順序(根據分組),低4位沒有用到。

相關函式:

void

nvic_init

(nvic_inittypedef* nvic_initstruct)

;

7.2 中斷使能暫存器組:iser[8] (作用:用來使能中斷)

32位暫存器,每個位控制乙個中斷的使能。stm32f10x只有60個可遮蔽中斷,所以只使用了其中的iser[0]和iser[1]。iser[0]的bit0bit31分別對應中斷031。iser[1]的bit027對應中斷3259。

相關函式:

void

nvic_init

(nvic_inittypedef* nvic_initstruct)

;

7.3 中斷失能暫存器組:icer[8] (作用:用來失能中斷)

32位暫存器,每個位控制乙個中斷的失能。stm32f10x只有60個可遮蔽中斷,所以只使用了其中的icer[0]和icer[1]。icer[0]的bit0bit31分別對應中斷031。icer[1]的bit027對應中斷3259。

相關函式:

void

nvic_init

(nvic_inittypedef* nvic_initstruct)

;

7.4 中斷掛起控制暫存器組:ispr[8] (作用:用來掛起中斷)

7.5 中斷解掛控制暫存器組:icpr[8] (作用:用來解掛中斷)

和7.5涉及的部分相關函式//

static __inline void

nvic_setpendingirq

(irqn_type irqn)

;static __inline uint32_t nvic_getpendingirq

(irqn_type irqn)

;static __inline void

nvic_clearpendingirq

(irqn_type irqn)

;//以上函式位於core_cm3.**件中//

static __inline uint32_t nvic_getactive

(irqn_type irqn)

;

8. 中斷引數初始化函式解讀

void

nvic_init

(nvic_inittypedef* nvic_initstruct)

;typedef

struct

nvic_inittypedef;

//位於misc.**件中//

nvic_inittypedef nvic_initstructure;

nvic_initstructure.nvic_irqchannel = usart1_irqn;

//串列埠1中斷,中斷型別參考stm32f10x.h中的irqn_tpye;//

nvic_initstructure.nvic_irqchannelpreemptionpriority=1;

//搶占優先順序為1//

nvic_initstructure.nvic_irqchannelsubpriority=2;

//響應優先順序位2//

nvic_initstructure.nvic_irqchannelcmd= enable;

//irq通道使能//

nvic_init

(&nvic_initstructure)

;//根據上面指定的引數初始化nvic暫存器//

9. 中斷優先順序設定步驟9.1 系統執行後先設定中斷優先順序分組;

void

nvic_prioritygroupconfig

(uint32_t nvic_prioritygroup)

;//整個系統執行過程中,只設定一次中斷分組;//

9.2 針對每個中斷,設定對應的搶占優先順序和響應優先順序;

void

nvic_init

(nvic_inittypedef* nvic_initstruct)

;

1)複習基於庫函式的初始化函式的一般格式,可參考stm32學習心得三:gpio實驗-基於庫函式;

2)複習暫存器位址,可參考stm32學習心得四:gpio實驗-基於暫存器和stm32學習心得五:gpio實驗-基於位操作;

3)複習暫存器位址名稱對映,可參考stm32學習心得六:相關c語言學習及暫存器位址名稱對映解讀。

STM32學習心得(1)

學stm32的目的只是為了可以讓乙個電機轉動起來,哈哈哈是不是感覺沒什麼大目標。但是能讓電機轉起來就覺得很有成就感。我在學之前有的概念就是 pwm,can,輸入輸出啥的,然而卻並不知道是幹什麼的。前一段時間在 上買了一款stmf103的板子,買回來後裝了keil4花了好幾個小時,又花了好幾個小時配置...

stm32學習筆記 NVIC

這部分講的很好。misc.件其實就是stm32f10x nvic.h,nvic的主要操作都在其中,還包括systick的選擇源操作。core cm3檔案裡面是核心外設,當然包括nvic,l裡面包含nvic的暫存器操作。高達81個中斷,實際上是67stm外設中斷 60個settable,由庫函式int...

STM32學習筆記 五 NVIC

三 中斷程式設計 f407在核心水平上搭載了乙個異常響應系統,支援為數眾多的系統異常和中斷,其中系統異常有10個,中斷有82個。nvic是巢狀向量中斷控制器,控制著整個晶元中斷相關的功能,它跟核心緊密耦合,是核心裡面的乙個外設。在配置中斷的時候一般只用iser icer和ip這三個暫存器,iser用...