配置两个引脚中断,下次中断中我想单独关闭PA14中断,请问怎么关闭?

    配置两个引脚中断,下次中断中我想单独关闭PA14中断,请问怎么关闭?

/* 配置唤醒源为 GPIO - PA14 */

    GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU);

    GPIOA_ITModeCfg(GPIO_Pin_14, GPIO_ITMode_FallEdge); // 下降沿唤醒

    PFIC_EnableIRQ(GPIO_A_IRQn);

    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

    /* 配置唤醒源为 GPIO - PA15 */

    GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);

    GPIOA_ITModeCfg(GPIO_Pin_15, GPIO_ITMode_FallEdge); // 下降沿唤醒

    PFIC_EnableIRQ(GPIO_A_IRQn);

    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);


可以尝试引脚中断使能关闭:

image.png


谢谢,这个函数我有个疑问。

R16_PA_INT_IF = pin;

这样我如果调用这个函数两次分别初始化两个引脚,这个 R16_PA_INT_IF 值 是不是就等于一个引脚的值了?

为什么不写成  R16_PA_INT_IF |= pin;  ?


R16_PA_INT_IF的对应标志位写1,是清除标志用的,写1清零。清零后在下面配置R16_PA_INT_EN |= pin;来单独使能IO中断。


中断里14 进来时就关闭14中断,使能15中断 。但是当15中断来时候,如果14还有触发,还能进14的中断。 这句不是已经关了,为什么还能进14中断   R16_PA_INT_EN &= ~GPIO_Pin_14;              //关闭中断14          

关闭后还能 GPIOA_ReadITFlagBit(GPIO_Pin_14)   ???


但是我如果两个都关掉 如下两行,是正常的,两个中断一起关闭了。为什么不能关一个?

R16_PA_INT_EN &= ~GPIO_Pin_15;     //关闭中断15

R16_PA_INT_EN &= ~GPIO_Pin_14;     //关闭中断14




__INTERRUPT

__HIGH_CODE

void GPIOA_IRQHandler(void)

{

    if(GPIOA_ReadITFlagBit(GPIO_Pin_14)) //14

    {

            R16_PA_INT_IF |= GPIO_Pin_15;   R16_PA_INT_EN |= GPIO_Pin_15;    //使能15中断

            VsyncActive = 1;

            R16_PA_INT_EN &= ~GPIO_Pin_14;              //关闭中断14

            PRINT("PA14 R16_PA_INT_EN=%x\r\n",R16_PA_INT_EN);


    }

    if(GPIOA_ReadITFlagBit(GPIO_Pin_15))//PICLK

    {

        PRINT("PA15 R16_PA_INT_EN=%x\r\n",R16_PA_INT_EN);

    }


    GPIOA_ClearITFlagBit( GPIO_Pin_14 | GPIO_Pin_15);

}



中断标志与使能标志是分开独立工作的。即使没有配置GPIO中断,中断标志也会按复位值的中断触发配置去产生标志。可以在中断服务函数中添加一个判断逻辑,检查是否已启用对应位的中断使能。
image.png


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