STM32設定中斷的步驟

2021-08-26 23:24:36 字數 2520 閱讀 3525

下圖概括了stm32f10***系列晶元的中斷

預設情況下,中斷向量表位於flash等唯讀儲存器內,而且在執行過程中無須修改向量表。中斷向量表預設位於儲存器的開頭(位址0),查閱探索者開發板例程**也可以發現這一點,在.s啟動檔案中可以看到:

對應於stm32f4xx.h中的**:

這麼多中斷需要通過nvic(內嵌向量中斷控制器)來管理。 

設定中斷總共分三步:

1.設定中斷優先順序分組。

//類似於劃分「階級成分」

2.設定某中斷的中斷優先順序

//類似於判定具體的「階級成分」

3.使能nvic中的該中斷

//類似於「宣布判決」

形象化的理解是:

你是上帝,造了n個人,這麼多人要分社會階級和社會階層了。由於「階級」的詞性比較重,"階層"比較中性,所以preemption優先順序->階級;每個階級內部,有一些階層,sub優先順序->階層。

如果按照nvic_prioritygroup_4這麼分,就分為了16個階級(1個階層就是1個preemption優先順序),0個階層;高階級的人,可以打斷低階級的正在做事的人(巢狀),最多可以完成1個中斷和15級巢狀。每個階級(每個preemption優先順序),你來指定這43人中,誰進入該階級;乙個人叫exti0_irqchannel,你指定他進入「階級8」,則

nvic_initstructure.nvic_irqchannel = exti0_irqchannel;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 8; // 指定搶占式優先級別1,可取0-15

另外,在同一階級內部,乙個人在做事的時候,另外乙個人不能打斷他;(preemption優先級別相同的中斷源之間沒有巢狀關係)還有,如果他們兩個同時想做事,因為沒有階層,那麼就根據vector table中的物理排序,讓排名靠前的人去做;又有1個人spi1_irqchannel,設定如下

nvic_initstructure.nvic_irqchannel = spi1_irqchannel;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; // 指定搶占式優先級別1,可取0-15

spi1_irqchannel的階級高,exti0_irqchannel做事的時候可以打斷(巢狀)。

如果按照nvic_prioritygroup_3這麼分,就分為了8個階級(1個階級是1個preemption優先順序),每個階級內有2個階層(sub優先順序);高階級的人,可以打斷低階級的正在做事的人(巢狀),最多可以完成1個中斷和7級巢狀。每個階級(每個preemption優先順序),你來指定這43人中,誰進入該階級;乙個人叫exti0_irqchannel,你指定他進入「階級3」,則:

nvic_initstructure.nvic_irqchannel = exti0_irqchannel;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 3; // 指定搶占式優先級別1,可取0-7

還需要指定他的階層:

nvic_initstructure.nvic_irqchannelsubpriority = 0; // 指定響應優先級別0,可取0-1

另有1個人叫exti9_5_irqchannel,他的階級和階層設定如下

nvic_initstructure.nvic_irqchannel = exti9_5_irqchannel;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 3; // 指定搶占式優先級別0,可取0-7

nvic_initstructure.nvic_irqchannelsubpriority = 1; // 指定響應優先級別1

那麼這兩個人是同一階級的兄弟,乙個人在做事的時候,另外乙個人不能打斷他;(preemption優先級別相同的中斷源之間沒有巢狀關係)

如果他們兩個同時想做事,因為前者的階層高,所以前者優先。

還有乙個人叫usart1_irqchannel,他的階級和階層設定如下

nvic_initstructure.nvic_irqchannel = usart1_irqchannel;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 2; // 指定搶占式優先級別0,可取0-7

nvic_initstructure.nvic_irqchannelsubpriority = 1; // 指定響應優先級別1

usart1_irqchannel的優先順序最高,當前面兩個人做事的時候,他都可以打斷(巢狀)。

以下的類推。

STM32外部中斷步驟

stm32外部中斷就是某種外部事件發生時,微控制器的中斷系統將迫使cpu暫停正在執行的程式,轉而去進行中斷事件的處理的乙個過程,此部落格的目的就是我在學習外部中斷的程式步驟 1.首先進行分配時鐘 以按鍵的外部中斷為例 rcc apb2periphclockcmd uint32 t rcc apb2p...

stm32外部中斷配置步驟

外部中斷配置步驟 初始化io口為復用 afio void gpio init gpio typedef gpiox,gpio inittypedef gpio initstruct 開啟io口復用時鐘 void rcc apb2periphclockcmd uint32 t rcc apb2peri...

STM32外部中斷

一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...