方式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中方法一只让一个引脚允许中断,方法二让两个引脚同时允许中断