STM32的每個IO都可以作為外部中斷輸入。每個中斷設有狀態位元,每個中斷/事件都有獨立的觸發和遮罩設置。 通常提供IO埠使用的中斷線只有16個:EXTI線0~15:對應外部IO埠的輸入中斷。 但是有些MCU的IO埠卻遠遠不止16個,那麼MCU是怎麼把16個中斷線和IO埠一一對應起來的呢? 在STM32上是這樣設計的,GPIO的引腳 GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G,H,I)分別對應中斷線0~15。 這樣每個中斷線對應了最多9個IO埠。 中斷線每次只能連接到1個IO埠上,這樣就需要通過配置來決定對應的中斷線配置到哪個GPIO上。 GPIO跟中斷線的映射關係圖如下:
除了上圖看到IO與各中斷線的對應關係,其它一些中斷線也比較常用,如: EXTI線16連接到PVD輸出 EXTI線17連接到RTC鬧鐘事件 EXTI線18連接到USB喚醒事件 EXTI線19連接到乙太網喚醒事件(只適用於互聯型產品)等 對於不同型號的STM32來說可能會略有差異,但用法基本一致。 中斷事件在不同應用場景也各不相同,比如下面一些常見的中斷方式:
1.通過配置正緣/負緣觸發選擇暫存器選擇邊緣檢測電路所要檢測的邊緣變動。
2.邊緣檢測電路根據輸入線是否有相應的邊緣變動,檢測到則輸出信號1,否則輸出信號0。
3.通過一個或閘,或閘以邊緣檢測電路、軟體中斷事件寄存器(中斷事件可以通過軟體產生)作為輸入。 兩者之一有一個產生信號1,或閘就輸出信號1。
CODE產生時就已經致能中斷
外部中斷相關設定範例:
HAL_NVIC_SetPriority(EXTI0_1_IRQn,0,0); //設定中斷優先權
HAL_NVIC_ClearPendingIRQ(EXTI4_15_IRQn); //清除目前的IRQ
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); //啟動外部中斷
HAL_NVIC_DisableIRQ(EXTI4_15_IRQn); //取消外部中斷: