1.問題來源:
stm32內部資源有限,因此產生了很多共用資源,其中外部中斷也是其中之一。外部中斷的共用資源主要包括:
(1)不同端口、同一pin口,共用一箇中斷線:如PA1、PB1、PC1共用外部中斷線1——EXTI_Line1;
(2)不同pin口、同一端口:這個都不用說,PA1、PA2、PA3這些共用的是同一個端口寄存器之類的;
(3)同一pin口共用一箇中斷線,但16箇中斷線卻只共用7箇中斷服務函數:其中中斷線EXTI_Line0-4獨立擁有一箇中斷服務,中斷線5-9共用一箇中斷服務函數,中斷線10-15共用一箇中斷服務函數。
2.問題提問與解答
(1)可以同時配置PA1和PB1觸發外部中斷嗎?
不可以!配置外部中斷的本質實質配置的是中斷線,PA1、PB1、PC1等等同一pin口的配置只是選擇了中斷線信號的來源,你把PA1搭到EXTI_Line1上,那麼PB1、PC1等等剩餘的同一pin口就浮空了;如果你在程序裏先配置了PA1又PB1,那麼最後只有PB1會觸發EXTI_Line1上的中斷,你相當於把PA1這根線先和EXTI_Line1系在一起,又解開,再把PB1和EXTI_Line1系在一起了
(2)可以同時配置PA1和PA2觸發外部中斷嗎?
可以!如果你理解了問題1,問題2 迎刃而解,始終記得外部中斷觸發的本質是觸發EXTI_Line1-15,而EXTI_Line1-15可共用但不可同時用。PA1和PA2在不同的EXTI_Line上,當然可以同時配置。但是配置時記得設置中斷優先級,優先級高的更橫就對了。
(3)可以同時配置PA6和PA8觸發外部中斷嗎?
這個問題對於看完問題2的可能有點懵,不是不同中斷線的可以同時配置嗎?其實這個問題的本質是中斷服務函數的共用。要知道EXTI_Line6和EXTI_Line8是共用一箇中斷服務函數的,那觸發EXTI_Line6和觸發EXTI_Line8不就進同一個中斷服務函數了嗎?那我想實現不同的功能咋辦?其實這個問題很好解決,進服務函數之後,判斷是哪根中斷線觸發的就行:
if(ITStatus EXTI_GetITStatus(EXTI_Line6)){
中斷線6程序+清標誌位6
}
if(ITStatus EXTI_GetITStatus(EXTI_Line8)){
中斷線8程序+清標誌位8
}
總結:
1.同一pin口不可同時配置外部中斷
2.不同pin口可以同時配置外部中斷
3.共用中斷服務函數,以中斷標誌位區分
4.外部中斷的本質是某中斷線得到信號觸發,進入對應的中斷服務函數的過程。
5.某一路中斷線只能同時跟一個pin口搭上