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.

[参考译文] AM625-Q1:FreeRTOS 中 MCU_TIMER3一致的计时器差异

Guru**** 2392905 points
Other Parts Discussed in Thread: AM625-Q1, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1482076/am625-q1-mcu_timer3-consistent-timer-discrepancy-in-freertos

器件型号:AM625-Q1
主题: SysConfig 中讨论的其他器件

工具/软件:

您好:  

在 FreeRTOS 中读取 AM625-Q1上的 MCU_TIMER3时、我们始终遇到~24周期差异。  我们在自由运行模式下使用该计时器(溢出时间约为171.8秒)来替代 I2C 驱动器中的 SysTick 计时器。

我们直接读取计时器计数器寄存器(TCRR)、并将值存储在 prevCount 变量中。 在每次迭代中、我们将当前计时器计数与比较 prevCount 以检测溢出(当当前计数小于时 prevCount)。

我们持续观察到 prevCount  实际计时器溢出发生之前、比当前计时器计数大约24个周期的差异。 这种差异似乎来自计时器本身、因为直接从 TCRR 寄存器读取的值不一致。

我们的问题

  1. 如果先前读取的值有时大于当前值、但不是由于真正的溢出而导致的、那么向上计数计时器如何表现出这种行为? 我们排除了典型的软件问题、如非原子访问或不正确的溢出处理。

  2. 是否有任何与 AM625-Q1上的 MCU_TIMER3相关的已知限制或勘误表 可能会导致这种周期性的24周期差异? 我们查看了数据表、但找不到任何直接解决此特定行为的方法。 我们使用 CONFIG_TIMER3_CLOCK_SRC_MCU_HFOSC0 作为时钟源。

  3. I2C 外设或其驱动程序的交互是否可能会干扰计时器的运行?

    我们还附加了相关代码片段和 SysConfig 计时器设置。

 

-------------------------API to setup timer as free-running--------------

void TimerP_setup(uint32_t baseAddr, TimerP_Params *params)
{
    volatile uint32_t *addr;
    uint32_t ctrlVal = 0u;

    DebugP_assert( baseAddr!=0U);
    (void)params;
    /* stop timer and clear pending interrupts */
    TimerP_stop(baseAddr);

    /* autoreload timer */
    ctrlVal |= (0x1U << 1);
    /* Compare enable*/
    ctrlVal |= (0x1U << 6);

    
    /* set timer control value */
    addr = (volatile uint32_t *)(baseAddr + TIMER_TCLR);
    *addr = ctrlVal;
    
    /* set timer count value */
    addr = (volatile uint32_t *)(baseAddr + TIMER_TCRR);
    *addr = 0u;
    
    /* set reload value */
    addr = (volatile uint32_t *)(baseAddr + TIMER_TLDR);
    *addr = 0u;
}

---------------------------API to get Count---------------------------------------

uint32_t TimerP_getCount(uint32_t baseAddr)
{
    volatile uint32_t *addr = (volatile uint32_t *)(baseAddr + TIMER_TCRR);
    uint32_t count;
    uintptr_t key;

    key = HwiP_disable();    // Disable interrupts/enter critical section

    count = *addr;       // First read (dummy read)
    count = *addr;       // Second read (actual value)

    HwiP_restore(key);   // Re-enable interrupts/exit critical section

    if (prevCount > count && prevCount != 0) 
    {
         // Check and log only if it's not the initial state
         DebugP_log("Timer Discrepancy: prevCount=%u, count=%u\r\n", prevCount, count);
    }

    prevCount = count;  // Update prevCount *after* the check

    return count;
}
-------------------------------------------------------------------------

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

    您好:  


    仍在寻找关于这个问题的答案。 任何更新都很好。

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

    您好、

    感谢您的耐心。

    稍后、请允许我在 TI EVM 上重现此问题。

    在我对该主题采取后续行动后、我将提供更新。

    此致、

    Vaibhav

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

    你好 Valibhav、

    感谢您的回答、目前还没有更新? 我们对此问题受阻、希望获得任何支持。

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

    您好、

    感谢您的耐心。

    我已经尝试加入你发送给我的更改。

    首先、TimerP_SETUP 和 TimerP_getCount 等 API 的使用基本上是对现有 API 的重新定义。

    我最后用 Custom 后缀重新命名了 API、这样在尝试构建应用时不会发生冲突。

    此外、在其中一个名为 ti_DPL_config.c 的生成文件中已经发生 TimerP_setup、因此我不明白为什么要在 main.c 文件中执行自定义设置。

    我为您提供了一个文件、我只做了一些更改、请继续修改该文件、使其模拟您看到的行为、然后我可以运行它并在我的设置中重现。

    文件:

    e2e.ti.com/.../0564.empty_5F00_am62x_2D00_sk_5F00_m4fss0_2D00_0_5F00_freertos_5F00_ti_2D00_arm_2D00_clang.zip

    期待您的答复。

    此致、

    Vaibhav

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

    您好!

    对延迟的回复表示歉意。 让我澄清一下最近的修改。 TimerP_setup特意简化了、以便仅包含基本的计数计时器、因为我们不需要单次触发或比较模式等更高级的功能。 关于main.c、它只是一个示例应用程序;正如您正确指出的那样、我们仍在使用中的相同 API 调用ti_dpl_config.c

    请务必了解、报告的问题仅出现在依赖计时器进行超时计算的高 I2C 通信模式下。 在正常使用 I2C 的情况下、不会出现问题。 为了可靠地重现此情况、我建议添加周期性 I2C 调用。

    如果您可通过调试调用对此进行进一步研究、我们将非常感激。

    谢谢你。

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

    您好、

    请设置某个时间、以便我可以更详细地了解代码库以及计时器的使用方式。

    在电话发布后的后续回复中、我可以通过 e2e 提供跟进更新。

    此致、

    Vaibhav

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

    好的、什么时候适合您?

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

    请在 E2E 上查看 DM 以获取我的电子邮件 ID 以及如何设置会议。