方式1:单相
void GROUP1_IRQHandler(void) //编码器的中断函数
{uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA, GPIO_Encoder_PIN_Back_Left_A_PIN | GPIO_Encoder_PIN_Back_Right_A_PIN );if (gpioA & GPIO_Encoder_PIN_Back_Left_A_PIN !=0) //左后轮 A相上升沿{if(DL_GPIO_readPins(GPIO_Encoder_PORT , GPIO_Encoder_PIN_Back_Left_B_PIN )) //B相上升沿Back_Left_Count--;else Back_Left_Count++; //B相下降沿DL_GPIO_clearInterruptStatus(GPIO_Encoder_PORT , GPIO_Encoder_PIN_Back_Left_A_PIN);}if (gpioA & GPIO_Encoder_PIN_Back_Right_A_PIN !=0) //右后轮 A相上升沿{if(DL_GPIO_readPins(GPIO_Encoder_PORT , GPIO_Encoder_PIN_Back_Right_B_PIN )) //B相上升沿Back_Right_Count--;else //B相下降沿Back_Right_Count++;DL_GPIO_clearInterruptStatus(GPIO_Encoder_PORT , GPIO_Encoder_PIN_Back_Right_A_PIN);}}
方式2:双相同时中断
void GROUP1_IRQHandler(void)
{gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA,GPIO_EncoderA_PIN_0_PIN | GPIO_EncoderA_PIN_1_PIN);if((gpioA & GPIO_EncoderA_PIN_0_PIN) == GPIO_EncoderA_PIN_0_PIN){//Pin0上升沿if(!DL_GPIO_readPins(GPIOA,GPIO_EncoderA_PIN_1_PIN))//P1为高电平{gEncoderCount--;}else//P1为低电平{gEncoderCount++;}}else if((gpioA & GPIO_EncoderA_PIN_1_PIN) == GPIO_EncoderA_PIN_1_PIN){//Pin1上升沿if(!DL_GPIO_readPins(GPIOA,GPIO_EncoderA_PIN_0_PIN))//P0为高电平{gEncoderCount++;}else//P1为低电平{gEncoderCount--;}}DL_GPIO_clearInterruptStatus(GPIOA, GPIO_EncoderA_PIN_0_PIN|GPIO_EncoderA_PIN_1_PIN);
}
区别就是在SYSCFG中方法一只让一个引脚允许中断,方法二让两个引脚同时允许中断