STM32學習筆記(三) 外部中斷的使用

2021-09-19 18:17:49 字數 3566 閱讀 7644

stm32f4的每個io都可以作為外部中斷輸入,很強大的功能吧!以前學習的51只有兩個外部中斷。

stm32f4的中斷控制器支援22個外部中斷/事件請求:

exti線0~15:對應外部io口的輸入中斷。即gpiox.0—exti0,gpiox.a—extia如下圖所示

exti線16:連線到pvd輸出。

exti線17:連線到rtc鬧鐘事件。

exti線18:連線到usb otg fs喚醒事件。

exti線19:連線到乙太網喚醒事件。

exti線20:連線到usb otg hs(在fs中配置)喚醒事件。

exti線21:連線到rtc入侵和時間戳事件。exti線22:連線到rtc喚醒事件。

對於每個中斷線0我們可以設定相應的觸發方式(上公升沿觸發,下降沿觸發,邊沿觸發)以及使能。

中斷服務函式又是如何分配的呢?

其中中斷線0-4有單獨的中斷向量,即單獨的中斷服務函式。

exti0_irqhandler

exti1_irqhandler

exti2_irqhandler

exti3_irqhandler

exti4_irqhandler

中斷線5-9共用乙個中斷服務函式

exti9_5_irqhandler

中斷線10-15共同乙個中斷服務函式

exti15_10_irqhandler

巢狀向量中斷控制器

nvic (nested vectored interrupt controller)

中斷優先順序分組的是在scb->aircr暫存器中設定的,具體設定情況如下:

選擇不同的分組可以設定不同的優先順序等級,例如選擇分組2,分配結果為2位搶占,2位響應,既然是兩位,所以優先順序可以設定為0-3,要注意的是,設定好分組之後不要再改變分組,隨意改變分組會導致中斷管理混亂。

關於搶占優先順序和響應優先順序的說明

例如:

這裡要注意的是,搶占優先順序設定的越小,則優先順序越高,0最高

則這三個優先順序的順序為:中斷7>中斷3>中斷6。 

1.1.使能gpio時鐘,注意:模式設定為輸入

gpio_inittypedef  gpio_initstructure;

rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioe, enable);   //使能gpioa,gpioe時鐘

gpio_initstructure.gpio_pin = gpio_pin_3;

gpio_initstructure.gpio_mode = gpio_mode_in; //普通輸入模式

gpio_initstructure.gpio_speed = gpio_speed_100mhz;//100m

gpio_initstructure.gpio_pupd = gpio_pupd_up; //上拉

gpio_init(gpioe, &gpio_initstructure);

1.2.使能syscfg時鐘。

rcc_apb2periphclockcmd(rcc_apb2periph_syscfg, enable);		//使能syscfg時鐘,必須的
1.3.設定gpio和中斷線的對映關係

syscfg_extilineconfig(exti_portsourcegpioe, exti_pinsource3);	//pf3,中斷線對映,line3-pin3
1.4.中斷初始化,包括設定觸發方式,指定中斷線,使能中斷,設定中斷模式等

exti_inittypedef exti_initstructure;		//中斷方式初始化

exti_initstructure.exti_line = exti_line3; //指定中斷線3

exti_initstructure.exti_linecmd = enable; //使能中斷線

exti_initstructure.exti_mode = exti_mode_interrupt; //中斷模式

exti_initstructure.exti_trigger = exti_trigger_falling; //下降沿觸發方式,必須的,上公升沿不靈敏

exti_init(&exti_initstructure);

1.5.中斷分組和優先順序設定

nvic_inittypedef nvic_initstructure;		//優先順序初始化

nvic_prioritygroupconfig(nvic_prioritygroup_2); //設定中斷分組為2:2,優先順序範圍0-3

nvic_initstructure.nvic_irqchannel = exti3_irqn; //指定中斷線3

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

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //搶占優先順序0,可以設定0-3

nvic_initstructure.nvic_irqchannelsubpriority = 0; //響應優先順序0,可以設定0-3

nvic_init(&nvic_initstructure);

中斷初始化完畢後,就可以編寫相應的中斷服務函式了,我們使用的是中斷線3,所以對應的中斷服務函式名稱為void exti3_irqhandler(void),注意在執行完後要將標誌位清零,

void exti3_irqhandler(void)			//中斷線3服務函式,發生中斷時,自動執行

根據手冊可以通過exti_getitstatus(exti_line3)來判斷中斷標誌位的狀態,實際執行時發現這種方式並不是很有效,可能是我的用法不對吧!

這個中斷服務函式還是很簡單的,就是按下按鍵時,將led的狀態反轉

主函式的執行部分可以不寫,這裡寫了 led 的閃爍用來指示程式的執行

int main(void)

}

從以上過程可以看出stm32f4的外部中斷的配置和使用方法還是很簡單清晰的。雖然比51要複雜一些,但是畢竟功能那麼強大,複雜一些也是可以理解的。

stm32f4xx中文參考手冊

stm32f4開發指南-庫函式版本_v1.1

以上是我學習過程的一些個人理解,有不對或不準確的地方,歡迎各位大神指正。

2023年4月17日22:01:43

STM32學習 外部中斷

先聊聊題外話,學習stm32,我大多從了解功能 框圖到暫存器定義,然後在使用方法 配置步驟。其實配置時使用庫函式是相當方便的,甚至可以不用看暫存器,但為深入了解一下,有時還是會多看看,而了解其方法脈絡後再使用庫函式更方便,只需查相應的庫函式手冊即可。stm32的外部中斷資源豐富 使用靈活。在f1系統...

STM32外部中斷

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

stm32外部中斷

外部中斷程式配置流程 rcc 時鐘配置 void rcc configuration void 時鐘配置 開啟各路時鐘 rcc apb2periphclockcmd rcc apb2periph usart1 rcc apb2periph gpioa rcc apb2periph afio,enab...