wenbo2005.online

学习记录 / MSPM0

GPIO 外部中断四倍频

MSPM02025-06-03
#include "ti_msp_dl_config.h"

int32_t EncoderCnt = 0;//编码器计数值
volatile bool EncoderCnt_Flag_A = 1;//四倍频QEA触发切换标志位
volatile bool EncoderCnt_Flag_B = 1;//四倍频QEB触发切换标志位

int main(void)
{
    SYSCFG_DL_init();

    /* Enable Interrupt for both GPIOA ports */
    NVIC_EnableIRQ(GPIO_Encoder_INT_IRQN);//使能GPIOA中断

    while (1) {
    }
}

void GROUP1_IRQHandler(void)//编码器四倍频
{
    uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus(GPIO_Encoder_PORT, GPIO_Encoder_PIN_A_PIN | GPIO_Encoder_PIN_B_PIN);

    if ((gpioA & GPIO_Encoder_PIN_A_PIN) == GPIO_Encoder_PIN_A_PIN) {//其他写法(gpioA & GPIO_Encoder_PIN_A_PIN) != 0 或 gpioA & GPIO_Encoder_PIN_A_PIN
        if(EncoderCnt_Flag_A){
            if(DL_GPIO_readPins(GPIO_Encoder_PORT, GPIO_Encoder_PIN_B_PIN)){
                EncoderCnt--;
            }else{
                EncoderCnt++;
            }
            EncoderCnt_Flag_A = 0;
            DL_GPIO_setLowerPinsPolarity(GPIO_Encoder_PORT, DL_GPIO_PIN_4_EDGE_FALL);
        }else {
            if(DL_GPIO_readPins(GPIO_Encoder_PORT, GPIO_Encoder_PIN_B_PIN)){
                EncoderCnt++;
            }else{
                EncoderCnt--;
            }
            EncoderCnt_Flag_A = 1;
            DL_GPIO_setLowerPinsPolarity(GPIO_Encoder_PORT, DL_GPIO_PIN_4_EDGE_RISE);
        }
        DL_GPIO_clearInterruptStatus(GPIO_Encoder_PORT, GPIO_Encoder_PIN_A_PIN);
    }

    if ((gpioA & GPIO_Encoder_PIN_B_PIN) == GPIO_Encoder_PIN_B_PIN) {
        if(EncoderCnt_Flag_B){
            if(DL_GPIO_readPins(GPIO_Encoder_PORT, GPIO_Encoder_PIN_A_PIN)){
                EncoderCnt++;
            }else{
                EncoderCnt--;
            }
            EncoderCnt_Flag_B = 0;
            DL_GPIO_setLowerPinsPolarity(GPIO_Encoder_PORT, DL_GPIO_PIN_5_EDGE_FALL);
        }else{
            if(DL_GPIO_readPins(GPIO_Encoder_PORT, GPIO_Encoder_PIN_A_PIN)){
                EncoderCnt--;
            }else{
                EncoderCnt++;
            }
            EncoderCnt_Flag_B = 1;
            DL_GPIO_setLowerPinsPolarity(GPIO_Encoder_PORT, DL_GPIO_PIN_5_EDGE_RISE);
        }
        DL_GPIO_clearInterruptStatus(GPIO_Encoder_PORT, GPIO_Encoder_PIN_B_PIN);
    }
}