(这是中断初始化函数)
void Init_EXTIX_TI(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure; //定义一个EXTI结构体变量
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能,使用中断功能重要!!!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
//GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//映射
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
/* 设置外部中断结构体的成员*/
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
//EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级?
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级?
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
}
(中断执行函数)
void EXTI0_IRQHandler(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Pinb=GPIO_ReadInputData(GPIOB);
ACurrLevel=((Pinb)>>(0)&1);
BCurrLevel=((Pinb)>>(1)&1);
if(EXTI_GetITStatus(EXTI_Line0)!= RESET) //判断是否发生中断,发生则中断标志置1
{
//GPIO_SetBits(GPIOC,GPIO_Pin_13);
if(last_ACurrLevel==1 && last_BCurrLevel==1)
{
if(ACurrLevel==0&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==1&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT--;
}
else if(last_ACurrLevel==0 && last_BCurrLevel==1)
{
if(ACurrLevel==0&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==1&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT--;
}
else if(last_ACurrLevel==0 && last_BCurrLevel==0)
{
if(ACurrLevel==1&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==0&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT--;
}
else if(last_ACurrLevel==1 && last_BCurrLevel==0)
{
if(ACurrLevel==1&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==0&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT--;
}
}
last_ACurrLevel=ACurrLevel;
last_BCurrLevel=BCurrLevel;
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
EXTI_ClearITPendingBit(EXTI_Line0);
} |
、、、