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.

[参考译文] AM2434:GTC 时序不正确?

Guru**** 2815985 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1608539/am2434-gtc-timing-not-correct

器件型号: AM2434
主题: SysConfig 中讨论的其他器件

大家好、我们使用的是工业通信 SDK 11.00.00.13。

我们还使用 GTC 来实现内核之间的时间测量。 我们刚刚注意到、当我们将 GTC 测量时间与通过两个 GPIO 测量的时间进行比较时、发现差异为 17%。
例如、我们在 GTC 开始和结束测量后、通过设置的两个 GPIO 测量了 109ms 的值。 GTC 的测量值为 93117us。

我们的一切工作方式:

/* the clock rate to calculate with */
static uint64_t clkRate = 0;
static bool initialized = false;

void implTimeMeasureInitialize()
{
    uint32_t baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_GTC0_GTC_CFG1_BASE);
    clkRate = HW_RD_REG32((baseAddr + CSL_GTC_CFG1_CNTFID0));
    /* initialization moved to bootloader, since mutliple cores calling this function will cause problems */
    initialized = true;
}

uint64_t implTimeMeasureMicros()
{
    if(initialized)
    {
        return (GTC_getCount64()/(clkRate/1000000));
    }
    else
    {
        return 0;
    }
}

在引导加载程序中:

uint64_t clkRate = 0;
    /* initialize GTC */
    uint32_t baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_GTC0_GTC_CFG1_BASE);
    clkRate = HW_RD_REG32((baseAddr + CSL_GTC_CFG1_CNTFID0));
    uint32_t value = 0;
    value = HW_RD_REG32(baseAddr);
    if( (clkRate == 0) || ((value & CSL_GTC_CFG1_CNTCR_EN_MASK) != CSL_GTC_CFG1_CNTCR_EN_MASK))
    {
        GTC_init();
        // just for debuging
        SOC_moduleGetClockFrequency(TISCI_DEV_GTC0, TISCI_DEV_GTC0_GTC_CLK, &clkRate);
    }
    else
    {
        // nothing
    }

测量:

uint64_t firstVal = 0;
uint64_t secondVal = 0;
uint64_t resultVal = 0;
firstVal = implTimeMeasureMicros();
// set GPIO here
// stuff happens
secondVal = implTimeMeasureMicros();
// unset GPIO here
resultVal = secondVal - firstVal; // <-- this value differs from the scope-measured time of gpio set and unset by 17%

我们在这里怎么做?

此致
Felix Heil

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

    您好、

    您可以尝试使用这种方法吗?

    请检查应用程序的 SysConfig GUI 中是否提供了 GTC、如果提供了、请按照此方法操作。
    回复:AM62P:gtc_init () 锁定在 M4F 上 

    如果它不存在,让我知道,我可以建议另一种方法来测量时间通过 GTC。

    此致、

    Vaibhav

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

    嗨、Vaibhav、

    因此、它在 SYSCFG 中可用、但由于 SYSCFG 的一些一般限制(只有一个整体静态驱动程序配置)、我们放弃了使用 SYSCFG、并为大多数 SDK 驱动程序配置编写了我们自己的 API、这些配置在运行时动态工作、具体取决于所使用的硬件、因此我们可以将一个固件用于多个硬件变体。  

    所以我们手动完成了所有操作。
    但我当然研究了 SYSCFG 以及它将如何初始化 GTC。 但它所做的就是调用 GTC_INIT。 SYSCFG 没有更多解释任何内容的文本:

    此外、对于 GTC、重要的是没有多个内核调用 INIT、我们曾经遇到过以下问题: AM243X-AM243X:GTC 的使用 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI MCU-PLUS-SDK 支持论坛

    但查看您提供的链接、我们似乎没有太大不同。 我们从 CSL_GTC_CFG1_CNTFID0 读取时钟速率。 我们是否应该在第二个代码片段中从第 11 行读取时钟速率、因此由  SOC_moduleGetClockFrequency (TISCI_DEV_GTC0、TISCI_DEV_GTC0_GTC_CLK、&clkRate); ? 我只将其用于调试以检查该值是否与 GTC 寄存器中的值相当。

    也是一个有点不同的计算.. 但我注意到、我需要使用值 1000000 才能将其转换为微秒。 这可能是错的?

    此致

    Felix

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

    您好 Felix:

    我建议参考文件 C:\ti\mcu_plus_sdk_am64x_11_02_00_24\source\drivers\GTC\V0\GTC.c、除 AM243 MCU+ SDK 之外、它将是相同的路径。

    我正在为您检查初始化流程、稍后会更新。

    此致、

    Vaibhav

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

    您好 Felix:

    我希望您避免在 Δ 计算之前进行整数数学截断。 我希望您首先计算增量、也就是 (EndTime - StartTime)、然后这个(值* 1000000)/clkRate 将为您提供精确的时间(以微秒为单位)。

    如果这样可以修复您看到的 17%偏差、请告诉我。

    此致、

    Vaibhav

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

    嗨、Vaibhav、  

    一个小的更新:计算不是问题。  
    我们注意到在引导加载程序中、 MAIN_PLL2_HSDIV5_CLKOUT 的时钟为 225MHz。 我们首先写入此值、然后将其写入 GTC 寄存器并在应用程序中使用。 但在应用程序中 、我们注意到 MAIN_PLL2_HSDIV5_CLKOUT 设置为 200MHz。  
    如果我们做硬码来使用 200MHz 进行计算,它的工作方式是完全准确的。 但我们希望使其动态、以便能够正确地适应时钟设置。  
    因此,在某些情况之间的某个地方修改该值,但我们不知道或看到当前的位置。 我们正在对此进行调查。  
    您是否知道可以通过什么方式修改此值? RBL 是否涉及此功能? 还是 SysFw?

    此致

    Felix

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

    嗨、Vaibhav、  
    因此、我们进行了进一步调查。 我们认为问题是除数、即 9 或 8、具体取决于我们检查它的时间:
    200MHz:

    225MHz:


    我还看到了 SDK 文档的这一部分:
    AM243x MCU+ SDK:在较旧的 SDK 上获取 SDK 10.00 PLL 更新
    遗憾的是、本文未说明具体发生了哪些变化或者使用这些 PLL 的流程是如何工作的。 我们还尝试在 TRM 中检查它、以便 RBL /初始化如何工作、但它只说明 ROM 代码设置了一些 PLL、而不会再设置其他 PLL:


    引导过程还提到 DMSC 设置一些 PLL、之后 R5F 设置这些 PLL:

    但 R5F 在哪里配置主域 PLL 呢? 找不到此器件。 是用于 SDK 时钟的 HFCS0 吗?
    是否有更多信息?
    也可以让同时使用 PLL2 的 PRU_ICSSG1 在加载时配置某些内容吗?
    我们真的认为它是除数。 但不知道是谁改变了它在哪一点。 我们在这里不是手工做一些事情。

    此外、我们尝试 在应用中使用 SOC_MODULEGetClockFrequency 来获取正确的频率、因此在引导加载程序之后。 但是、我们在任何系统初始化之前(因为我们希望完全使用此计数器进行测量)很早就这样做、在某种程度上、我们的应用程序会冻结。 如果我们删除这一调用、它就可以正常工作。  

    此致
    Felix

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

    您好 Felix:

    我们注意到在引导加载程序中、 MAIN_PLL2_HSDIV5_CLKOUT 的时钟为 225MHz。 我们首先写入此值、然后将其写入 GTC 寄存器并在应用程序中使用。 但在应用程序中、我们注意到 MAIN_PLL2_HSDIV5_CLKOUT 设置为 200MHz。

    我想重现此问题。 您能告诉我、如果我由 AM243 /am64x TI EVM 运行并使用默认 SBL OSPI 执行 SoC 初始化、那么在引导加载程序中我预计会看到 225MHz、而在 R5 应用程序中、我预计会看到 200MHz。

    请确认上述内容、如果您使用  SOC_MODULEGetClockFrequency 来获取时钟频率、另请告知我。

    期待您的答复。

    此致、

    Vaibhav

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

    嗨、Vaibhav、  
    我们未使用默认 SBL OSPI、而是使用我们自己的引导加载程序。 此外、由于我们不使用 SYSCFG、初始化使用不同的函数、但我们保持的值与 SYSCFG 在后台执行的相同。 我总是将驱动程序 API 与 SYSCFG 在进行 SDK-update 后的功能进行比较、看起来是一样的。  
    因此、我假设、除了我们的特殊固件插槽处理之外、它的工作原理几乎与默认 SBL OSPI 相同。  
    我们也对 EVM 使用相同的引导加载程序。  

    但另一位同事也讨论了该主题、他说、在加载 PRU 代码时、隐藏了另一个频率变化。 我们正在对此进行调查、但这似乎是问题所在。 因此、只有在将任何 ICSS-fwhal 相关代码加载到 PRU 时、才会发生这种情况。 所有协议支持的 PRU 固件似乎都是如此:EtherCAT、Profinet 和 EtherNet/IP。  

    我们的方法是在引导加载程序内通过  SOC_MODULEGetClockFrequency 和所需频率设置 GTC 的 FID 寄存器、但在我们的应用程序中、我们只是读回该寄存器。 在这里、它在某个时候开始有所不同。 错误地显示在加载 PRU 代码后的确切位置。  

    此致

    Felix

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

    您好 Felix:

    我理解您的担忧。

    我正在与另一位专家核实他们是否有一些与 PRU 代码相关的输入。

    此致、

    Vaibhav

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

    嗨、Vaibhav、  

    对此有任何更新?

    此致
    Felix

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

    您好、

    线程所有者将在 2 月 17 日的一周内停止工作。 如果您在这周内没有收到更新、请 ping 通该线程。

    感谢您的耐心。

    此致、
    Harshith

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

    大家好!

    对此处的延迟深表歉意。 查看 TRM、MAIN_PLL2_HSDIV5 是 IEP 计数器的一个潜在时钟源。  如果您以 100Mbit 地址使用协议、PRU 以太网固件可能会将 IEP 计数器设置为使用 200MHz? 我不能确定我的头是什么:

    首先、我们来验证 IEP 计数器是否正在配置为使用  MAIN_PLL2_HSDIV5。 请查看 CTRLMMR_ICSSG0_CLKSEL[19-16]
    IEP_CLKSEL 用于查看哪个时钟正在多路复用到 IEP 计数器、并 查看 ICSSG_IEPCLK_REG[0] IEP_OCP_CLK_EN 用于查看 IEP_CLK 输入是多路复用为来自 IEP 特定时钟还是来自 CORE_CLK。

    在 TRM 中、搜索
    CTRLMMR_ICSSG0_CLKSEL 寄存器

    CTRLMMR_ICSSG1_CLKSEL 寄存器

    ICSSG_IEPCLK_REG 寄存器

    此致、

    Nick

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

    此常见问题解答可能不会有帮助、但我将链接它、以防万一:
    【常见问题解答】PRU_ICSSG:如何在 CCS 中查看和设置 PRU 内核频率? 

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

    嗨、Nick、  

    感谢您的回答。 我们将花一些时间再研究一下。