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