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.

[参考译文] TDA4VM:GTC:设置 GTC_CNTCV_LO 寄存器中的 COUNTVALUE 不可靠

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1492830/tda4vm-gtc-setting-countvalue-in-gtc_cntcv_lo-register-is-unreliable

器件型号:TDA4VM

工具/软件:

尊敬的 TI:

我有一个定制电路板、其中 GTC 由 MAIN_PLL3_HSDIV1_CLKOUT 使用 62.5MHz 计时。 我在调试模式下在主域 (MCU2_1) 的 R5 上运行以下代码:

const uint32_t arrayElems = 16;

uint32_t counterValueSet[arrayElems] = {0xF0000000, 0xE0000000, 0xD0000000, 0xC0000000,
                                        0xB0000000, 0xA0000000, 0x90000000, 0x80000000,
                                        0x70000000, 0x60000000, 0x50000000, 0x40000000,
                                        0x30000000, 0x20000000, 0x10000000, 0x00000000};

uint32_t counterValueGet[arrayElems];

for(uint32_t i = 0; i < arrayElems; i++)
{
    HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x0);
    HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCV_LO, counterValueSet[i]);
    HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x1);
    counterValueGet[i] = HW_RD_REG32(CSL_GTC0_GTC_CFG2_BASE);
}

我获得的 counterValueGet 值为(2 个运行):

0xF0000017 (hex)
0xF000005C (hex)
0xF00000A2 (hex)
0xC0000017 (hex)
0xB0000017 (hex)
0xA0000017 (hex)
0x90000017 (hex)
0x90000067 (hex)
0x70000017 (hex)
0x60000017 (hex)
0x50000018 (hex)
0x40000017 (hex)
0x30000017 (hex)
0x20000017 (hex)
0x10000017 (hex)
0x10000068 (hex)
0xB2E19CE6 (hex)
0xB2E19D2B (hex)
0xB2E19D71 (hex)
0xC0000017 (hex)
0xB0000018 (hex)
0xA0000017 (hex)
0x90000017 (hex)
0x90000067 (hex)
0x70000017 (hex)
0x60000017 (hex)
0x50000017 (hex)
0x50000067 (hex)
0x30000017 (hex)
0x20000017 (hex)
0x10000017 (hex)
0x00000017 (hex)

因此、有时会捕获到所需的值、有时则不捕获。 因此、按我的方式设置 GTC 值似乎不可靠。

添加额外延迟、如下所示:

    const uint32_t arrayElems = 16;

    uint32_t counterValueSet[arrayElems] = {0xF0000000, 0xE0000000, 0xD0000000, 0xC0000000,
                                            0xB0000000, 0xA0000000, 0x90000000, 0x80000000,
                                            0x70000000, 0x60000000, 0x50000000, 0x40000000,
                                            0x30000000, 0x20000000, 0x10000000, 0x00000000};

    uint32_t counterValueGet[arrayElems];

    for(uint32_t i = 0; i < arrayElems; i++)
    {
        HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x0);
        for(uint32_t j = 0; j < 32; j++)
        {
            asm("nop");
        }
        HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCV_LO, counterValueSet[i]);
        for(uint32_t j = 0; j < 32; j++)
        {
            asm("nop");
        }
        HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x1);
        for(uint32_t j = 0; j < 32; j++)
        {
            asm("nop");
        }
        counterValueGet[i] = HW_RD_REG32(CSL_GTC0_GTC_CFG2_BASE);
    }

也不会提高可靠性。 结果如下:

0xE03EA32F (hex)
0xE03EA394 (hex)
0xD0000036 (hex)
0xD000009B (hex)
0xB0000036 (hex)
0xB00000A4 (hex)
0x90000036 (hex)
0x80000036 (hex)
0x800000A5 (hex)
0x80000113 (hex)
0x80000181 (hex)
0x800001F2 (hex)
0x30000037 (hex)
0x20000036 (hex)
0x10000036 (hex)
0x00000036 (hex)

你是否能够重现你这边的问题? 您是否对按我的方式设置 GTC 值时出现的问题有任何看法? HW_WR_REG32 包括一个额外的 HW_SYNC_BILER(DSB 指令)、它会执行以下操作(摘录自 Crtex R5 TRM:

“该指令强制处理器等待所有挂起的显式数据访问完成、然后才能执行任何额外的指令阶段。 对指令的预取没有影响。“

因此、根据我的理解、HW_WR_REG32 只应在实际写入值时返回。

谢谢、此致、

Felix

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

    您好 Felix:

    您能解释一下为什么要编写 GTC cnt 寄存器吗? 是否需要 0 以外的其他起始值? 有任何具体原因?  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的快速答复。

    用例如下:我想同步在两个 TDA4 上运行 GTC。

    因此、两个 GTC 都源自 EXT_REFCLK1、这两个器件的源相同。 由于 GTC 存在缺陷、即在没有可用时钟的情况下读取/写入会导致系统崩溃、因此我使用额外的硬件计时器(该计时器还将 EXT_REFCLK 作为输入时钟)作为代理。 稍后、我使用上述代码将计时器的当前值转换为 GTC。

    如果采用计时器值无法可靠工作、我们必须寻找另一种解决方案。 但是,如果你能确认你身边的同样行为,并可能给出一些见解,为什么会发生这种情况,以及如何避免这种情况,这将是很好的。

    此致、

    Felix

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

    尊敬的 TI:

    这只是一个快速的提醒、因此该问题不会自动关闭。

    此致、

    Felix

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

    您好 Felix:

    但是、如何同步要用作代理的硬件计时器? 此外、如果该计时器也来自同一时钟源、您是否能够访问寄存器?  

    一般来说、  同时访问和设置两个不同 TDA4 的 GTC 值可能会很困难。  

    此致、

    Brijesh

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

    您好、Brijesh、

    两个计时器均启用并设置为 EXT_REFCLK1。 此时、EXT_REFCLK1 上没有时钟。 稍后、EXT_REFCLK1 上的时钟被激活、两个计时器开始同步计数。

    我无法对 GTC 应用相同的想法、因为 TDA4 崩溃、如果有人想在没有有效的源时钟时从 GTC 读取数据、并且我无法保证在这短时间内没有人在读取这些寄存器。

    无需同时设置 GTC 值。 由于硬件计时器同步计数、因此我可以随时读取它们的值并相应地设置 GTC。 唯一的问题是、以这种方式设置 GTC 似乎不可靠。

    此致、

    Felix

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

    您好 Felix:

    好的、是的、如果未提供时钟、GTC 寄存器可能会导致崩溃。  

    此致、

    Brijesh

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

    您好、Brijesh、

    感谢您的确认。 您是否能够重现您这边的初始问题? 或者、您是否有解决上述“不可靠性“问题的权变措施?

    此致、

    Felix

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

    您好 Felix、

    您的意思是什么不可靠? 您能详细说明一下吗?  

    此致、

    Brijesh

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

    您好、Brijesh、

    “不可靠“是在 我的初始帖子中解释的。 请仔细阅读这一页。

    此致、

    Felix

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

    您好 Felix:

    您是否在 独立环境中检查此代码? 还有其他任何内容并行运行吗?  

    此致、

    Brijesh

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

    您好、Brijesh、

    A72 并行运行 Linux。 您认为这应该会对设置 GTC 寄存器产生影响吗?

    此致、

    Felix

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

    您好 Felix:

    不、我是指 运行此代码的核心? 还有其他任何内容并行运行吗?  

    另外、如果不并行运行、代码从哪里运行? DDR? 是否可以将此代码移动到某个内部存储器、然后检查 GTC 输出?  

    此致、

    Brijesh

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

    您好、Brijesh、

    否、没有任何内容并行运行。

    最初、代码从 DDR 运行。 我现在将代码输入 TCM、但这对结果没有影响。

    此致、

    Felix

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

    您好、Brijesh、

    对于如何避免将 GTC 设置为自定义值时出现不可靠性问题、您有其他建议吗?

    此致、

    Felix

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

    您好 Felix:

    由于优先级问题、我无法检查这一点。 让我想一想、下周再见。

    此致、

    Brijesh

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

    您好 Felix:

    该主题是否仍打开?

    此致、

    Brijesh