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.

[参考译文] MSPM0C1104:使用 TIMG8时计时器代码不起作用、但在 TIMG14和 TIMA0上有效。

Guru**** 2459650 points
Other Parts Discussed in Thread: MSPM0L1306, MSPM0G3507, MSPM0C1104, SYSCONFIG, LP-MSPM0C1104

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1486610/mspm0c1104-timer-code-does-not-work-when-using-timg8-but-works-on-timg14-and-tima0

器件型号:MSPM0C1104
主题中讨论的其他器件:MSPM0L1306MSPM0G3507、、 SysConfig

工具与软件:

大家好、我遇到了一个问题、即计时器队列实现的代码仅在 TIMG14和 TIMA0上起作用。 对于 MSPM0C1104、TIMG8不起作用。 我还注意到、我的代码仅在 MSPM0G3507和 MSPM0L1306 LaunchPad 板上使用 TIMA0起作用。

我使用 C SDK 复制了一个最小的示例(实际代码用 Rust 编写)、它似乎 TIMG8在逐行复制我编写的 Rust 代码时从未开始计数。 更改"empty_non_sysconfig.c"文件中的定义以使用 TIMG14或 TIMA0将导致代码正常工作。 该代码应导致 Launchpad 电路板上的 LED 每秒切换一次。

尽管此处没有详细说明、但我将解释我要尝试执行的操作。 定时器队列使用其中一个定时器、并将其置于一个可永远递增计数的自由运行模式。 计时器队列工作使用 CCU0并加载中断来递增指示经过了多少个32768个计时器"节拍"的值。 周期数和当前计数器值用于计算与自启动以来经过的时间量相对应的全局"节拍"计数器。 CC1会加载一个值、该值对应于当前周期内在计时器警报发生前的节拍数。 当警报将在下一周期内发生时、启用 CCU1中断。 然后、在发生警报时发生 CCU1中断。

我记得 MSPM0G3507硬件中存在的 TIMER_ERR_01勘误表。 但是、鉴于此代码适用于3个计时器中的2个计时器(以及 G3507的其中一个计时器)、我不确定问题是否与之相关。

我已附上一个针对 LP-MSPM0C1104电路板重现此问题的工程。 这仅包含与 CCU0和负载相关的代码、因为 TIMG8从不启动。

e2e.ti.com/.../empty_5F00_non_5F00_sysconfig_5F00_LP_5F00_MSPM0C1104_5F00_nortos_5F00_gcc.tar

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

    很抱歉、我们今天很忙、明天请让我来测试一下。

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

    简短答案:添加此行:

    > DL_Timer_setCounterControl (TIMER、DL_TIMER_CZC_CCCTL0_ZCOND、DL_TIMER_CAC_CCCTL0_ACOND、DL_TIMER_CLC_CCCTL0_LCOND);

    较长的答案:CTRCTL:CAC:需要设置为=0 (CCCTL0_ACOND)以进行计数(大概为 CCCTL_01[0].ACOND=0以获得 TIMCLK)。 但 CAC 复位为=7 (保留)、因此需要设置为某个值。

     DL_Timer_setCounterMode 中 CTRCTL 的 RMW 重写为 TIMG8的 CAC = 7、但重写为 TIMG14的 CAC = 3 [这本身为奇数]。 CAC= 3指 CCCTL3_ACOND、TIMG14 (和 TIMA0)巧合的是有4个 CC 寄存器、而 CCCTL_23[1].ACOND=0、这是偶然发生的。 [如果定时器不能用于 QEI、我怀疑 CAC 位2不存在。]

    CTRCTL 的 RMW: 将完全更改 CAC、并根据其功能以不同的方式执行。 [我仍然认为 CAC 一开始重置为保留值(=7)是很奇怪的。]

    但最终您需要将 CAC 设置为某个值、因此您需要该呼叫。

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

    Bruce、您好!

    将 CAC、CZC 和 CLC 设置为零确实可以解决该问题。 感谢您帮助我弄清楚这个问题。

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

    在我的(非 DL)计时器模块中、如下所示:

    > TIMT->COUNTERREGS.CTRCTL = GPTIMER_CTRCTL_CAC_CCCTL0_ACOND|GPTIMER_CTRCTL_CVAE_ZEROVAL|
    GPTIMER_CTRCTL_REPEAT_REPEAT_1|GPTIMER_CTRCTL_CM_UP;

    然后:

    > TIMT->COUNTERREGS.CCCTL_01[0]= GPTIMER_CCCTL_01_ACOND_TIMCLK|GPTIMER_CCCTL_01_COC_COMPARE;

    我认为我的结论是我不需要关心 CZC 和 CLC。 DL 要求您设置所有3个。