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.

[参考译文] MSPM0L1105:用于唤醒器件的数字输入中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1396629/mspm0l1105-digital-input-interrupt-to-wake-device

器件型号:MSPM0L1105
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我将使用按钮触发 PA1上的 MSPM0L115 (28引脚型号)。 这是为了触发一个中断来将 MCU 从睡眠状态中唤醒。 以下是此 GPIO 的配置:

我希望此中断的实现方式与我在设计中其他地方实现的 TIMER0 IRQ 相同、但按下按钮无法唤醒器件。 我的相关代码如下:

    int main(void)
{
    SYSCFG_DL_init();
    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
    debugWrite("~ init ~\r\n");
    NVIC_DisableIRQ(TIMER_0_INST_INT_IRQN);
    NVIC_EnableIRQ(CONTROL_INT_IRQN);
    __WFI();
    NVIC_DisableIRQ(CONTROL_INT_IRQN);
    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
    debugWrite("~ button pressed ~\r\n");

"CONTROL"这里是我将该 GPIO 连接到的引脚组。 按下按钮时__ WFI()未通过。 设计中似乎没有为我的定时器0中断生成任何 IRQHandler 原型、因此我没有实施 IRQ 处理程序、但无论如何、我也不需要在按下按钮时运行代码。 如果我没有禁用此计时器0、则在每毫秒触发一次中断时传递_WFI()。 我住在 SLEEP0。 我还启用了"全局唤醒"。

我觉得我只是错过了一些初始化调用。 有什么建议吗?  

最后、我在哪里可以找到介绍如何使用 SysConfig 为该 MCU 生成的代码的文档? 此器件的 Code Academy 很有用、但未涵盖大多数功能。

谢谢

Jesse

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

    尊敬的 Jesse:

    1. SysConfig 中的配置似乎正确。 您能否确保在按下按钮后 PA1的电压已更改? (只需确保您的硬件是否正常)

    抱歉、我们没有 MCU 生成的代码相关文档。 代码全部使用 driverlib、可以打开此代码行的声明。

    此致、

    Zoey

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

    Zoey、您好!

    感谢您的答复。 我已经验证按钮是否正确连接、并在按下按钮时输出下降沿。

    我发现、我按下按钮时似乎触发了一个中断、但 MCU 将其视为"意外中断"、并锁定在该循环中:

    /* This is the code that gets called when the processor receives an unexpected  */
    /* interrupt.  This simply enters an infinite loop, preserving the system state */
    /* for examination by a debugger.                                               */
    void Default_Handler(void)
    {
        /* Enter an infinite loop. */
        while(1)
        {
        }
    }

    有什么想法、为什么 MCU 会将其视为未定义中断?

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

    因为你没有处理程序。

    添加此代码:

    /*
    * These are traps for debugging when you find that your code
    * ends up in the default handler for some unknown reason.
    * To keep the compiler from complaining, comment out the ones
    * below if you already have a working handler for that vector.
    *
    */
    void NMI_Handler(void){ __BKPT(0);}
    void HardFault_Handler(void){ __BKPT(0);}
    void SVC_Handler(void){ __BKPT(0);}
    void PendSV_Handler(void){ __BKPT(0);}
    void SysTick_Handler(void){ __BKPT(0);}
    void GROUP0_IRQHandler(void){ __BKPT(0);}
    void GROUP1_IRQHandler(void){ __BKPT(0);}
    void TIMG8_IRQHandler(void){ __BKPT(0);}
    void UART3_IRQHandler(void){ __BKPT(0);}
    //void ADC0_IRQHandler(void){ __BKPT(0);}
    //void ADC1_IRQHandler(void){ __BKPT(0);}
    void CANFD0_IRQHandler(void){ __BKPT(0);}
    void DAC0_IRQHandler(void){ __BKPT(0);}
    void SPI0_IRQHandler(void){ __BKPT(0);}
    void SPI1_IRQHandler(void){ /*__BKPT(0);*/ return;}
    void UART1_IRQHandler(void){ __BKPT(0);}
    void UART2_IRQHandler(void){ __BKPT(0);}
    void UART0_IRQHandler(void){ __BKPT(0);}
    void TIMG0_IRQHandler(void){ __BKPT(0);}
    void TIMG6_IRQHandler(void){ __BKPT(0);}
    void TIMA0_IRQHandler(void){ __BKPT(0);}
    void TIMA1_IRQHandler(void){ __BKPT(0);}
    void TIMG7_IRQHandler(void){ __BKPT(0);}
    void TIMG12_IRQHandler(void){ __BKPT(0);}
    void I2C0_IRQHandler(void){ __BKPT(0);}
    void I2C1_IRQHandler(void){ __BKPT(0);}
    void AES_IRQHandler(void){ __BKPT(0);}
    void RTC_IRQHandler(void){ __BKPT(0);}
    void DMA_IRQHandler(void){ __BKPT(0);}

    您至少可以看到需要添加的处理程序的名称。

    应该有一个您可以复制的 GPIO 中断示例。

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

    谢谢 Keith。 定义 Group1 IRQ 处理程序实现了这个目的。