在外部中斷和中斷控制器中,我們首先闡述嵌套向量中斷控制器(NVIC),他和處理器核的接口緊緊相連??梢詫崿F(xiàn)低延時的中斷處理和處理晚到的中斷。主要具有以下幾個特點:
1.60個可屏蔽中斷通道;
2.16個可編程的優(yōu)先等級;
3.低延時的異常和中斷處理;
4.電源管理控制;
5.系統(tǒng)控制寄存器的實現(xiàn)。
其中每一個STM32系列芯片都會有一個產(chǎn)品向量表,博友們可以在相關 產(chǎn)品說明書中查看具體的中斷問題。
接下來介紹中斷優(yōu)先級
在M3中有兩個優(yōu)先級的概念-搶占優(yōu)先級和響應優(yōu)先級。每一個中斷源都必須指定這兩種優(yōu)先級。這里的中斷搶占其實和89C51差不多,高中斷優(yōu)先級可以搶占正在進行中斷處理的低中斷優(yōu)先級,也就是我們所說的中斷嵌套。學習過51單片機的人這一點應該不是很難理解。如果兩個中斷源的優(yōu)先級相同,就沒有嵌套一說。不過當兩個中斷同時到達時,就要按照他們的響應優(yōu)先級的高低來決定先處理誰。在如果他們的搶占優(yōu)先級和相應優(yōu)先級都相同,就要根據(jù)他們在中斷向量表中的前后順序來決定先出來誰。
每一個中斷源都需要指定這兩種優(yōu)先級,也就是說在中斷配置中,必須兩種優(yōu)先級多要配置。所以說需要相應的寄存器位來記錄每個中斷的優(yōu)先級。在M3中定義了8bit位用于設置中斷源的優(yōu)先級,但是也具有較少中斷源時使用較少的寄存器位指定中斷源的優(yōu)先級,所以STM32把指定中斷優(yōu)先級的寄存器位減少到4位。具體分組為:
第0組:所有4為用于指定響應式優(yōu)先級
第1組:最高1位用于指定搶占式優(yōu)先級,最低3位用于指定響應式優(yōu)先級;
第2組:最高2位用于指定搶占式優(yōu)先級,最低2位用于指定響應式優(yōu)先級;
第3組:最高3位用于指定搶占式優(yōu)先級,最低1位用于指定響應式優(yōu)先級;
第4組:所有4位都用于指定搶占式優(yōu)先級。
我們也可以通過調用STM32固件庫中的函數(shù)NVIC_PritorityGroupConfig()來選擇使用哪一組優(yōu)先級分組方式。
我們用一個例子來說明如何指定中斷源的搶占式優(yōu)先級和響應式優(yōu)先級。
//選擇使用優(yōu)先級分組1
NVIC_PritorityGroupConfig(NVIC_PritorityGroup_1);
//使能EXTI0
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//指定搶占優(yōu)先級組別1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//指定響應優(yōu)先級0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//使能ENTI9_5
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//指定搶占優(yōu)先級組別1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//指定響應優(yōu)先級0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
其中要注意以下幾點:如果指定的搶占式優(yōu)先級別或響應優(yōu)先級別超出了選定的優(yōu)先級分組所限定的范圍,會有其他的結果出現(xiàn);
搶占式優(yōu)先級別相同的中端源沒有嵌套關系
如果某個中斷源被指定為某個搶占式優(yōu)先級別,又沒有其他中斷源處于同一搶占式優(yōu)先組別,則可以為這個中斷源指定任意有效的響應優(yōu)先級別。