一、中斷的定義及其種類
中斷是指當 CPU 執行程序時,由於發生了某種隨機的事件(外部或內部),引起 CPU 暫時中斷正在運行的程序,轉去執行一段特殊的服務程序(中斷服務子程序或中斷處理程序),以處理該事件,該事件處理完後又返回被中斷的程序繼續執行。其中,引發中斷的隨機事件被稱爲中斷源。中斷的示意圖如下:
另外,還有一種特殊的中斷類型——中斷嵌套,其指有些中斷還能夠被其他高優先級的中斷所中斷,即類似於C語言中的if嵌套。
對於Cortex-M3系列來說,其內核支持256箇中斷,其中包含了16個內核中斷和240個外部中斷。但事實上,STM32F103並沒有包含以上所有中斷,它只有60個可屏蔽中斷。這些中斷中,除了三個優先級極高的中斷爲系統固定外,大部分中斷優先級都可以由用戶編程確定。
具體中斷類型、名稱、說明都可以在《STM32F10X中文參考手冊》-9 中斷和事件上查找到,這裏就不在贅述。
二、NVIC
NVIC英文全稱是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中斷控制器,它屬於M3內核的一個外設,控制着芯片的中斷相關功能。core_cm3.h內定義了NVIC結構體類型,內包括中斷使能、中斷清除、中斷優先級在內的多種寄存器。
三、中斷優先級
中斷優先級表示的是不同的中斷在同時發生時,進行中斷的優先順序。STM32F103的中斷優先級寄存器包含4位,而優先級又可分爲搶佔式優先級和指定響應優先級,這就代表了兩種優先級所佔的位數可以有5種情況,如下:
其中,搶佔優先級的優先性大於指定響應優先級(下簡稱“響應優先級”)。下將分兩種情況討論:
- 當兩個中斷同時發生時,系統將會先處理搶佔優先級高的,若兩中斷搶佔優先級相同,則先處理響應優先級高的;
- 在A中斷程序運行時,B中斷啓動,則:若A的搶佔優先級大於或等於B,則B中斷程序暫不運行;若A的搶佔優先級小於B,則A中斷程序會停止運行,而B中斷程序開始運行。
由以上討論,我們可以看出優先級的重要作用。那麼我們應該如何配置優先級分組呢?
四、中斷優先級分組的配置
中斷優先級分組的配置可以大致分爲以下幾步:
- 按照需要確定搶佔優先級和響應優先級的相應位數;
- 將NVIC中斷相關的庫文件misc.c和misc.h放置到工程中,以備調用;
- 調用優先級分組配置庫函數
NVIC_PriorityGroupConfig()
實現配置。
從STM32固件庫使用手冊中,我們可以查詢到NVIC_PriorityGroupConfig()
的相關信息,現摘錄如下:
而函數的形參u32 NVIC_PriorityGroup
實質上就是第三節所述的優先級分組的五種類型,詳情如下:
五、中斷配置
作爲偏重實用性的人,我對中斷的內部機理並沒有研究過於深入,而首先將目光放在了中斷的配置上面,我們可以大致歸納出中斷配置的幾個步驟:
- 使能外設某個中斷, 這個具體是由外設相關中斷使能位來控制;
- 設置中斷優先級分組, 初始化 NVIC_InitTypeDef 結構體, 設置搶佔優先級和響應優先級, 使能中斷請求;
- 編寫中斷服務函數。
該節所述的中斷配置過程只是一個配置的大體思路,中斷配置的相關操作將在日後的學習筆記中詳細闡述。
六、中斷的作用
編者按:其實這段還是很難寫的,因爲作爲一個對STM32F103系列的初學者,對中斷的接觸和了解還不夠深入,而且由於對項目接觸不深,對中斷的使用也不是很清楚。所以這段會先寫一點自己對中斷應用的看法,後期隨着對STM32F103的瞭解加深,再改動本節。
由現象看本質,由定義看作用。中斷作爲一個能切換程序運行的重要操作,有以下幾個作用:
- 及時終止損壞時鐘、硬件系統的程序運行。我們從參考手冊上可以看到,優先級爲固定的幾個中斷都有保護時鐘及硬件系統的終止作用。這說明中斷是單片機的一種自我保護機制的體現。
- 作爲一種特殊的開關。我們可以看到,NVIC很重要的一個功能即是通過上升沿\下降沿來判斷中斷是否開啓,若開啓(且中斷不被屏蔽)則進行中斷程序。中斷因爲這種性質,故可以作爲一種特殊的開關。
- 定時器的控制。利用中斷可以構造一個定時器,當達到初始定時時間時,即開啓中斷完成中斷程序。
總而言之,中斷是包括STM32在內的單片機系統裏非常重要的一種操作。