STM32每个引脚都可以作为外部中断使用,
1、代码
外部中断初始化程序:
//外部中断服务程序
void EXTI_Config(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource, uint32_t EXTI_Line, uint8_t NVIC_IRQChannel)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能复用功能时钟
//GPIO Structure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PB5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //Set Frequency 50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);
//【中断端口、中断线】以及【中断初始化配置】,下降沿触发
GPIO_EXTILineConfig(GPIO_PortSource, GPIO_PinSource);
EXTI_InitStructure.EXTI_Line = EXTI_Line;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
//NVIC初始化配置
NVIC_InitStructure.NVIC_IRQChannel = NVIC_IRQChannel; //使能PA15的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级1,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
外部中断处理程序
u8 ifconfig = 0; //全局变量,中断发生标志,进入中断以后将该位置1
//外部中断4服务程序
void EXTI4_IRQHandler(void)
{
mydelay(10);//消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0)//确认按下
{
ifconfig = 1;
}
EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE15上的中断标志位
}