使用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暫...