一、外部中断概述
1、简介
stm32F4每一个IO口都可以作为外部中断的输入端
stm32F4的中断控制器支持22个外部中断/事件请求
EXTI线0~15:对应外部IO口的输入中断!!!
每个外部中断线可独立的配置触发方式(上升沿/下降沿/双边沿触发)、触发or屏蔽、状态位
2、外部中断线与IO口的对应方式
stm32F407ZGT6供IO口使用的中断线有16个,但共有112个IO口,对应16*7
可以看出,一个中断线映射了7个IO口,但使用过程中只能同时用一个IO口
3、IO口外部中断的中断服务函数与中断向量
IO口外部中断在中断向量表中分配了7个中断向量,即只能用7个中断服务函数
二、外部中断EXTI库函数
1、设置IO口与中断线的映射关系
void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);
头文件位于中
例如:将PE2映射到中断线2
2、初始化中断线
头文件位于中
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
可以看出,此函数唯一一个入口参数是结构体变量名,结构体如下:
3、状态获取判断/清除函数
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); //判断中断线中断状态
void EXTI_ClearITPendingBit(uint32_t EXTI_Line); //清除中断线上的中断标志位
4、SYSCFG时钟使能
由于调用了SYSCFG的中断线配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
三、外部中断配置步骤
四、实例 按键触发外部中断
在此处写GPIO_Init()可以直接调用封装好的按键初始化函数KEY_Init()
由于KEY0按下为低电平,日常为高,配置成下降沿有效
1、exit.c
#include "exti.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "beep.h"
//外部中断0服务程序
void EXTIX_Init()
{
EXTI_InitTypeDef EXTI_Initstruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
KEY_Init();
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
// SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);
// SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
EXTI_Initstruct.EXTI_Line=EXTI_Line4;
EXTI_Initstruct.EXTI_LineCmd=ENABLE;
EXTI_Initstruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Initstruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Initstruct);
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn; //定时器3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//写中断服务函数
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(KEY0==0)
{
LED0=!LED0;
LED1=!LED1;
}
//清除中断线标志位
EXTI_ClearITPendingBit(EXTI_Line4);
}
2、main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //串口初始化
LED_Init(); //初始化LED端口
BEEP_Init(); //初始化蜂鸣器端口
EXTIX_Init(); //初始化外部中断输入
LED0=0; //先点亮红灯
while(1)
{
printf("OK\r\n"); //打印OK提示程序运行
delay_ms(1000); //每隔1s打印一次
}
}