一.外部中断的配置流程
定义结构体变量
1.使能SYSCFG时钟、使能GPIOE时钟
2.初始化GPIO、设置GPIOE各项参数
3.设置IO口与中断线的映射关系
4.初始化线上中断、设置中断各项参数
5.配置中断分组、设置各项参数
6.编写对应的中断服务函数、清除中断标志位等
二.以上六个步骤就可以成功配置中断初始化函数了
1.第一步使能SYSCFG时钟、使能GPIOE时钟
//使能APB2SYSCFG时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//使能GPIOE时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA, ENABLE);
2.第二步初始化GPIO、设置GPIOE各项参数,因为这是用按键触发中断,所以采用的是通用输入模式 ,STM32的KEY_UP按键是在PA0口,且是高电平接通,所以初始化GPIOA就需要设置为下拉 注意:STM32的结构体变量需要放在初始化函数的最上面!!!
GPIOF_InitStructure.GPIO_Mode = GPIO_Mode_IN; //通用输出模式
GPIOF_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIOF_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin_2;
GPIOF_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIOF_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//初始化GPIOE
GPIO_Init(GPIOE, &GPIOF_InitStructure);
GPIOF_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIOF_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
//初始化GPIOA
GPIO_Init(GPIOA, &GPIOF_InitStructure);
最上方
3.第三步设置IO口与中断线的映射关系
//映射中断线 PE4->中断线4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
4.第四步初始化线上中断、设置中断各项参数
EXTI_InitStruture.EXTI_Line = EXTI_Line4; //中断线4
EXTI_InitStruture.EXTI_LineCmd = ENABLE; //使能
EXTI_InitStruture.EXTI_Mode = EXTI_Mode_Interrupt; //中断触发
EXTI_InitStruture.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
//中断初始化
EXTI_Init(&EXTI_InitStruture);
5.第五步配置中断分组、设置各项参数
配置中断优先级需要现在主函数中配置中断分组。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组2
在中断初始化函数中还有最后一步
NVIC_InitStruture.NVIC_IRQChannel = EXTI4_IRQn; //配置中断线4通道
NVIC_InitStruture.NVIC_IRQChannelCmd = ENABLE ; //使能
NVIC_InitStruture.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级设置为2
NVIC_InitStruture.NVIC_IRQChannelSubPriority = 1; //响应优先级设置为1
//中断优先级初始化
NVIC_Init(&NVIC_InitStruture);
6.第六步编写对应的中断服务函数、清除中断标志位等
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(KEY0 == 0)
{
LED9 = ~LED9;
}
EXTI_ClearITPendingBit(EXTI_Line4); //清除中断标志位
}
好了!!!
最后的效果是用按键触发中断,按下一次触发一次中断,LED进行取反一次。