STM32 使用EXTI處理外部中斷

2021-10-17 06:47:40 字數 4794 閱讀 9364

使用exti處理外部中斷

1.任務描述

使用開發板上的key1按鍵,達到開/關led彩燈的目的

2. 程式設計思路及要點

程式設計思路

檢測gpio中斷,在中斷服務函式裡面,實現開/關led彩燈

程式設計要點

1) 初始化用來產生中斷的 gpio;

2) 初始化 exti;

3) 配置 nvic;

4) 編寫中斷服務函式;

3 示例**

為了方便移植,首先定義gpio引腳

//巨集定義

#define key1_int_gpio_port gpioa

#define key1_int_gpio_clk (rcc_apb2periph_gpioa | rcc_apb2periph_afio)

#define key1_int_gpio_pin gpio_pin_0

#define key1_int_exti_portsource gpio_portsourcegpioa

#define key1_int_exti_pinsource gpio_pinsource0

#define key1_int_exti_line exti_line0

#define key1_int_exti_irq exti0_irqn

#define key1_irqhandler exti0_irqhandler

#define key2_int_gpio_port gpioc

#define key2_int_gpio_clk (rcc_apb2periph_gpioc | rcc_apb2periph_afio)

#define key2_int_gpio_pin gpio_pin_13

#define key2_int_exti_portsource gpio_portsourcegpioc

#define key2_int_exti_pinsource gpio_pinsource13

#define key2_int_exti_line exti_line13

#define key2_int_exti_irq exti15_10_irqn

#define key2_irqhandler exti15_10_irqhandler

void exti_key_config(void);

配置nvic

static void nvic_configuration(void)

配置exti

void exti_key_config(void)

exti 中斷服務函式

void key1_irqhandler(void)

}void key2_irqhandler(void)

}

led 相關的巨集

// r-紅色

#define led1_gpio_port gpiob

#define led1_gpio_clk rcc_apb2periph_gpiob

#define led1_gpio_pin gpio_pin_5

// g-綠色

#define led2_gpio_port gpiob

#define led2_gpio_clk rcc_apb2periph_gpiob

#define led2_gpio_pin gpio_pin_0

// b-藍色

#define led3_gpio_port gpiob

#define led3_gpio_clk rcc_apb2periph_gpiob

#define led3_gpio_pin gpio_pin_1

/* 直接操作暫存器的方法控制 io */

#define digitalhi(p,i) //輸出為高電平

#define digitallo(p,i) //輸出低電平

#define digitaltoggle(p,i) //輸出反轉狀態

/* 定義控制 io 的巨集 */

#define led1_toggle digitaltoggle(led1_gpio_port,led1_gpio_pin)

#define led1_off digitalhi(led1_gpio_port,led1_gpio_pin)

#define led1_on digitallo(led1_gpio_port,led1_gpio_pin)

#define led2_toggle digitaltoggle(led2_gpio_port,led2_gpio_pin)

#define led2_off digitalhi(led2_gpio_port,led2_gpio_pin)

#define led2_on digitallo(led2_gpio_port,led2_gpio_pin)

#define led3_toggle digitaltoggle(led2_gpio_port,led3_gpio_pin)

#define led3_off digitalhi(led2_gpio_port,led3_gpio_pin)

#define led3_on digitallo(led2_gpio_port,led3_gpio_pin)

/* 基本混色,後面高階用法使用 pwm 可混出全彩顏色,且效果更好 */

//紅#define led_red \

led1_on;\

led2_off\

led3_off

//綠#define led_green \

led1_off;\

led2_on\

led3_off

//藍#define led_blue \

led1_off;\

led2_off\

led3_on

//黃(紅+綠)

#define led_yellow \

led1_on;\

led2_on\

led3_off

//紫(紅+藍)

#define led_purple \

led1_on;\

led2_off\

led3_on

//青(綠+藍)

#define led_cyan \

led1_off;\

led2_on\

led3_on

//白(紅+綠+藍)

#define led_white \

led1_on;\

led2_on\

led3_on

//黑(全部關閉)

#define led_rgboff \

led1_off;\

led2_off\

led3_off

#define led_gpio_port gpiob

#define led_gpio_clk rcc_apb2periph_gpiob

#define led_g_gpio_pin gpio_pin_0

#define led_b_gpio_pin gpio_pin_1

#define led_r_gpio_pin gpio_pin_5

#define on 1

#define off 0

//通過異或運算來亮滅led

#define led_toggle(pin) (led_gpio_port->odr ^= pin)

typedef enum

led_type_e;

void gpio_led_config(gpio_typedef* gpiox, uint16_t gpio_pin);

void led_switch(led_type_e ledtype, uint8_t opt);

void led_gpio_config(void);

主函式

int main(void)

#elif 0

//通過按鍵來亮滅led

gpio_led_config(led_gpio_port, led_r_gpio_pin);

gpio_key_config(key1_gpio_port, key1_gpio_clk, key1_gpio_pin);

while(1)

// gpio_led_config(led_gpio_port, led_b_gpio_pin);

// gpio_key_config(key2_gpio_port, key2_gpio_clk, key2_gpio_pin);

// // while(1)

// #else

/* led 埠初始化 */

led_gpio_config();

/* 初始化 exti 中斷,按下按鍵會觸發中斷,

* 觸發中斷會進入 stm32f4xx_it.c 檔案中的函式

* key1_irqhandler 和 key2_irqhandler,處理中斷,反轉 led 燈。

*/ exti_key_config();

/* 等待中斷,由於使用中斷方式,cpu 不用輪詢按鍵 */

while (1)

#endif

}

led 配置

void led_gpio_config(void)

STM32外部中斷 exti 配置

在微控制器運用中,exti的使用算是常規操作了。在32微控制器中,exti的每個中斷均可單獨配置來選擇型別 即中斷和事件 以及相應的觸發事件 上公升沿觸發 下降沿觸發 邊沿觸發等 也可以進行單獨遮蔽的操作。如下是32中的exti框圖,其中線路1 2 3 4 5為 中斷 而1 2 3 6 7 8為 事...

Stm32 外部中斷EXTI使用說明

硬體情況 採用pa11管腳 需要明確的是,pxn管腳共用外部中斷線extin和外部中斷向量extin irqn和中斷服務程式入口extin irqhandler,但是需要注意的是 9.5 共用exti9 5 irqn和exti9 5 irqhandler 15.10 共用exti15 10 irqn...

stm32學習筆記 EXTI

可產生20個軟體外部中斷。探測低於apb2時鐘週期的外部脈衝。當上公升沿下降沿和軟體觸發請求時,看中斷和事件的遮蔽器來決定是否進入下一步 可同時產生 若中斷遮蔽器使能則掛起。exti0 exti15對應gpio引腳的0 15,剩下4位exti對應不同功能。這裡還指出需要配置afio exticrx暫...