第4课,外部中断
一、32的外部中断简述
32的中断可能有很多个,其通过端口映射,可以将很多端口都作为外部中断端口。其次,其中断数受它的中断通道的数目的影响,有两种中,一种是多对一,一种是一对一。多对一是可以通过多个中断线来触发同一个中断口的函数。
二、中断的设置
1.设置简述
中断是基于一个IO口的,所以需要一个输入IO作为中断IO口,其关系为:
将IO口映射到中断寄存器即可,他们互不干扰。然后设置中断函数就可以了
2.设置过程
a 初始化IO口为输入,就是第一节课的内容
b 开启AFIO映射时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
c 将IO口映射到中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);//前者为端口,后者为引脚,例如此为PC5
d 设置中断效果和中断线,中断线如同一个中断的句柄,唯一ID标识
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line0;//确定中断线为哪一根
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寄存器
e 设置NVIC分组,如同第三课
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
f 设置中断函数,清除中断标志
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位
}
3.额外的注意
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
//这两个线和通道需要对应
4.模板
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}