實驗目的:通過板載的4個按鍵控制板載兩個LED的亮滅以及蜂鳴器的發聲。
一、STM32的每個I/O口都可以作為中斷輸入,要把I/O口作為外部中斷輸入,有以下幾個步驟。
①、初始化I/O口為輸入
②、開啟 IO 口復用時鍾,設置 IO 口與中斷線的映射關系。
③、開啟與該 IO 口相對的線上中斷/事件,設置觸發條件。
④、配置中斷分組(NVIC),並使能中斷。
⑤、編寫中斷服務函數。
二、軟件設計
exti.c文件
#include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" //外部中斷 0 服務程序 void EXTI0_IRQHandler(void) { delay_ms(10); //消抖 if(WK_UP==1) //WK_UP 按鍵 { LED0=!LED0; LED1=!LED1; } EXTI->PR=1<<0; //清除 LINE0 上的中斷標志位 } //外部中斷 9~5 服務程序 void EXTI9_5_IRQHandler(void) { delay_ms(10); //消抖 if(KEY0==0) LED0=!LED0; //按鍵 0 EXTI->PR=1<<5; //清除 LINE5 上的中斷標志位 } //外部中斷 15~10 服務程序 void EXTI15_10_IRQHandler(void) { delay_ms(10); //消抖 if(KEY1==0) LED1=!LED1; //按鍵 1 EXTI->PR=1<<15;//清除 LINE15 上的中斷標志位 } //外部中斷初始化程序 //初始化 PA0,PC5,PA15 為中斷輸入. void EXTI_Init(void) { KEY_Init(); //按鍵初始化 Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿觸發 Ex_NVIC_Config(GPIO_C,5,FTIR); //下降沿觸發 Ex_NVIC_Config(GPIO_A,15,FTIR); //下降沿觸發 MY_NVIC_Init(2,2,EXTI0_IRQn,2); //搶占 2,子優先級 2,組 2 MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); //搶占 2,子優先級 1,組 2 MY_NVIC_Init(2,0,EXTI15_10_IRQn,2); //搶占 2,子優先級 0,組 2 }
exti.h
#ifndef __EXTI_H #define __EXTI_H void EXTI_Init(void);// 外部中斷初始化 #endif
test.c
#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "exti.h" int main(void) { Stm32_Clock_Init(9); //系統時鍾設置 delay_init(72); //延時初始化 uart_init(72,9600); //串口初始化 LED_Init(); //初始化與 LED 連接的硬件接口 EXTI_Init(); //外部中斷初始化 LED0=0; //點亮 LED while(1) { printf("OK\r\n"); delay_ms(1000); } }