在平時的工作中,我們經常會遇到這樣的情況:有人來找你做一些事情,而且這些事情要比手頭的工作更重要。那現在就需要停下手中的工作,先去完成突然到來的這部分工作。這樣的情況也類似於圖論中的關鍵路徑中,突然在當前事件之前插入了乙個新的事件,那我們不得不先去完成之前的那個任務,才能繼續完成後面的工作。
上述情況是非常常見的,那在stm32中,我們如果遇到了比當前任務更緊急的事情需要去處理,我們應該怎麼辦呢?這個時候,我們需要通過中斷來完成這樣的任務。
在現實生活中,突然出現的任務一定有輕重緩急之分。如果同時出現許多的臨時任務,我們一定會首先評估他們誰更需要先被處理掉,然後再依次進行處理。在stm32中,我們也需要這樣的功能,多個中斷來臨的時候,我們需要首先判斷這個中斷緊不緊急,然後再考慮處理的先後順序。那我們是由什麼來控制這樣的順序的呢?毫無疑問,這就是通過巢狀向量中斷控制器(nvic)完成的。
cm3核心支援256個中斷,包括16個核心中斷和250個外部中斷,同時具有256級的可程式設計中斷設定。而stm32只使用了一部分。stm32擁有84個中斷,包括16個核心中斷和68個可遮蔽中斷(stm32f107系列才使用了68個可遮蔽中斷),還擁有16級可程式設計的中斷優先順序。stm32f103系列只使用了60個可遮蔽中斷。
stm32中控制中斷優先順序的暫存器組是ip[240]
。是由240個8bit的暫存器組成的。而stm32f103只用了前六十個(0 ~ 59)。在stm32f103系列微控制器中,這8bit也沒有全部使用,而是只使用了其高四位(4 ~ 7位)。下圖是中斷分組的分配情況。
優先順序分組
搶占優先順序
響應優先順序
高四位描述00級
0 ~ 15級
0bit用於搶占優先順序
4bit用於響應優先順序
10 ~ 1級
0 ~ 7級
1bit用於搶占優先順序
3bit用於響應優先順序
20 ~ 3級
0 ~ 3級
2bit用於搶占優先順序
2bit用於響應優先順序
30 ~ 7級
0 ~ 1級
3bit用於搶占優先順序
1bit用於響應優先順序
40 ~ 15級
0級4bit用於搶占優先順序
0bit用於響應優先順序
響應優先順序又稱為子優先順序。這裡需要關注的是,搶占優先順序的級別高於子優先順序。高搶占優先順序的中斷可以在低搶占優先順序中斷執行的過程中被響應,反之則不行。這就是所謂的中斷巢狀。換句話說呢,就是高搶占優先順序中斷可以搶占低搶占優先順序中斷的執行。當多個中斷同時到來,而且他們的搶占優先順序相同,則先進入子優先順序更高的中斷。數值越小,優先順序越高。
但是,當搶占優先順序相同的情況下,高子優先順序中斷不能打斷低子優先順序中斷,也就是不能實現中斷巢狀。這種情況下,高子優先順序中斷必須先等待低子優先順序中斷執行完成,在進行自己的中斷。
配置某個中斷優先順序的步驟如下:
這一步可以通過函式nvic_prioritygroupconfig(uint32_t nvic_prioritygroup)
來完成。關於優先順序分組的內容上文已經做過了講解。這裡提供乙個使用範例:
nvic_prioritygroupconfig(nvic_prioritygroup_2);
這一步我們需要用到乙個函式nvic_init(nvic_inittypedef* nvic_initstruct)
。裡面的結構體的成員變數如下:
typedef struct
nvic_inittypedef;
因此,配置某一中斷優先順序的步驟如下:
這裡給出乙個範例:
nvic_inittypedef nvic_initstructure; //宣告結構體
nvic_initstructure.nvic_irqchannel = exti0_irqn; //宣告中斷名稱
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x02; //設定搶占優先順序為2
nvic_initstructure.nvic_irqchannelsubpriority = 0x03; //設定響應優先順序為3
nvic_initstructure.nvic_irqchannelcmd = enable; //使能中斷
nvic_init(&nvic_initstructure); //對上述配置進行初始化
至此,我們就完成了對某一中斷優先順序的配置,再根據不同的中斷配置不同的觸發條件等資訊,就可以完成在特定條件下的中斷。這裡不再展開敘述。
關於nvic和中斷巢狀的更多的神奇理解可以參考下面這篇文章的後半部分:stm32 nvic
巢狀的向量式中斷控制器 NVIC
幾個基本概念 1.arm cortex m3 核心支援 256 個中斷 16 個核心 240 外部 和可程式設計 256 級中斷優先順序的設定,與其相關的中斷控制和中斷優先順序控制暫存器 nvic systick 等 也都屬於cortex m3 核心的部分。其中,stm32 目前支援的中斷共為 84...
STM32 巢狀向量中斷控制器NVIC學習
stm32中有兩個優先順序的概念 搶占式優先順序和響應優先順序 也叫副優先順序 他們的特性是 1 高搶占式優先順序的中斷可以巢狀在低搶占式優先順序的中斷中 即低搶占式優先順序的中斷可以被高搶占式優先順序的中斷打斷 2 當兩個中斷源的搶占式優先順序相同時,這兩個中斷將沒有巢狀關係,當乙個中斷到來後,如...
STM32 NVIC巢狀向量中斷控制器函式分析
中斷管理函式 cm3核心支援256個中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。但stm32並沒有使用cm3核心的全部東西,而是只用了它的一部分。stm32有76個中斷,包括16個核心中斷和60個可遮蔽中斷,具有16級可程式設計的中斷優先順序。而我們常用的...