STM32EXIT外部中斷&中斷系統
- 中斷系統
- 中斷觸發條件:
- 中斷處理流程和用途:
- STM32中斷
- NVIC嵌套中斷向量控制器基本結構
中斷系統
中斷觸發條件:
對外部中斷來說,可以是引腳發生了電平跳變
對定時器來說,可以是定時的時間到了
對串口通信來說,可以是接收到了數據
當這些事件發生時,情況比較緊急,比如外部中斷來了,如果不處理,下一個跳變信號就跟著過來了。
比如串口接收中斷來了,如果不讀取接收到的數據,那下一個數據再過來,就會把原來的數據覆蓋掉。
所以希望當中斷條件滿足時,CPU能夠立即停下當前執行的程序,轉而去處理中斷事件的程序。
中斷處理流程和用途:
比如外部中斷來了,需要計次,那就變量++;串口中斷來了就把接收到的數據轉存起來;處理完緊急事情后,CPU回到原來程序運行的位置。
使用中斷系統,能極大地提高程序的效率,如果沒有中斷系統,為了防止外部中斷被忽略或者串口數據被覆蓋,那主程序就只能不斷地查詢是否有這些事件發生,不能在干其他的事情。
如果沒有定時器中斷,那主函數就只有靠Delay函數,才能實現定時的功能。有了中斷系統之后,主程序就可以放心執行其他事情,有中斷的時候再去處理。大大提升效率。
中斷優先級是根據程序設計的需求,自己設置的。緊急的事情優先級要設置地高一點,這樣可以更好地安排中斷事件,防止緊急的事件被別的中斷耽誤。
中斷嵌套也是為了照顧非常緊急的中斷的,能否進行中斷嵌套,由中斷優先級來決定。
中斷來了,主程序都得立即暫停,程序由硬件電路自動跳轉到中斷程序中。
中斷執行前,進行現場保護
中斷執行后,會再還原現場。保證主程序即使被中斷了,回來后也能繼續運行。
用C語言編程,保護現場和還原現場并不需要我們操作(操作系統里面有中斷的概念),由編譯器做好。
C語言程序中中斷的執行流程:
一般中斷程序都是在一個子函數里面,這個函數不需要我們調用,當中斷來臨時,由硬件自動調用這個函數。
STM32中斷
中斷通道就是中斷源的意思,68個是F1系列最多的中斷數量,對于一個具體的型號來說,可能沒有這么多中斷,所以這個數量看看就行,具體以對應型號的數據手冊為準。
STM32的中斷非常多,幾乎所有模塊都能申請中斷,
NVIC就是STM32中用來管理中斷,分配優先級的。
灰色的部分是內核的中斷,
1.Reset復位中斷 當產生復位事件時,程序就會自動執行復位中斷函數,也就是復位后程序開始執行的位置
2.后面的各種灰色的中斷都是內核里面的,一般比較高深,看上去也難理解,但是這些中斷我們一般用不到,所以了解一下即可
不是灰色的部分的:就是STM32外設的中斷了。
比如:
WWDG 窗口看門狗,用來監測程序運行狀態的中斷,比如程序卡死了,沒有及時喂狗,窗口看門狗就會申請中斷,程序就會調到窗口看門狗的中斷程序里,在中斷程序里就可以進行一些錯誤檢查,看看出現什么問題了。
PVD 電源電壓監測,如果供電電壓不足,PVD電路就會申請中斷,在中斷里就知道,現在供電不足,是不是電池沒電了,要趕緊保存一下重要數據。
TAMPER 外設電路檢測到異常或者什么事件,需要提示CPU的時候,就可以申請中斷,讓程序調到對應的中斷函數里運行,用來處理異常或事件
EXTI0-EXTI4,EXTI9_5-EXTI15_10就是本節外部中斷對應的中斷資源。
中斷的地址的作用:因為程序中的中斷函數,它的地址由編譯器分配的,是不固定的。但是中斷的跳轉,由于硬件限制,只能跳轉到固定的地址執行程序,所以為了能讓硬件跳轉到一個不固定的中斷函數里面,就需要在內存中定義一個地址的列表。這個列表地址固定,中斷發生后,就跳到這個固定位置。然后有編譯器再加上一條跳轉到中斷函數的代碼,這樣中斷函數就可以跳轉到任意位置了。
中斷地址的列表:叫做中斷向量表,相當于中斷跳轉的一個跳板。(不過C語言編程不需要管這個中斷向量表,因為編譯器幫我們做好了)
NVIC嵌套中斷向量控制器基本結構
在STM32中,NVIC用來統一分配中斷優先級和管理中斷的,NVIC是一個內核外設,是CPU的小助手。
STM32中斷非常多,如果把中斷都接到CPU上,那么CPU得引出很多線進行適配,設計上就很麻煩,并且很多中斷同時申請,或者中斷很多產生了擁堵,CPU就很難處理,畢竟CPU主要用來做運算的。所以中斷分配的任務就放到別的地方。所以NVIC就出現了。
NVIC有很多輸入口,有多少個中斷線路,都可以接過來。(這里斜杠上寫個n,意思是一個外設可能會同時占用多個中斷通道,所以有n條線),