This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

中断问题:M4(ucos)的端口下降沿中断没有办法关闭,请高手帮我看看



void ADS1254SCLKInit(void)  //将GPIO_PIN_2设置为中断

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);// 设置PJ7为2MA,上拉输入
    GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN);//设置GPIO输入
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_2); // 设置KEY1所在管脚为输入  
    GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);//设置GPIO中断 
}

void IntADS1254Handler(void)  //中断执行程序
{
 unsigned long ulStatus;   
 ulStatus = GPIOPinIntStatus(GPIO_PORTD_BASE, true); // 读取中断状态
 GPIOPinIntClear(GPIO_PORTD_BASE, ulStatus);  // 清除中断状态,重要
 if (ulStatus&GPIO_PIN_2)   // GPIO_PIN_2
 {     
  GPIOPinIntDisable(GPIO_PORTD_BASE,GPIO_PIN_2); // 禁止GPIOD端口中断 
 IntDisable(INT_GPIOD); // 禁止GPIOD端口中断  
 OSSemPost(Fun_Semp);  //发送信号量   
 }  
}


下面是主程序
while (1)

OSSemPend(Fun_Semp,0,&err); //等待信号量


执行我的代码


GPIOPinIntEnable(GPIO_PORTD_BASE,GPIO_PIN_2); // 执行代码完后开中断 
IntEnable(INT_GPIOD); 

程序是:中断来后,关中断,发送信号量,主程序得到信号量,然后执行我的代码,执行完后,再打开中断
 
问题是:在中断中我关闭了中断,在我执行我的代码过程中,如果还有下降沿触发中断,还是会进入中断,就是说中断根本没有关闭。
为什么?程序哪里不对么?

  • 你好,

       按照你的需求,请参考下面这段代码,在跑裸机的情况下可以正常中断和取消中断:

    void GPIOInit(void) //
    {

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);//Enable PD
    // GPIOPadConfigSet(GPIO_PORTD_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);// set PD2 2ma and weak pull-up
    // GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN);//set PD2 as input
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_2); //
    ROM_GPIOPinIntEnable(GPIO_PORTD_BASE, GPIO_PIN_2);
    GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);// set PD2 falling interrupt
    ROM_IntEnable(INT_GPIOD);
    }
    int
    main(void)
    {
    GPIOInit();
    while(1)
    {

    }
    }
    void GPIODIntHandler(void) //
    {
    unsigned long ulStatus;
    ulStatus = GPIOPinIntStatus(GPIO_PORTD_BASE, true); //
    GPIOPinIntClear(GPIO_PORTD_BASE, ulStatus); //
    if (ulStatus&GPIO_PIN_2) // GPIO_PIN_2
    {
    GPIOPinIntDisable(GPIO_PORTD_BASE,GPIO_PIN_2); // ??GPIOD????
    ROM_IntDisable(INT_GPIOD); // ??GPIOD????
    //OSSemPost(Fun_Semp); //?????
    }
    }