運用外部中斷檢測按鍵實現任務

2021-10-17 14:20:56 字數 3182 閱讀 2421

stm32的每個io都可以作為外部中斷輸入,stm32的中斷控制器支援19哥外部中斷/事件請求:

0-15 i/o輸入中斷

16:連線到pvd輸出。

17:連線到rtc鬧鐘事件。

18:連線到usb喚醒事件。

(1)上公升沿:exti_initstructure.exti_trigger=exti_trigger_rising;

(2)下降沿:exti_initstructure.exti_trigger=exti_trigger_falling;

(3)雙邊沿觸發:exti_initstructure.exti_trigger=exti_trigger_rising_falling;

因為stm32有上百個i/o,但只有16跟線,所以有一種獨特的分配方式:

gpiox0-----------exti0..

.以此類推

即:

stm32提供16個中斷線,但是只提供7個中斷向量,只有7個中斷服務函式:

(可在startup_stem32f10x_xx.s檔案中找到)

exti0| exti1| exti2 |ecti3 | exti4分別有自己的中斷服務函式

exti9-5用乙個

exti15-10用乙個

中斷服務函式列表:

exti0_irqhandler

exti1_irqhandler

exti2_irqhandler

exti3_irqhandler

exti4_irqhandler

exti9_5_irqhandler

exti15_10_irqhandler

本篇以cet711為例:

選用按鍵b1,由電路圖可得,連線為pa0口

在這裡外部跳線帽將nk1和mpa0連線在一起

由圖可知,按鍵按下後,讀入低電平。

配置:使能時鐘:

rcc_apb2periphclockcmd

(rcc_apb2periph_gpioa,enable)

;

pa0上拉輸入

gpio_inittypedef gpio_initstructure;

gpio_initstructure.gpio_mode=gpio_mode_ipu;

gpio_initstructure.gpio_pin=gpio_pin_0;

gpio_init

(gpioa,

&gpio_initstructure)

;`

因為所用pa0所以用exti0線對映,

時鐘初始化:

rcc_apb2periphclockcmd

(rcc_apb2periph_afio,enable)

;

對映:
gpio_extilineconfig

(gpio_portsourcegpioa,gpio_pinsource0)

;

exti_inittypedef exti_initstructure;

exti_initstructure.exti_line=exti_line0;

exti_initstructure.exti_linecmd=enable;

exti_initstructure.exti_mode=exti_mode_interrupt;

exti_initstructure.exti_trigger=exti_trigger_falling;

//ïâ½µñø´¥·¢

exti_init

(&exti_initstructure)

;

1.中斷優先順序分組(寫在主函式中,exti_init()之前):
nvic_prioritygroupconfig

(nvic_prioritygroup_2)

;

中斷優先順序分組可以配置暫存器scb->aircr從而分配暫存器中優先順序的位,如2位分配給搶占優先順序,2位分配給相應優先順序。即搶占優先順序分四個0——3,響應優先順序分四個0——3

2.中斷優先順序分配:

nvic_inittypedef nvic_initstructure;

nvic_initstructure.nvic_irqchannel=exti0_irqn;

//中斷線0

nvic_initstructure.nvic_irqchannelcmd=enable;

nvic_initstructure.nvic_irqchannelpreemptionpriority=2;

nvic_initstructure.nvic_irqchannelsubpriority=2;

nvic_init

(&nvic_initstructure)

;

以上初始化結束

void

exti0_irqhandler

(void

)exti_clearitpendingbit

(exti_line0)

;}

exti_clearitpendingbit(exti_line0);//這句話用來清空中斷標誌位

外部中斷標誌位無法自動清空需要手動在中斷服務函式中清空。

中斷服務函式作用: 當中斷發生時,進入中斷服務函式中執行,然後在繼續執行主程式。

void

exita_init

(void

)void

exti0_irqhandler

(void

)exti_clearitpendingbit

(exti_line0)

;}

nrf51822 外部中斷(按鍵2)

1.目的 nrf51822外部中斷 2.分析 在實際應用中經常要用到外部中斷,比如按鍵喚醒。3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.12 硬體平台 微雪開發板nrf51822 例子 sdk 10.0.0 1.目的 nrf51822外部中斷 2.分析 在實際應用中經常要用到外...

STM32外部中斷(實現按鍵控制LED)

中斷 這個概念,指的是在微控制器執行過程中,在指定條件發生時,停下當前所有工作,去執行中斷處理函式內的內容。就像我們在教室上課時,突然 了,不出意外的話我們都需要停下手中學習任務,去進行一系列的避險動作。這一節我們通過中斷的方式,完成通過按鍵控制led亮滅的操作。stm32的中斷控制器支援19個外部...

stm32 外部中斷 按鍵的誤觸發

最近在除錯按鍵作為外部中斷exti進行觸發動作,發現每次按鍵按下和按鍵抬起都會多次進入中斷函式,造成程式不穩定,經過反覆除錯和查閱資料,最後終於已經把這個問題解決,現在總結一下 1 exti重複配置兩次導致誤觸發中斷的問題 如果重複兩次配置exti的話,由於第一次已經開啟中斷,當進行第二次配置中斷的...