首页 > 技术文章 > 外部中断实验

youwei666 2019-11-25 19:04 原文

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

 

推荐阅读