STM32的“外部中斷”和“事件”區別和理解


轉載自:https://blog.csdn.net/tanyjin/article/details/53359883

凡從事過ST MCU應用開發的人往往會遇到事件、中斷事件 中斷三個概念或術語。這三個概念彼此關聯,有時會讓人有點混淆或犯迷糊。
先拿一件生活中的事情打比方對上述三個概念做個基本的粗略理解,之后再分享一個STM32 GPIO外部中斷配置案例。

比如一老師在教室里給學生們上課。課堂上的學生可能做出各種行為動作,比方做筆記、打哈氣、翻書包、講小話等,我們把這些行為統稱為事件,其中有些行為老師往往只是視而不見,繼續他的上課;而有些行為可能導致老師的上課中止,比方講小話,並對學生的相關行為予以警告、批評或糾正等,然后繼續上課。我們把老師因為學生的某些行為而中止授課,並產生后續動作,之后接着上課的這個過程理解為中斷或中斷響應。我們把可能導致老師上課中斷的學生行為理解為中斷事件。
結合上面的比方,不難理解中斷事件是一種可以導致中斷發生的事件,中斷則是因為中斷事件的發生而導致的后續行為過程。事件與中斷事件是包含關系,即事件可分為中斷事件或非中斷事件。而中斷事件與中斷之間屬於前后關聯的因果關系,雖有關聯,但二者在時序上、行為上並不一樣。
結合具體的ST MCU運行過程,其中會有許多各種各樣的事件,比方管腳電平變化、計數器溢出、DMA空、FIFO非空、AD轉換結束、超時、外設使能、初始化等等,其中有些事件是不會導致中斷產生的,比方外設使能或部分初始化動作是不會導致中斷發生的,有些事件就可能導致中斷發生,比方計數器溢出,AD轉換結束等,這些就是中斷事件。當然這些中斷事件最終能否觸發后續中斷,得看是否開啟了該中斷事件的中斷使能,相關中斷矢量控制器【NVIC】是否配置,最終讓CPU內核參與進來,並完成后續的中斷服務動作。
不妨借助STM32 MCU的GPIO的外部事件與中斷控制器的框圖來理解上述概念。

 

從上圖可以看出,不論外部電平變化成為中斷事件還是非中斷事件,綠色方框部分都是一樣的,即具有相同的觸發源。差別就在后面。一般性事件要變為中斷事件,得有相關中斷使能位的允許。中斷事件再向CPU激活相關中斷請求,在NVIC配置相應中斷矢量后,CPU便參與進行后續的中斷響應服務【如保存現場、執行中斷服務程序、恢復現場並返回】,而非中斷事件就沒有中斷事件后續的流程,只是有些硬件觸發信號或標志的產生。當然非中斷事件的形成也是可控的。

既然一個可以觸發中斷的事件可能被配置中斷事件或非中斷事件,那么在相關事件的觸發配置時就出現兩種可能,即允許產生中斷或禁止產生中斷。於是乎,ST MCU參考手冊里在談到事件的觸發方式時就引出了事件模式和中斷模式兩個概念。

比方STM32的GPIO口的電平跳變基本都是可以觸發外部中斷的。但在具體配置時,可以根據需要來決定啟用還是禁用相關腳的中斷功能,從而選擇不同的事件觸發方式,即事件模式和中斷模式。如果不希望電平跳變事件觸發中斷,就配置為事件模式,反之,配置為中斷模式。

在STM32相關參考手冊里,涉及中斷【INTERRUPT】和事件【EVENT】二詞表述的地方比較多,加上這兩個詞的含義比較寬泛。手冊里可能會用interrupt或interrupt event表述同一東西,或者說interrup泛指中斷事件及后續中斷響應全過程。比方類似下面語句的地方:

 

不管手冊上怎么寫,不必拘泥於字詞符號,結合上下文弄清怎么回事就好。

 

 

這張圖是一條外部中斷線或外部事件線的示意圖,圖中信號線上划有一條斜線,旁邊標志19字樣的注釋,表示這樣的線路共有19套.圖中的藍色虛線箭頭,標出了外部中斷信號的傳輸路徑,首先外部信號從編號1的芯片管腳進入,經過編號2的邊沿檢測電路,通過編號3的或門進入中斷掛起請求寄存器,最后經過編號4的與門輸出到NVIC中斷檢測電路,這個邊沿檢測電路受上升沿或下降沿選擇寄存器控制,用戶可以使用這兩個寄存器控制需要哪一個邊沿產生中斷,因為選擇上升沿或下降沿是分別受2個平行的寄存器控制,所以用戶可以同時選擇上升沿或下降沿,而如果只有一個寄存器控制,那么只能選擇一個邊沿了.
按下來是編號3的或門,這個或門的另一個輸入是軟件中斷/事件寄存器,從這里可以看出,軟件可以優先於外部信號請求一個中斷或事件,即當軟件中斷/事件寄存器的對應位為”1”時,不管外部信號如何,編號3的或門都會輸出有效信號.
一個中斷或事件請求信號經過編號3的或門后,進入掛起請求寄存器,到此之前,中斷和事件的信號傳輸通路都是一致的,也就是說,掛起請求寄存器中記錄了外部信號的電平變化.
外部請求信號最后經過編號4的與門,向NVIC中斷控制器發出一個中斷請求,如果中斷屏蔽寄存器的對應位為”0”,則該請求信號不能傳輸到與門的另一端,實現了中斷的屏蔽.
明白了外部中斷的請求機制,就很容易理解事件的請求機制了.圖中紅色虛線箭頭,標出了外部事件信號的傳輸路徑,外部請求信號經過編號3的或門后,進入編號5的與門,這個與門的作用與編號4的與門類似,用於引入事件屏蔽寄存器的控制;最后脈沖發生器的一個跳變的信號轉變為一個單脈沖,輸出到芯片中的其它功能模塊.從這張圖上我們也可以知道,從外部激勵信號來看,中斷和事件的產生源都可以是一樣的.之所以分成2個部分,由於中斷是需要CPU參與的,需要軟件的中斷服務函數才能完成中斷后產生的結果;但是事件,是靠脈沖發生器產生一個脈沖,進而由硬件自動完成這個事件產生的結果,當然相應的聯動部件需要先設置好,比如引起DMA操作,AD轉換等;
簡單舉例:外部I/O觸發AD轉換,來測量外部物品的重量;如果使用傳統的中斷通道,需要I/O觸發產生外部中斷,外部中斷服務程序啟動AD轉換,AD轉換完成中斷服務程序提交最后結果;要是使用事件通道,I/O觸發產生事件,然后聯動觸發AD轉換,AD轉換完成中斷服務程序提交最后結果;相比之下,后者不要軟件參與AD觸發,並且響應速度也更塊;要是使用事件觸發DMA操作,就完全不用軟件參與就可以完成某些聯動任務了。
總結:
可以這樣簡單的認為,事件機制提供了一個完全有硬件自動完成的觸發到產生結果的通道,不要軟件的參與,降低了CPU的負荷,節省了中斷資源,提高了響應速度(硬件總快於軟件),是利用硬件來提升CPU芯片處理事件能力的一個有效方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM