STM32中斷管理函數
通過(guò)以上兩個(gè)函數就實(shí)現了對 NVIC 的管理和配置。但是外部中斷的設置,還需要配置相
關(guān)寄存器才可以。下面就介紹外部中斷的配置和使用。
STM32 的EXTI 控制器支持19 個(gè)外部中斷/事件請求。每個(gè)中斷設有狀態(tài)位,每個(gè)中斷/事
件都有獨立的觸發(fā)和屏蔽設置。STM32 的19 個(gè)外部中斷為:
線(xiàn) 0~15:對應外部IO 口的輸入中斷。
線(xiàn) 16:連接到PVD 輸出。
線(xiàn) 17:連接到RTC 鬧鐘事件。
線(xiàn) 18:連接到USB 喚醒事件。
對于外部中斷 EXTI 控制MDK 定義了如下結構體:
typedef struct
{
vu32 IMR;
vu32 EMR;
vu32 RTSR;
vu32 FTSR;
vu32 SWIER;
vu32 PR;
} EXTI_TypeDef;
通過(guò)這些寄存器的設置,就可以對外部中斷進(jìn)行詳細設置了。下面我們就重點(diǎn)介紹這些寄
存器的作用。
IMR:中斷屏蔽寄存器。這是一個(gè)32 寄存器。但是只有前19 位有效。當位x 設置為1 時(shí),
則開(kāi)啟這個(gè)線(xiàn)上的中斷,否則關(guān)閉該線(xiàn)上的中斷。
EMR:事件屏蔽寄存器,同IMR,只是該寄存器是針對事件的屏蔽和開(kāi)啟。
RTSR:上升沿觸發(fā)選擇寄存器。該寄存器同IMR,也是一個(gè)32 為的寄存器,只有前19
位有效。位x 對應線(xiàn)x 上的上升沿觸發(fā),如果設置為1,則是允許上升沿觸發(fā)中斷/事件。否則,
不允許。
FTSR:下降沿觸發(fā)選擇寄存器。同PTSR,不過(guò)這個(gè)寄存器是設置下降沿的。下降沿和上
升沿可以被同時(shí)設置,這樣就變成了任意電平觸發(fā)了。
SWIER:軟件中斷事件寄存器。通過(guò)向該寄存器的位x 寫(xiě)入1,在未設置IMR 和EMR 的
時(shí)候,將設置PR 中相應位掛起。如果設置了IMR 和EMR 時(shí)將產(chǎn)生一次中斷。被設置的SWIER
位,將會(huì )在PR 中的對應位清除后清除。
PR:掛起寄存器。當外部中斷線(xiàn)上發(fā)生了選擇的邊沿事件,該寄存器的對應位會(huì )被置為1。
0,表示對應線(xiàn)上沒(méi)有發(fā)生觸發(fā)請求。通過(guò)向該寄存器的對應位寫(xiě)入1 可以清除該位。在中斷服
務(wù)函數里面經(jīng)常會(huì )要向該寄存器的對應位寫(xiě)1 來(lái)清除中斷請求。
以上就是與中斷相關(guān)寄存器的介紹,更詳細的介紹,請參考《STM32 參考手冊》第95 頁(yè),
8.3 節EXTI 寄存器描述這一章。
通過(guò)以上配置就可以正常設置外部中斷了,但是外部 IO 口的中斷,還需要一個(gè)寄存器配
置,也就是IO 復用里的外部中斷配置寄存器EXTICR。這是因為STM32 任何一個(gè)IO 口都可
以配置成中斷輸入口,但是IO 口的數目遠大于中斷線(xiàn)數(16 個(gè))。于是STM32 就這樣設計,
GPIOA~GPIOG 的[15:0]分別對應中斷線(xiàn)15~0。這樣每個(gè)中斷線(xiàn)對應了最多7 個(gè)IO 口,以線(xiàn)0
為例:它對應了GPIOA.0、PIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而
中斷線(xiàn)每次只能連接到1 個(gè)IO 口上,這樣就需要EXTICR來(lái)決定對應的中斷線(xiàn)配置到哪個(gè)GPIO
上了。
EXTICR 在A(yíng)FIO 的結構體中定義,如下:
typedef struct
{
vu32 EVCR;
vu32 MAPR;
vu32 EXTICR[4];
} AFIO_TypeDef;
EXTICR 寄存器組,總共有4 個(gè),因為編譯器的寄存器組都是從0 開(kāi)始編號的,所以
EXTICR[0]~ EXTICR[3],對應《STM32 參考手冊》里的EXTICR1~ EXTICR 4。每個(gè)EXTICR
只用了其低16 位。EXTICR[0]的分配如下:
時(shí)候,將設置PR 中相應位掛起。如果設置了IMR 和EMR 時(shí)將產(chǎn)生一次中斷。被設置的SWIER
位,將會(huì )在PR 中的對應位清除后清除。
PR:掛起寄存器。當外部中斷線(xiàn)上發(fā)生了選擇的邊沿事件,該寄存器的對應位會(huì )被置為1。
0,表示對應線(xiàn)上沒(méi)有發(fā)生觸發(fā)請求。通過(guò)向該寄存器的對應位寫(xiě)入1 可以清除該位。在中斷服
務(wù)函數里面經(jīng)常會(huì )要向該寄存器的對應位寫(xiě)1 來(lái)清除中斷請求。
以上就是與中斷相關(guān)寄存器的介紹,更詳細的介紹,請參考《STM32 參考手冊》第95 頁(yè),
8.3 節EXTI 寄存器描述這一章。
通過(guò)以上配置就可以正常設置外部中斷了,但是外部 IO 口的中斷,還需要一個(gè)寄存器配
置,也就是IO 復用里的外部中斷配置寄存器EXTICR。這是因為STM32 任何一個(gè)IO 口都可
以配置成中斷輸入口,但是IO 口的數目遠大于中斷線(xiàn)數(16 個(gè))。于是STM32 就這樣設計,
GPIOA~GPIOG 的[15:0]分別對應中斷線(xiàn)15~0。這樣每個(gè)中斷線(xiàn)對應了最多7 個(gè)IO 口,以線(xiàn)0
為例:它對應了GPIOA.0、PIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而
中斷線(xiàn)每次只能連接到1 個(gè)IO 口上,這樣就需要EXTICR來(lái)決定對應的中斷線(xiàn)配置到哪個(gè)GPIO
上了。
EXTICR 在A(yíng)FIO 的結構體中定義,如下:
typedef struct
{
vu32 EVCR;
vu32 MAPR;
vu32 EXTICR[4];
} AFIO_TypeDef;
EXTICR 寄存器組,總共有4 個(gè),因為編譯器的寄存器組都是從0 開(kāi)始編號的,所以
EXTICR[0]~ EXTICR[3],對應《STM32 參考手冊》里的EXTICR1~ EXTICR 4。每個(gè)EXTICR
只用了其低16 位。EXTICR[0]的分配如下:

比如如我要設置 GPIOB.1 映射到1,則只要設置EXTICR[0]的bit[7:4]為0001 即可。默認
都是0000 即映射到GPIOA。從圖5.7 中可以看出,EXTICR[0]只管了GPIO 的0~3 端口,相應
的其他端口由EXTICR[1~3]管理。具體請參考《STM32 參考手冊》第126~128 頁(yè)。
通過(guò)對上面的分析我們就可以完成對外部中斷的配置了。該函數為 Ex_NVIC_Config,該
都是0000 即映射到GPIOA。從圖5.7 中可以看出,EXTICR[0]只管了GPIO 的0~3 端口,相應
的其他端口由EXTICR[1~3]管理。具體請參考《STM32 參考手冊》第126~128 頁(yè)。
通過(guò)對上面的分析我們就可以完成對外部中斷的配置了。該函數為 Ex_NVIC_Config,該
函數有3 個(gè)參數:GPIOx 為GPIOA~G(0~6),在sys.h 里面有定義。代表要配置的IO 口。BITx
則代表這個(gè)IO 口的第幾位。TRIM 為觸發(fā)方式,低2 位有效(0x01 代表下降觸發(fā);0x02 代表
上升沿觸發(fā);0x03 代表任意電平觸發(fā))。其代碼如下:
//外部中斷配置函數
//只針對GPIOA~G;不包括PVD,RTC 和USB 喚醒這三個(gè)
//參數:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:觸發(fā)模式,1,下升沿;2,上
降沿;3,任意電平觸發(fā)
//該函數一次只能配置1 個(gè)IO 口,多個(gè)IO 口,需多次調用
//該函數會(huì )自動(dòng)開(kāi)啟對應中斷,以及屏蔽線(xiàn)
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中斷寄存器組的編號
EXTOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01;//使能io 復用時(shí)鐘
AFIO->EXTICR[EXTADDR]|=GPIOx< //自動(dòng)設置
EXTI->IMR|=1< EXTI->EMR|=1< if(TRIM&0x01)EXTI->FTSR|=1< if(TRIM&0x02)EXTI->RTSR|=1< }
Ex_NVIC_Config 完全是按照我們之前的分析來(lái)編寫(xiě)的,首先根據GPIOx 的位得到中斷寄
存器組的編號,即EXTICR 的編號,在EXTICR 里面配置中斷線(xiàn)應該配置到GPIOx 的哪個(gè)位。
然后使能該位的中斷及事件,最后配置觸發(fā)方式。這樣就完成了外部中斷的的配置了。從代碼
中可以看到該函數默認是開(kāi)啟中斷和事件的。其次還要注意的一點(diǎn)就是該函數一次只能配置一
個(gè)IO 口,如果你有多個(gè)IO 口需要配置,則多次調用這個(gè)函數就可以了。
至此,我們對 STM32 的中斷管理就介紹結束了。當然還有中斷響應函數,我們這里沒(méi)有
介紹,這個(gè)在后面的實(shí)例中會(huì )向各位講述的。
則代表這個(gè)IO 口的第幾位。TRIM 為觸發(fā)方式,低2 位有效(0x01 代表下降觸發(fā);0x02 代表
上升沿觸發(fā);0x03 代表任意電平觸發(fā))。其代碼如下:
//外部中斷配置函數
//只針對GPIOA~G;不包括PVD,RTC 和USB 喚醒這三個(gè)
//參數:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:觸發(fā)模式,1,下升沿;2,上
降沿;3,任意電平觸發(fā)
//該函數一次只能配置1 個(gè)IO 口,多個(gè)IO 口,需多次調用
//該函數會(huì )自動(dòng)開(kāi)啟對應中斷,以及屏蔽線(xiàn)
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中斷寄存器組的編號
EXTOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01;//使能io 復用時(shí)鐘
AFIO->EXTICR[EXTADDR]|=GPIOx<
EXTI->IMR|=1<
Ex_NVIC_Config 完全是按照我們之前的分析來(lái)編寫(xiě)的,首先根據GPIOx 的位得到中斷寄
存器組的編號,即EXTICR 的編號,在EXTICR 里面配置中斷線(xiàn)應該配置到GPIOx 的哪個(gè)位。
然后使能該位的中斷及事件,最后配置觸發(fā)方式。這樣就完成了外部中斷的的配置了。從代碼
中可以看到該函數默認是開(kāi)啟中斷和事件的。其次還要注意的一點(diǎn)就是該函數一次只能配置一
個(gè)IO 口,如果你有多個(gè)IO 口需要配置,則多次調用這個(gè)函數就可以了。
至此,我們對 STM32 的中斷管理就介紹結束了。當然還有中斷響應函數,我們這里沒(méi)有
介紹,這個(gè)在后面的實(shí)例中會(huì )向各位講述的。
評論