实验目的:通过板载的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); } }