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...