天天看點

STM32F10x 中斷程式(NVIC)

中斷是所有單片機的核心,也是單片機中比較難掌握的一塊内容,正好我學完中斷以後,來做一個總結。

中斷一般的類型有兩種,第一個是系統異常,是屬于核心級别的中斷,第二個是外部中斷,這是展現在外設方面。管理中斷的一個很重要的寄存器是NVIC(嵌套向量中斷寄存器)。

對于M3和M4核心的MCU,每個中斷的優先級都是用寄存器中的8位來設定的。那就可以産生2^8 = 256個中斷,但實際上是用不到這麼多的,是以一般的晶片廠商都會做出自己的調制。其中用到最多的ST公司是用了高4位作為中斷優先級的配置,這樣就可以産生16級的中斷。

在NVIC中,其中很重要的就是中斷優先級的配置,一般來說,優先級分為搶占優先級和子優先級兩種,其中搶占優先級的地位是大于子優先級的,也就是說如果我們配置A中斷的搶占優先級大于B中斷,那麼不管A中斷和B中斷的子優先級誰高,都先執行A中斷。但如果A中斷和B中斷的搶占優先級是一樣的,那麼才會比較他們的子優先級,子優先級誰高,那就先執行那一條中斷。這樣需要闡述一下,優先級的數字越低,優先級越高,也就說如果A的優先級是0,B的優先級的1,那麼A的優先級是高于B的優先級的。

那可能有人會問,如果A和B的搶占優先級和子優先級都是一樣的,那單片機會先執行哪一個中斷呢。這時候就要設計到硬體優先級的概念,前面我們所說的搶占優先級和子優先級都是我們自己在軟體上面配置的,其實在單片機上,每個裝置都存在自己的硬體優先級,如果當配置的軟體優先級完全相同的時候,單片機就會自己首先執行硬體優先級高的中斷。關于硬體優先級的查找,我們可以在寄存器手冊(當中的嵌套向量中斷控制器)裡面檢視。(下面是我一部分的截圖)

STM32F10x 中斷程式(NVIC)

這時候肯定會有人覺得,那是不是核心的中斷就一定優先于外設的中斷呢,其實不是的,中斷的優先級判斷還是要通過我們設定的搶占優先級和子優先級來判斷,如果一樣的話,我們會發現在硬體優先級上面,核心的優先級是高于外設的,是以也隻有當我們配置的軟體優先級相同的時候,核心的優先級才會高于外設。

前面筆者寫到,在STM32裡面是控制NVIC_CR寄存器的高四位來設定優先級的。

STM32F10x 中斷程式(NVIC)

這就是STM32的優先級配置的分組,一共分為5類,每一類的差別就是可以設定的搶占優先級和子優先級的個數不一樣,比如0類15個資料都是用來設定子優先級的,而4類15個資料都用來設定搶占優先級。

在利用STM32F10X的固件庫程式設計的時候,配置中斷的步驟是這樣的。

1.先選擇優先級的分組