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:为什么我的计时器周期关闭?

Guru**** 2481715 points
Other Parts Discussed in Thread: MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1273814/lp-mspm0g3507-why-is-my-timer-period-off

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

我正在修改 LaunchPad 的 timx_timer_mode_periodic_standby_LP_MSPM0G3507_nortos_ticlang 示例。

我要做的是、将其设置为使用40M 晶体并将计时器周期设置为1ms。 不过、我的表现似乎达到了20%左右、

我已经以这种方式设置了配置:

请注意、上面注明周期应为1ms

但我的周期实际上是1.25ms:

仅供参考、计数器设置为4999

下面是代码:

#include "ti_msp_dl_config.h"

/* ((32KHz / (32+1)) * 0.5s) = 45 - 1 = 495 due to N+1 ticks */
#define TIMER_500_MILLISECONDS_TICKS (495)
/* ((32KHz / (32+1)) * 0.05s) = 50 - 1 = 49 due to N+1 ticks */
#define TIMER_50_MILLISECONDS_TICKS (49)

volatile uint32_t SetCount;

int main(void)
{
    uint32_t setcount;

    SYSCFG_DL_init();

    SetCount = DL_Timer_getLoadValue(TIMER_0_INST);

    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
    DL_SYSCTL_enableSleepOnExit();

    DL_TimerG_startCounter(TIMER_0_INST);

    while (1) {
        __WFI();
    }
}

void TIMER_0_INST_IRQHandler(void)
{
    
    switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
        case DL_TIMER_IIDX_ZERO:
            /*
             * Counter stopped to avoid a conflict with the timer reading
             * the LOAD value while it's being set
             */
            //DL_TimerG_stopCounter(TIMER_0_INST);

            //DL_Timer_setLoadValue(TIMER_0_INST, count);
            /*
             * By default, this should load the new count value and count down
             * from there (CVAE = 0)
             */
            //DL_TimerG_startCounter(TIMER_0_INST);

            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            break;
        default:
            break;
    }
}

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

    尊敬的 Keith:

    实际输入频率似乎有问题、或者 SysConfig 生成的时钟或计时器设置有问题。 我想后者可以、但我们可以很容易地检查第一个用例、您能否 启用 CLK_OUT 引脚并测量 CLK_OUT 频率?  

    使用 HFCLK 而不是如下所示的 SYSOSC、并添加一个分频器、因为这是您的 MCLK 源。  

    之后、请尝试对源进行与 ULPCLK 相同的操作。 理论上、如果 ULPCLK 分频器为1、则输出应与 HFCLK 相同。  

    此致、
    布兰登·费舍尔

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

    CLK_OUT 无法输出40 MHz、因此我必须对其进行分频。 本实验中我没有这么做、但我过去做过、这与40 MHz 时钟一致。

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

    好的、这很好、您是同时检查 ULPCLK 还是仅检查 HFCLK? 如果 这两者看起来正常 、会指向定时器设置中的某个值。 ULPCLK 应仅为 ULPCLK 分频器上的 MCLK、因此如果 ULPCLK 看起来正确、则 MCLK 也被正确设置。  

    4999的加载值和8x 的分频器、产生的周期为1.25ms、我觉得 MCLK 仍然源自 SYSOSC (以32MHz 为基准)。  

    我将看看我是否也可以使用相同的设置在终端重新创建这个。  

    此致、
    布兰登·费舍尔

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

    "你是我的女人。" 我设置 CLK_OUT (我必须使用 PA14并抑制警告)

    将 HFCLK 作为 CLKOUT 源、我得到了40 MHz。 以 SYSCLK 作为源、我获得了32 MHz。 啊哈!

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

    在 SYSCLK 中、您指的是 ULPCLK 还是 SYSOSC?

    SYSOSC 我希望您看到32MHz、但配置  为40MHz 的 ULPCLK。 如果您是指 ULPCLK、那么、是的、我认为我们已经接近一个解决方案了。  

    您是否可以启动调试会话、运行代码并转到"View"->"Registers"在 SYSCTL 寄存器下、我希望您看一下 MCLKCFG、HSCLKCFG 和 HSCLKEN 寄存器。

    我想查看 USEHSCLK 和 HSCLKSEL 是否设置正确。

    此致、
    布兰登·费舍尔

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

    SYSOSC。 抱歉

    (哦、我在使用 Theia、如果这样做有区别)

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

    新信息:

    如果我注释掉

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

    尊敬的 Keith:

    有趣、您的电源策略是什么? 这应该在 SysConfig 的"SYSCTL"部分中可见。

    此致、
    布兰登·费舍尔  

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

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

    尊敬的 Keith:

    您正在使用哪个计时器实例? 我想查看它是在 PD0还是 PD1中。

     HFXT 将在 STANDBY0处被禁用(请参阅 TRM 中的表2-1)、但如果您在此测试期间运行调试器、则可能无法在功耗模式下使您获得该低电平。

    我认为、在使用外部高频晶体时、SLEEP0可实现的损耗最低。

    尝试将电源策略切换到该策略,之后,您应该能够重新添加__ WFI ();指令,希望您的时间应该像我们预期的那样正常。  

    此致、
    布兰登·费舍尔

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

    仅是 示例中的默认0实例。

    这是有道理的、我注意到、当我从调试器断开时、时序会减慢。

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

    仅是 示例中的默认0实例。

    [/报价]

    很好、TIMG0位于 PD0中、因此它应该一直处于开启状态并进入待机状态。 不过、当您进入较低功耗模式时、时钟源仍会发生变化。

    当调试器将您拉回到运行模式时、它可能从32MHz SYSOSC 运行(当尝试进入待机0时、HFXT 已被禁用)。 当您实际处于待机状态(调试器已断开连接)时、ID 希望它从 LFCLK 运行。  

    此致、
    布兰登

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

    您答对了、谢谢!