NVIC中斷優先順序管理

2021-07-31 13:10:48 字數 3575 閱讀 1093

1、參考資料

《stm32f1開發指南-庫函式版本》-4.5 小節 中斷優先順序分組管理

《stm32中文參考手冊v10》-第9章 中斷和事件

2、nvic中斷優先順序分組

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

·stm32並沒有使用cm3核心的全部東西,而是只用了它的一部分。

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

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

中斷管理方法:

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

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

搶占優先順序&響應優先順序區別:

·高優先順序的搶占優先順序是可以打斷正在進行的低搶占優先順序中斷的。

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

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

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

·舉例假定設定中斷優先順序組為2,然後設定中斷3(rtc中斷)的搶占優先順序為2,響應優先順序為1.

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

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

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

·特別說明

一般情況下,系統**執行過程中,只設定一次中斷優先順序分組,比如分組2,設定好分組之後一般

不會再改變分組。隨意改變分組會導致中斷管理混亂,程式出現意想不到的執行結果。

·中斷優先順序分組函式:

void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup);

void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup)

nvic_prioritygroupconfig(nvic_prioritygroup_2);  //設定為分組2

·設定單個中斷的搶占優先順序和響應優先順序:

中斷設定相關暫存器

__io uint8_t  ip[240]; //中斷優先順序控制的暫存器組

__io uint32_t iser[8]; //中斷使能暫存器組

__io uint32_t icer[8]; //中斷失能暫存器組

__io uint32_t ispr[8]; //中斷掛起暫存器組

__io uint32_t icpr[8]; //中斷解掛暫存器組

__io uint32_t iabr[8]; //中斷啟用標誌位暫存器組

·mdk中nvic暫存器結構體

typedef struct

nvic_type;

·對於每個中斷怎麼設定優先順序?

中斷優先順序控制的暫存器組:ip[240]

全稱是:interrupt priority registers

240個8位暫存器,每個中斷使用乙個暫存器來確定優先順序。

stm32f10x系列一共60個可遮蔽中斷,使用ip[59]~[0]。

每個ip暫存器的高4位用來設定搶占和響應優先順序(根據分組),低4位沒有用到。

void nvic_init(nvic_inittypedef* nvic_initstruct);

·中斷使能暫存器組:isr[8]

作用:用來使能中斷

32位暫存器,每個位控制乙個中斷使能。stm32f10x只有60個可遮蔽中斷,所以只使用了其中的iser[0]和iser[1].

iser[0]的bit0~bit31分別對應中斷0~31.iser[1]的bit0~27對應中斷32~59

void nvic_init(nvic_inittypedef* nvic_initstruct);

·中斷失能暫存器:isr[8]

作用:用來失能中斷

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

icer[0]的bit0~bit31分別對應中斷0~31.icer[1]的bit0~27對應中斷32~59

配置方法和iser一樣

void nvic_init(nvic_inittypedef* nvic_initstruct);

·中斷掛起控制暫存器:ispr[8]

作用:用來掛起中斷

·中斷解掛控制暫存器:icpr[8]

作用:用來解掛中斷

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)

·中斷啟用標誌位暫存器組:iabr[8]

作用:唯讀,通過它可以知道當前在執行的中斷是哪乙個,如果對應位為1,說明該中斷正在執行

static __inline uint32_t nvic_getactive(irqn_type irqn)

·中斷引數初始化函式

void nvic_init(nvic_inittypedef* nvic_initstruct);

typedef struct

nvic_inittypedef;

nvic_inittypedef   nvic_initstructure;

nvic_initstructure.nvic_irqchannel = usart1_irqn;//串列埠1中斷

nvic_initstructure.nvic_irqchannelpreemptionpriority=1 ;// 搶占優先順序為1

nvic_initstructure.nvic_irqchannelsubpriority = 2;// 子優先順序位2

nvic_initstructure.nvic_irqchannelcmd = enable;//irq通道使能

nvic_init(&nvic_initstructure);    //根據上面指定的引數初始化nvic暫存器

·中斷優先順序設定步驟

1)系統執行後先設定中斷優先順序分組。呼叫函式:

void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup);

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

2)針對每個中斷,設定對應的搶占優先順序和響應優先順序:

void nvic_init(nvic_inittypedef* nvic_initstruct);

3)如果需要掛起/解掛,檢視中斷當前啟用狀態,分別呼叫相關函式即可。

NVIC中斷優先順序管理

1.stm32的中斷分組 每個中斷設定乙個搶占優先順序和乙個響應優先順序值,分組配置是在暫存器scb aircr中配置。注意 一般情況下,系統 執行過程中,只設定一次中斷優先順序分組 數值越小所代表的優先順序就越高。1 高優先順序的搶占優先順序可以打斷正在進行的低搶占優先順序中斷的。2 搶占優先順序...

NVIC中斷優先順序管理

首先,對 stm32 中斷進行分組,組 0 4。同時,對每個中斷設定乙個搶占優先順序和乙個響應優先順序值。分組配置是在暫存器 scb aircr 中配置 組 aircr 10 8 ip bit 7 4 分配情況 分配結果 0 111 0 4 0位搶占優先順序,4位響應優先順序 1 110 1 3 1...

NVIC中斷優先順序分組

cm7核心支援256個中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。f7並沒有是由cm4核心的全部東西,而是只用了它的一部分。stm32f76x總共118個中斷,10個核心中斷,108個可遮蔽中斷。stm32具有16級可程式設計的中斷優先順序,而我們常用的就...