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.

[参考译文] LP-MSPM0L1306:关于禁用中断

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1284535/lp-mspm0l1306-about-disabling-interrupts

器件型号:LP-MSPM0L1306

#include "ti_msp_dl_config.h"

unsigned long   count_timer = 0;

extern volatile uint32_t interruptVectors[];

int main(void)
{
    SYSCFG_DL_init();
    DL_SYSCTL_enableSleepOnExit();
    NVIC_EnableIRQ(GPIO_SWITCHES_INT_IRQN);
    NVIC_EnableIRQ(COMPARE_0_INST_INT_IRQN);
    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
    count_timer = 1500;
    while (1) {
        __WFI();
    }
}

void GROUP1_IRQHandler(void)
{
    uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus
                         (GPIO_SWITCHES_PIN_18_PIN);

        if ((gpioA & GPIO_SWITCHES_PIN_18_PIN) ==
               GPIO_SWITCHES_PIN_18_PIN)
          {
            if (DL_GPIO_readPins(GPIO_SWITCHES_PORT, GPIO_SWITCHES_PIN_18_PIN ))
              {
               DL_TimerG_startCounter(COMPARE_0_INST);
               DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
               DL_GPIO_disableInterrupt(GPIOA, GPIO_SWITCHES_PIN_18_PIN);
              }

            DL_GPIO_clearInterruptStatus(GPIOA, GPIO_SWITCHES_PIN_18_PIN);
          }
}

void COMPARE_0_INST_IRQHandler(void)
{
    switch (DL_TimerG_getPendingInterrupt(COMPARE_0_INST)) {
        case DL_TIMER_IIDX_ZERO:
            if(count_timer>0)
            {
                count_timer = count_timer-1;
            }

            DL_TimerG_stopCounter(COMPARE_0_INST);



    if (count_timer == 0)
    {
        DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        DL_GPIO_enableInterrupt(GPIOA, GPIO_SWITCHES_PIN_18_PIN);
        count_timer = 1500;
    }else if  (count_timer > 0)
    {
        DL_TimerG_startCounter(COMPARE_0_INST);
    }
    break;
            default:
                break;
    }
}

代码的目的是在检测到 GPIO 中断后启动计时器并针对设置值"COUNT_TIMER"重复计时器操作。

当"COUNT_TIMER"达到0时、LED 会亮起。 但现在我想在重复计时器操作的同时禁用 GPIO 中断。

不过、以上代码在某些情况下无法正常工作。


在计时器开始工作之后(此时、引脚18为低电平)、在"COUNT_TIMER"达到0之前、再次将引脚18的输入设置为高电平。

如果您继续将其设置为高电平、直到"COUNT_TIMER"达到0、"COUNT_TIMER"在它变为0且进入 DL_GPIO_enableInterrupt ()的那一刻、将出现另一个中断、定时器将开始工作。


似乎当 DL_GPIO_enableInterrupt()运行时,进入挂起的 GPIO 中断,同时进入计时器中断。


当从禁用中断更改为启用中断时、如何防止暂挂中断运行并在启用中断后检测到中断触发?


除了 DL_GPIO_disableInterrupt ()和 DL_GPIO_enableInterrupt ()外,是否需要任何其他设置?

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

    我假设您的按钮上的干扰可能会引起很多中断。 您能否使用软件来解决它、例如在 IRQ 中添加计数器。 仅当计数器的计数值为1时、才允许使用交叉开关和控制计时器。

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

    您能告诉我更多详细信息吗?
    我应该添加什么代码?

    另外,关于 GPIO 中断禁用/启用设置,我是否理解除了 DL_GPIO_disableInterrupt ()和 DL_GPIO_enableInterrupt ()之外没有其他代码要添加?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外,关于 GPIO 中断禁用/启用设置,我正确的理解是除了 DL_GPIO_disableInterrupt ()和 DL_GPIO_enableInterrupt ()?[/引号之外没有其他代码可添加吗?

    可以。

    您需要添加代码以实现过滤按钮干扰的方法。 因此、我建议您像这样操作。 请记住稍后手动清除计数。

    uint32_t 计数;

    void Group1_IRQHandler (void)
    {
    uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus
    (GPIO_SWITCHES_PIN_18_PIN);

    计数++;

    如果(((gpioA 和 GPIO_SWITCHS_PIN_18_PIN)==
    GPIO_SWITCHES_PIN_18_PIN)
    {
    如果(DL_GPIO_readPins (GPIO_switches_port、GPIO_switches_PIN_18_PIN ))
    {

    if (count==1)

    {

    DL_TimerG_startCounter (COMPARE_0_INST);
    DL_GPIO_setPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
    DL_GPIO_disableInterrupt (GPIOA、GPIO_switches_PIN_18_PIN);

    DL_GPIO_clearInterruptStatus (GPIOA、GPIO_switches_PIN_18_PIN);