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-MSPM0G3507:计时器 G 不能正常工作

Guru**** 2482225 points
Other Parts Discussed in Thread: LP-MSPM0G3507, MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1253063/lp-mspm0g3507-timer-g-not-working-properly

器件型号:LP-MSPM0G3507
主题中讨论的其他器件: MSPM0G3507SysConfig

您好!
使用 LP-MSPM0G3507来评估计时器。
SDK 使用 MSPM0 1.0.1.03。

我在示例工程中使用了"timx_timer_mode_one_shot_standby_LP_MSPM0G3507_nortos_ticlang"进行了检查、并确认计时器 G 不能正常工作。
在对样本项目稍作修改后、当定时器中断被进入时、定时器中断在一段特定的时间后被重新设定。
以下代码。

当您执行此代码时、将进行以下移动。
1在第12行输入___ WFI ()。
2输入第一个计时器中断。
3与第12行上的__ WFI ()没有进展。
4如果您使用调试器暂停→重启、则会继续执行第13行。
5输入第二个计时器中断。

有一种现象在第三阶段没有进展,但为什么会这样发生呢?
如果不使用 WFI ()和使用标志进行控制,但不使用调试器,计时器将无法正常工作。

我想请您教授。

int main(void)
{
    SYSCFG_DL_init();

    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
    DL_SYSCTL_enableSleepOnExit();

    DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
    DL_TimerG_startCounter(TIMER_0_INST);

    while (1) {
        __WFI();
        DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        DL_Timer_setTimerCount(TIMER_0_INST,TIMER_0_INST_LOAD_VALUE);
        DL_Timer_startCounter(TIMER_0_INST);
    }
}

void TIMER_0_INST_IRQHandler(void)
{
    switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
        case DL_TIMER_IIDX_ZERO:
            DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            DL_Timer_stopCounter(TIMER_0_INST);
            DL_Timer_setTimerCount(TIMER_0_INST, 0x0);
            break;
        default:
            break;
    }
}

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

    尊敬的 Katsuya:

    我想澄清一下、您正在寻找要重复输入的中断?

    您开始使用的示例使用了一次性计时器。 这意味着、缺省情况下、这个示例将不会重复中断。

    您可以进行的最简单的修改是更改 SysConfig 以设置周期性向下计数、从而使中断"零事件"重复发生。 完成此更改后、您将需要更改中断以切换 LED、而不是将 LED 设置为显示正在进入该状态。

    以下是 SysConfig 屏幕截图和中断处理程序更改:

    如果这不是你在寻找的,请告诉我,我将很乐意帮助你在任何其他设置。

    顺便说一下、我看到您使用的是旧版 SDK。 我建议 通过此链接下载最新版本(1.10.00.05)

    此致、

    格雷戈

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

    Greg 您好!
    是的、我要查找要重复输入的中断。
    我在查看错误的示例代码。
    如何使用"timx_timer_mode_periodic_standby_LP_MSPM0G3507_nortos_ticlang"实现以下行为?
    ①计时器开始
    ②任意时间的定时器停止
    ③可随时从初始状态启动计时器
    如下图所示。

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

    尊敬的 Katsuya:

    非常感谢您 提供此图。 这有助于我了解您正在努力实现的目标。

    我对这款型号有疑问。 您需要使用什么方法来停止计时器? 是周期性的、还是有一些外部输入会停止计时器? 如果您想使用另一个 MSPM0外设停止计时器、则可以在 SysConfig 中设置一个事件以复位计时器。 如果它只是一个周期性计数、您可以增加计时器的周期。

    此致、

    格雷戈

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

    Greg 您好!
    问题是不对所有人。
    我想做的是这样的事情:
    我④了示例代码"timx_timer_mode_periodic_standby_LP_MSPM0G3507_nortos_ticlang"进行了少量修改并进行了确认、但⑥ μ s 至→μ s 不起作用、除非暂停 恢复一次。
    我想在不使用 Suspend→Resume 的情况下正常工作、如何修复?

    ①计时器开始
    ②执行计时器中断处理
    ③在中断处理期间定时器停止
    ④更改为任何计时器周期
    ⑤以任意时序开始计时器
    ⑥执行计时器中断处理

    int main(void)
    {
        SYSCFG_DL_init();
    
        NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
        DL_SYSCTL_enableSleepOnExit();
    
        DL_TimerG_startCounter(TIMER_0_INST); //①
    
        while (1) {
            __WFI();
            DL_Timer_setLoadValue(TIMER_0_INST, TIMER_500_MILLISECONDS_TICKS); //④
            DL_TimerG_startCounter(TIMER_0_INST); //⑤
        }
    }
    
    void TIMER_0_INST_IRQHandler(void)
    {
        static uint32_t count = TIMER_500_MILLISECONDS_TICKS;
        switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
            case DL_TIMER_IIDX_ZERO: //②,⑥
    
                DL_TimerG_stopCounter(TIMER_0_INST); //③
    
                DL_Timer_setLoadValue(TIMER_0_INST, 0x0);
    
                DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
                break;
            default:
                break;
        }
    }

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

    尊敬的 Katsuya:

    我运行了修改后的示例(假设未对 SysConfig 进行更改)。 这是我注意到的。

    WFI()之后的代码行(上面代码中的第12和第13行)未执行。 我能够通过取出第6行(函数 DL_SYSCTL_enableSleepOnExit ())使这些行执行。 然后、我看到计时器设置为500ms 周期。 只有当 WFI()之后的 while (1)循环中没有其他内容时,才应使用退出睡眠模式。

    此操作是否解决了您的问题? 如果您有任何其他问题、请告诉我。

    谢谢。

    格雷戈

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

    Greg 您好!
    谢谢你,我通过注释掉 DL_SYSCTL_enableSleepOnExit()确认了它能正常工作。

    请再说一件事。
    执行上述确认时未更改示例代码中 SysConfig 的计时器外设(TIMG0)设置。
    当将其更改为 TIME6或 TIMG7时,即使您注释掉 DL_SYSCTL_enableSleepOnExit (),也会出现与上次相同的现象。  你知道是什么原因造成了这种情况吗?

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

    尊敬的 Katsuya:

    我知道这是什么原因造成的。 这是 TIMG6和 TIMG7的产品、 无寄存器保留 。 您可以在 SysConfig 中的 Advanced Configuration 选项卡下查看有关寄存器保留的详细信息。 我将在下面附加一张屏幕截图、但如果您点击 SysConfig 中标签右侧的问号、应该还能看到这些详细信息。 此字段在您选择新计时器时更新。

    如果您在低功耗模式下使用计时器、则要确保为此解决方案选择的计时器具有寄存器保留。 这些计时器 TIMG0、TIMG8和 TIMG12 。 我确认了 TIMG0和 TIMG8应该在使用停止或待机模式的情况下与您的代码一起工作。 如果您使用 TIMG12、则仅限于使用睡眠低功耗模式、 (您可以在 SysConfig 的"SYSCTL"选项卡中进行更改)。

    祝您度过美好的一天!

    格雷戈