首先,對
stm32
中斷進行分組,組
0~4。同時,對每個中斷設定乙個搶占優先順序和乙個響應優先順序值。
分組配置是在暫存器
scb->aircr
中配置:
組
aircr[10:8]
ip 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位響應優先順序
搶占優先順序
& 響應優先順序區別:
中斷優先順序分組函式:
void
nvic_prioritygroupconfig
(uint32_t
nvic_prioritygroup
);
void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup)
nvic_prioritygroupconfig(nvic_prioritygroup_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]~ip[0]。
每個ip
暫存器的高
4位用來設定搶占和響應優先順序(根據分組),低
4位沒有用到。
void
nvic_init
(nvic_inittypedef
* nvic_initstruct);
中斷使能暫存器組
:iser[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);
中斷
失能暫存器組
:icer[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暫存器
中斷優先順序設定步驟① 系統執行後先設定中斷優先順序分組。呼叫函式:
void
nvic_prioritygroupconfig
(uint32_t
nvic_prioritygroup
);整個系統執行過程中,只設定一次中斷分組。
②針對每個中斷,設定對應的搶占優先順序和響應優先順序:
void
nvic_init
(nvic_inittypedef
* nvic_initstruct
);③ 如果需要掛起
/解掛,檢視中斷當前啟用狀態,分別呼叫相關函式即可。
NVIC中斷優先順序管理
1.stm32的中斷分組 每個中斷設定乙個搶占優先順序和乙個響應優先順序值,分組配置是在暫存器scb aircr中配置。注意 一般情況下,系統 執行過程中,只設定一次中斷優先順序分組 數值越小所代表的優先順序就越高。1 高優先順序的搶占優先順序可以打斷正在進行的低搶占優先順序中斷的。2 搶占優先順序...
NVIC中斷優先順序管理
1 參考資料 stm32f1開發指南 庫函式版本 4.5 小節 中斷優先順序分組管理 stm32中文參考手冊v10 第9章 中斷和事件 2 nvic中斷優先順序分組 cm3核心支援256個中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。stm32並沒有使用cm...
NVIC中斷優先順序分組
cm7核心支援256個中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。f7並沒有是由cm4核心的全部東西,而是只用了它的一部分。stm32f76x總共118個中斷,10個核心中斷,108個可遮蔽中斷。stm32具有16級可程式設計的中斷優先順序,而我們常用的就...