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.

[参考译文] TM4C129ENCPDT:中断回调将停止工作

Guru**** 2385860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1334034/tm4c129encpdt-interrupt-call-back-will-stop-working

器件型号:TM4C129ENCPDT

您好 Charles、

我希望您做得好。

我正面临另一个奇怪的问题。 我在 GPIO_PORTM_BASE 上有两个中断、一个在  GPIO_PIN_3 即 PM3另一个是  GPIO_PIN_6 即 PM6。  GPIO_PIN_6  中断将始终被触发、并将 CPU 固定在中断处理程序例程中、而  GPIO_PIN_3 中断会在前几个周期内触发 CPU 进入中断处理程序例程。 但是、一段时间后、CPU 将不会从  GPIO_PIN_3  我已将中断信号范围限定在 GPIO_PIN_3  我可以看到中断信号始终如预期那样出现。

GPIO_PIN_3  是在15ms 运行的周期性中断、  GPIO_PIN_6 是用户按下按钮时触发 ISR 的按钮。  

GPIO_PIN_6 将始终触发 CPU。

以下是我的代码。

定义为:

#define PSONOFFRESET_RQST_PORT  GPIO_PORTM_BASE
#define PSONOFFRESET_RQST_PIN   GPIO_PIN_6 //PM6

#define ADC_CTRL_PORT          GPIO_PORTM_BASE
#define ADC_BUSY                GPIO_PIN_3 //PM3

ISR 现已问世;

//Interrupt Service Routine
void PORTM_Common_IntHandler(void)
{
    // Clear the interrupt
    uint32_t status;
    SysCtlDelay(10);
    status = GPIOIntStatus(ADC_CTRL_PORT, true);
    if(status & ADC_BUSY)
    {
        ExtADC_Collect_Data();
    }
    else if (status & PSONOFFRESET_RQST_PIN)
    {
        Global_Flag = 1;
        }


    }
    GPIOIntClear(ADC_CTRL_PORT, status);

}

//Enable GPIO_PIN_6 interrupt function
void PS_ONOFFRESET_Req_interrupt_enable(void)
{

    IntMasterDisable();
    GPIOPinTypeGPIOInput(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN);
    GPIOPadConfigSet(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);  // Enable weak pullup resistor for ADC_BUSY
    GPIOIntDisable(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN);        
    GPIOIntClear(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN);      

    GPIOIntRegister(PSONOFFRESET_RQST_PORT, PORTM_Common_IntHandler);
    GPIOIntTypeSet(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN, GPIO_LOW_LEVEL);            
    GPIOIntEnable(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN);     
    IntMasterEnable();

}

//Enable GPIO_PIN_3 interrupt function
void ExtADC_Busy_interrupt_enable(void)
{
    //Enable Interrupt on ADC_BUSY Pin
    IntMasterDisable();
    GPIOPinTypeGPIOInput(ADC_CTRL_PORT, ADC_BUSY);
    GPIOPadConfigSet(ADC_CTRL_PORT, ADC_BUSY, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);
    GPIOIntDisable(ADC_CTRL_PORT, ADC_BUSY);
    GPIOIntClear(ADC_CTRL_PORT, ADC_BUSY);
    GPIOIntRegister(ADC_CTRL_PORT, PORTM_Common_IntHandler);
    GPIOIntTypeSet(ADC_CTRL_PORT, ADC_BUSY, GPIO_FALLING_EDGE);
    GPIOIntEnable(ADC_CTRL_PORT, ADC_BUSY);
    IntMasterEnable();

}

 

不知道、出了什么问题。  

感谢您的帮助。

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Salil:

     我认为您需要同时处理两个中断。 我建议您做以下事情。  

    if(status & ADC_BUSY)
    {
    ExtADC_Collect_Data();

    GPIOIntClear(ADC_CTRL_PORT, ADC_BUSY);

    }


    if (status & PSONOFFRESET_RQST_PIN)
    {
    Global_Flag = 1;

    GPIOIntClear(PSONOFFRESET_RQST_PORT, PSONOFFRESET_RQST_PIN);

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很好地抓住了错误查尔斯,但我认为问题是无关的。 我来更新更改并回复您。