整合了網上幾篇部落格,再加上自己的理解
nvic全稱為
nest vector interrupt controller,
人們一般稱之為
「巢狀中斷向量控制器
」,是用來管理中斷巢狀的,核心任務就是在於其優先順序的管理。
nvic
給每個中斷賦予先佔優先順序和次佔優先順序。它們的關係描述如下:
1、擁有較高先佔優先順序的中斷可以打斷先佔優先順序較低的中斷(類似前面所說的執行優先順序)。
2、若兩個先佔優先順序的中斷同時掛起,則優先執行次佔優先順序較高的中斷。
3、若兩個掛起的中斷兩個優先順序都一致,則優先執行位於中斷向量表中位置較高的中斷。
4、無論任何時刻,次佔優先順序都不會造成中斷巢狀,即是說中斷巢狀完全是由先佔優先順序決定的。
nvic通過優先順序分組來分配先佔優先順序和次佔優先順序的數量。
中有兩個優先順序的概念
——搶占式優先順序和響應
優先順序, 有人把響應優先順序稱作
'亞優先順序'或
'副優先順序
', 每個中斷源
都需要被指定這兩種優先順序。
具有高搶占式優先順序的中斷可以在具有低搶占式優先順序的中斷處
理過程中被響應, 即中斷巢狀, 或者說高搶占式優先順序的中斷可以嵌
套低搶占式優先順序的中斷。
當兩個中斷源的搶占式優先順序相同時,這兩個中斷將沒有巢狀關係,
當乙個中斷到來後, 如果正在處理另乙個中斷, 這個後到來的中斷就
要等到前乙個中斷處理完之後才能被處理。如果這兩個中斷同時到達,
則中斷控制器根據他們的響應優先順序高低來決定先處理哪乙個;如果
他們的搶占式優先順序和響應優先順序都相等,則根據他們在中斷表中的
排位順序決定先處理哪乙個。
既然每個中斷源都需要被指定這兩種優先順序,就需要有相應的寄存
器位記錄每個中斷的優先順序;在
cortex-m3
中定義了
8個位元位用於
設定中斷源的優先順序, 這
8個位元位可以有
8種分配方式, 如下:
所有 8
位用於指定響應優先順序
最高 1
位用於指定搶占式優先順序, 最低
7位用於指定響應優先順序
最高 2
位用於指定搶占式優先順序, 最低
6位用於指定響應優先順序
最高 3
位用於指定搶占式優先順序, 最低
5位用於指定響應優先順序
最高 4
位用於指定搶占式優先順序, 最低
4位用於指定響應優先順序
最高 5
位用於指定搶占式優先順序, 最低
3位用於指定響應優先順序
最高 6
位用於指定搶占式優先順序, 最低
2位用於指定響應優先順序
最高 7
位用於指定搶占式優先順序, 最低
1位用於指定響應優先順序
這就是優先順序分組的概念。
cortex-m3
允許具有較少中斷源時使用較少的暫存器位指定中斷源的
優先順序, 因此
stm32
把指定中斷優先順序的暫存器位減少到
4位, 這
4個暫存器位的分組方式如下:第 0
組: 所有
4位用於指定響應優先順序第 1
組: 最高
1位用於指定搶占式優先順序, 最低
3位用於指定響應優
先級第
2組: 最高
2位用於指定搶占式優先順序, 最低
2位用於指定響應優
先級第
3組: 最高
3位用於指定搶占式優先順序, 最低
1位用於指定響應優
先級第
4組: 所有
4位用於指定搶占式優先順序
可 以 通 過 調 用
stm32
的 固 件 庫 中 的 函 數
nvic_prioritygroupconfig()
選擇使用哪種優先順序分組方式,這個函式
的引數有下列 5種:
nvic_prioritygroup_0 =>
選擇第 0組
nvic_prioritygroup_1 =>
選擇第 1組
nvic_prioritygroup_2 =>
選擇第 2組
nvic_prioritygroup_3 =>
選擇第 3組
nvic_prioritygroup_4 =>
選擇第 4組
接下來就是指定中斷源的優先順序,下面以乙個簡單的例子說明如何指
定中斷源的搶占式優先順序和響應優先順序:
//選擇使用優先順序分組第 1組
nvic_prioritygroupconfig(nvic_prioritygroup_1);
//使能
exti0
中斷nvic_initstructure.nvic_irqchannel= exti0_irqn; //
這裡原來
為 exti10_5_irqchannel,
但要改為
exti10_5_irqn
nvic_initstructure.nvic_irqchannelpreemptionpriority= 1; //
指 定搶占式優先級別
1stm32 nvic總結!
非常全, 非常給力
nvic_initstructure.nvic_irqchannelsubpriority= 0; //
指定響應優
先級別
0nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
//使能
exti9_5
中斷nvic_initstructure.nvic_irqchannel= exti9_5_irqn; //
這裡原來
為 exti9_5_irqchannel,
但要改為
exti9_5_irqn
nvic_initstructure.nvic_irqchannelpreemptionpriority= 0; //
指 定搶占式優先級別
0nvic_initstructure.nvic_irqchannelsubpriority= 1; //
指定響應優
先級別
1nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
要注意的幾點是:
1) 如果指定的搶占式優先級別或響應優先級別超出了選定的優先順序
分組所限定的範圍, 將可能得到意想不到的結果;
2) 搶占式優先級別相同的中斷源之間沒有巢狀關係;
3) 如果某個中斷源被指定為某個搶占式優先級別, 又沒有其它中斷
源處於同乙個搶占式優先級別,則可以為這個中斷源指定任意有效的
響應優先順序
STM32 NVIC基本理解
nvic兩個屬性 搶占屬性 響應屬性 編號越小,優先順序越高 nvic irqchannelsubpriority 引數配置例子 三個中斷向量a b c 中斷向量名稱 搶占優先順序 響應優先順序a0 0b10 c11 此處中斷a可以打斷中斷b,但b不能打斷c。兩個要點 1 若兩個中斷的搶占優先順序和...
STM32 NVIC中斷優先順序的理解
我們在學習stm32中串列埠啊,定時器啊等等,都會遇到設定相應的優先順序。下面來揭下這個神秘的面具。我們知道優先順序有兩種 搶占式優先順序preemptionpriority 和 子優先順序 響應優先順序 subpriority。具有高優先順序的中斷可以在低優先順序正在執行時打斷其執行,然後執行自己...
關於STM32 NVIC配置的解釋
大部分學習用的開發板在配置各個外設的中斷優先順序時,習慣在每個外設的初始化檔案裡都進行nvic group配置,例如在adc和usart都有nvic的配置如下 adc中 void adc nvic configuration void usart中 void nvic configuration v...