ch582M GPIO中断的问题?
int main()
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

    GPIOB_SetBits(GPIO_Pin_13);
    GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PU);      // RXD
    GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA); // TXD
    GPIOPinRemap(ENABLE,RB_PIN_UART1);
    UART1_BaudRateCfg(115200);
    UART1_DefInit();


    PRINT("Start @ChipID=%02x\n", R8_CHIP_ID);
    DelayMs(200);

#if 1
    /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); //

    GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);
    GPIOA_ITModeCfg(GPIO_Pin_4, GPIO_ITMode_RiseEdge); // 


    PFIC_EnableIRQ(GPIO_A_IRQn);
    //PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
#endif
    while(1){

    }
}

__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{

    printf("12=%d\n",GPIOA_ReadITFlagPort());
    if(GPIOA_ReadITFlagBit(GPIO_Pin_5) == 32){
         printf("12\n");
        GPIOA_ClearITFlagBit(GPIO_Pin_5);
    }
    printf("12=%d\n",GPIOA_ReadITFlagPort());
    if(GPIOA_ReadITFlagBit(GPIO_Pin_4) == 16){
        printf("34\n");
        GPIOA_ClearITFlagBit(GPIO_Pin_4);
    }


}

上面是我的测试代码,



问题描述:

    如果我只配置了PA5的中断触发模式,不去配置PA4 ,    而在中断里面的检测程序处GPIOA_IRQHandler(void)里面的程序如上所示,  则会出现一个现象:  如果上升沿电平在PA5处,那么在进入PA5的判断后也会进入PA4的中断标志判断,从而打印出“34\n”

    而如果PA5和PA4的中断模式同时配置,那么不同的触发源才能被正确检测到。


求解:

    但按照正常的逻辑应该是,我没有配置PA4,那么我去检测PA4的中断标志一定是没有被触发的状态,而不是任意的一个状态。

   所以有没有什么代码 可以规避这种错误,因为我的程序里面的PA4是由AT指令去配置模式,不会在上电就配置好,会引发一些bug,虽然也可以规避,但我想看看有没有更好的一个处理方式?




您好,如果io没有使能中断,那么此io产生不了中断的,但是io状态变化可能会置中断标志,

所以,中断中处理时可以&上中断使能寄存器,

 if((GPIOA_ReadITFlagBit(GPIO_Pin_5) & R16_PA_INT_EN) == 32)



好的,谢谢


只有登录才能回复,可以选择微信账号登录