stm32之中斷系統

2021-08-11 05:20:54 字數 3658 閱讀 4018

前言:這一節以及後面的定時器部分都是學習所有的微控制器時的最重要的部分,我也花了很多時間去理解手冊和程式,我爭取盡量全面並且細緻的記錄我的體會。

這裡就省略了,相信你學過微控制器就會懂。

nvic的中文意思是巢狀向量中斷控制器,控制著中斷的相關功能(其中包括中斷源、搶占優先順序、響應優先順序、中斷的使能與失能),具體的配置方法後面會提到。

在stm32中,乙個中斷的優先順序由兩部分決定,乙個是搶占式優先順序,還有乙個是響應優先順序。兩個優先順序組成了乙個4位的控制字。

如圖:

那麼我們就會問,這有四位,那兩個優先順序各佔多少位。就像圖中所展示的,搶占式優先順序(黃色)可以沾滿四位,也可以一位都不佔,如果佔滿四位,則搶占式優先順序共有0-15這些等級,佔滿2位,就有0-3這些等級。同理響應優先順序也是這樣。分配他們各佔多少位的函式為:

nvic_prioritygroupconfig(nvic_prioritygroup_1);後面這個數字代表的是搶占式優先順序的位數

這兩個優先順序中,搶占式優先順序佔主導地位,搶占式優先順序高的中斷會優先打斷主程式或者另外乙個中斷程式

1.如果兩個中斷的搶占式優先順序一樣高,當兩個中斷同時發生時,響應優先順序高的先發生,完了再發生另乙個。但是要注意,響應優先順序高的中斷不會打斷低的中斷,也就是當乙個高響應優先順序的中斷來時,如果正在執行乙個低的中斷,他不會打斷他,而是等待低的執行完在執行。也就是說只有高搶占式優先順序可以阻斷。

1.中斷的相關配置(其中包括很多很多步驟)

2.設定優先順序分組,也就是前面提到的兩個優先順序的位數

3.書寫中斷服務函式

注意:第乙個步驟對應乙個總的函式my_exti_init();第二步驟單獨寫在主函式中,第三個步驟的中斷服務函式直接寫在標頭檔案中不寫在第乙個函式中,不用寫在主函式中。總的來說這三個步驟是指主函式中的步驟。

這三個步驟都在後面詳細分析

首先需要知道,stm32f4中有23個外部中斷,也就是有23個外部中斷線路,但是只有0-15線是用來連到io口的(平時沒有連上,需要用庫函式來連上

到這裡你一定會發現,0-15這有16條線,而stm32剛好每個埠有16個針腳,於是你自然也會想到陣腳的編號肯定是與中斷線路編號剛好對應上的,事實上你很聰明,就是這樣。至於是哪乙個埠的針腳,就需要庫函式配置。

配置步驟一:因為用到io口,所以首先要配置io口,就是開啟時鐘,設為輸入模式等操作,至於為上啦還是下拉就看外設了,因為這裡外設為按鍵,就好判斷。

配置步驟二:像前面說的,要將中斷線路和io口連線起來,用到的函式是:

syscfg_extilineconfig(exti_portsourcegpioa,exti_pinsource0);//這裡就是將a埠的0管腳接在0線路上,用到幾個線路就寫多少個這個函式
但是syscfg是接在apb2匯流排上的,所以在syscfg_extilineconfig之前需要用rcc_apb2periphclockcmd(rcc_apb2periph_syscfg,enable);使能syscfg。

配置步驟三:配置nvic(用到多少中斷就寫多少組)

nvic_inittypedef nvic_initstructure;//宣告乙個結構體

nvic_initstructure.nvic_irqchannel=exti0_irqn;//中斷通道,根據線路修改數字

nvic_initstructure.nvic_irqchannelpreemptionpriority=2;//設定搶占式優先順序

nvic_initstructure.nvic_irqchannelsubpriority=3;//設定響應優先順序

nvic_initstructure.nvic_irqchannelcmd=enable;//通道使能

nvic_init(&nvic_initstructure);//最後在申明下

配置步驟四:初始化外部中斷exti(用到多少中斷就寫多少組)

exti_inittypedef exti_initstructure;//宣告結構體

exti_initstructure.exti_line=exti_line0;//選擇線路

exti_initstructure.exti_mode=exti_mode_interrupt;//選模式,這裡為中斷模式

exti_initstructure.exti_trigger=exti_trigger_rising;//上公升沿觸發,下降沿為falling

exti_initstructure.exti_linecmd=enable;//使能

exti_init(&exti_initstructure);

配置步驟五:編寫中斷服務函式(寫在標頭檔案中)

格式:

void exti0_irqhandler(void)

}exti_clearitpendingbit(exti_line0);//注意,這一步非常重要,經常容易忘記,寫在中斷服務函式的最後。用於清空中斷的狀態,以便於下次再次使用

注意:中斷函式名不是自己取得,是有規定的

線路一用第乙個,線路二用第二個,但是線路5到9用的是一樣的倒數第二個,線路10-15用的最後乙個。

完整程式:

exti.c

#include

"exti.h"

void my_exti_init()

void exti0_irqhandler(void)//öð¶ïïßâ·0

}exti_clearitpendingbit(exti_line0);

}void exti2_irqhandler(void)//öð¶ïïßâ·¶þ

}exti_clearitpendingbit(exti_line2);

}void exti3_irqhandler(void)//öð¶ïïßâ·èý

}exti_clearitpendingbit(exti_line3);

}void exti4_irqhandler(void)//öð¶ïïßâ·ëä

}exti_clearitpendingbit(exti_line4);

}

main.c

int main()

}

說明:去前面一節的按鈕實驗現象雖然相同,但是原理不同,前面的按鈕實驗是通過不斷檢測按鈕的狀態,而這裡是用的中斷,滿足觸發條件自動執行。

STM32基礎之中斷

stm32中斷很強大,stm32中斷可以巢狀,任何外設都可以產生中斷,其中中斷和異常是等價的.中斷,在微控制器中占有非常重要的地位。預設地從上向下執行,遇到條件或者其他語句,會按照指定的地方跳轉。而在微控制器執行 的過程中,難免會有一些突發的情況需要處理,這樣就會打斷當前的 待處理完突發情況之後,程...

STM32之中斷和異常

1 stm32的所有gpio都可以用作外部中斷源的輸入端,用來捕捉外部訊號,可以配置為下降沿中斷 上公升沿中斷和上公升下降沿中斷三種模式。2 cortex核心具有很強大的異常響應系統,它把能夠打斷當前 執行流程的時間分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,...

stm32 韌體庫之 中斷

stm32 可以支援的 68 個外部中斷通道,已經固定的分配給相應的外部裝置。每個中斷通道都具備自己的中斷優先順序控制位元組 pri n 8 位,但在 stm32 中只使用 4 位,高 4 位有效 共可以有 5 種分組 第 0 組方式 所有 4 位用於響應中斷 bit7 bit6 bit5 bit4...