朋友們,如果你需要在
stm32
上移植rtos
,那麼首先必須深入理解它的中斷系統。
什麼是nvic?
即巢狀向量中斷控制器
(nested vectored interrupt controller)
。stm32
的中有乙個強大而方便的
nvic
,它是屬於
cortex
核心的器件,不可遮蔽中斷
(nmi)
和外部中斷都由它來處理,而
systick
不是由nvic
來控制的。
特性: ●
60個可遮蔽中斷通道
(不包含16個
cortex
™-m3
的中斷線);
●16個可程式設計的優先等級
(使用了
4位中斷優先順序);
●低延遲的異常和中斷處理; ●
電源管理控制; ●
系統控制暫存器的實現;
1.中斷優先順序分組
stm32(cortex-m3)
中有兩個優先順序的概念
--搶占式優先順序和響應優先順序,有人把響應優先順序稱作
'亞優先順序'或
'副優先順序
',每個中斷源都需要被指定這兩種優先順序。
具有高搶占式優先順序的中斷可以在具有低搶占式優先順序的中斷處理過程中被響應,即中斷巢狀,或者說高搶占式優先順序的中斷可以巢狀在低搶占式優先順序的中斷中。
當兩個中斷源的搶占式優先順序相同時,這兩個中斷將沒有巢狀關係,當乙個中斷到來後,如果正在處理另乙個中斷,這個後到來的中斷就要等到前乙個中斷處理完之後才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先順序高低來決定先處理哪乙個;如果他們的搶占式優先順序和響應優先順序都相等,則根據他們在中斷表中的排位順序決定先處理哪乙個。
cortex
核心具有強大的異常響應系統,它把能夠打斷當前**執行流程的事件分為異常
(exception)
和中斷(interrupt)
,並把它們用乙個表管理起來,編號為
0~15
的稱為核心異常,而
16以上的則稱為外部中斷,這個表就稱為中斷向量表。
正是因為每個中斷源都需要被指定這兩種優先順序,就需要有相應的暫存器位記錄每個中斷的優先順序;在
cortex-m3
中定義了
8個位元位用於設定中斷源的優先順序,這
8個位元位可以有
8種分配方式,如下: 1.
所有8位用於指定響應優先順序
2.最高
1位用於指定搶占式優先順序,最低
7位用於指定響應優先順序 3.
最高2位用於指定搶占式優先順序,最低
6位用於指定響應優先順序 4.
最高3位用於指定搶占式優先順序,最低
5位用於指定響應優先順序 5.
最高4位用於指定搶占式優先順序,最低
4位用於指定響應優先順序 6.
最高5位用於指定搶占式優先順序,最低
3位用於指定響應優先順序 7.
最高6位用於指定搶占式優先順序,最低
2位用於指定響應優先順序 8.
最高7位用於指定搶占式優先順序,最低
1位用於指定響應優先順序
以上便是優先順序分組的概念,但是
cortex-m3
允許具有較少中斷源時使用較少的暫存器位指定中斷源的優先順序。 而
stm32
對這個表重新進行了編排,把編號從-3至
6的中斷向量定義為系統異常,編號為負的核心異常不能被設定優先順序,如復位
(reset)
、不可遮蔽中斷
(nmi)
、硬錯誤
(hardfault)
。從編號
7開始的為外部中斷,這些中斷的優先順序都是可以使用者更改的。詳細的
stm32
中斷向量號可以在
startup_stm32f10x_xx.s
中查詢。 因此
stm32
把指定中斷優先順序的暫存器位減少到
4位,這
4個暫存器位的分組方式如下: 第
0組:所有
4位用於指定響應優先順序(
16種) 第
1組:最高
1位用於指定搶占式優先順序,最低
3位用於指定響應優先順序(8種
) 第2
組:最高
2位用於指定搶占式優先順序,最低
2位用於指定響應優先順序(4種
) 第3
組:最高
3位用於指定搶占式優先順序,最低
1位用於指定響應優先順序(2種
) 第4
組:所有
4位用於指定搶占式優先順序
這裡便對於於文章最前提到的韌體庫里相關的函式了——
nvic_prioritygroupconfig(u32 nvic_prioritygroup)
,函式的引數共有5種:
這個函式的引數
(nvic_prioritygroup值)
有下列5種:
nvic_prioritygroup_0 =>
選擇第0組
nvic_prioritygroup_1 =>
選擇第1組
nvic_prioritygroup_2 =>
選擇第2組
nvic_prioritygroup_3 =>
選擇第3組
nvic_prioritygroup_4 =>
選擇第4組
這其實也很好理解,比如選擇
nvic_prioritygroup_1
,那麼搶占式優先順序便佔一位,也就是說可以有
2^1個級別,可以設定為0和
1,而響應優先順序則佔
3位,也就是說可以有
2^3個選擇,可以設定為
0~7;總共來說就可以區別
>16
種優先順序了。
//nvic_initstructure.nvic_irqchannelpreemptionpriority = 1;
//nvic_initstructure.nvic_irqchannelsubpriority = 0;
舉個例子吧,假如現在有
4個外部中斷,還有乙個
exti9_5
中斷,那麼如果選擇優先順序分組為第
1組,那麼搶占式優先順序便只有兩種,
5個中斷就至少有
3個在搶占式優先順序上是相同的優先順序上,其他兩個在令一優先級別。接著設定響應優先順序可以有
8種選擇;
假如現在同時有兩個搶占式優先級別相同的中斷發生,那麼處理的順序是誰的響應優先順序高則誰優先進入中斷
,另外這點是需要注意的,如果此時進入這個中斷之後又來了乙個搶占式優先順序相同但是響應優先順序更高的中斷,這時也是不會打斷已有的中斷的
。void nvic_config(void)
說明:假如tim3是正在執行的中斷,如果usart1中斷也發生了,則優先處理,tim3被巢狀並掛起;如果tim2中斷發生了,則需要等到tim3處理完之後再處理tim2。這就是搶占優先順序和響應優先順序的區別。
STM32之NVIC的深入詳解
朋友們,如果你需要在 stm32 上移植rtos 那麼首先必須深入理解它的中斷系統。什麼是nvic?即巢狀向量中斷控制器 nested vectored interrupt controller stm32 的中有乙個強大而方便的 nvic 它是屬於 cortex 核心的器件,不可遮蔽中斷 nmi ...
stm32之NVIC的使用
nvic nested vectored interrupt controller 巢狀向量中斷控制器 nvic主要用於對一些中斷的處理,在stm32中,中斷服務程式統一放在乙個 stm32f10x it.c檔案裡,這個檔案裡開始只放了一些系統異常的介面,如果我們要寫一些自己的普通的中斷函式,就要自...
stm32學習筆記 NVIC
這部分講的很好。misc.件其實就是stm32f10x nvic.h,nvic的主要操作都在其中,還包括systick的選擇源操作。core cm3檔案裡面是核心外設,當然包括nvic,l裡面包含nvic的暫存器操作。高達81個中斷,實際上是67stm外設中斷 60個settable,由庫函式int...