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.

[参考译文] RM57L843:DCC -使用计数器1作为基准

Guru**** 2528470 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1261575/rm57l843-dcc---using-counter1-as-reference

器件型号:RM57L843

您好!

我们将配置 DCC 模块、以使用 counter1作为测量 counter0的时钟源的基准。 当 counter1达到零时、DCC 会冻结计数器。

测试正常、但有时当 counter1为1而不是0时状态变为1。 您对此有何看法?

此致、

马尔西奥

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

    尊敬的 Marcio:

    我怀疑此问题是由于勘误表 DCC#24:

    *RM57Lx 微控制器芯片勘误表(芯片修订版 B)(TI.com)

    您是否在单次模式下使用?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    这似乎是一个不同的问题、因为我们将 DCC1设置为在计数器1达到0时停止、如 SPNU562A–2018年3月的第15.2.2节"当计数器1达到零时冻结计数器:"中所述。

    在图片中、我们可以看到 Stat=1 (失败) Cnt0!= 0和 Cnt1=1。 我希望看到 Stat=2 (Done) Cnt0 != 0和 Cnt1=0。

    此致、
    Marcio。

     

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

    尊敬的 Marcio:

    我能否获取您的整个项目、您能否对其进行压缩并附上。 这对我在结束时轻松调试该问题非常有帮助。

    您甚至可以通过私人邮件发送。

    --

    谢谢。此致、
    Jagadish。

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

    谢谢 Jagadish。

    我可以提供一段与测试相关的代码。

    typedef unsigned short WORD;
    typedef unsigned int DWORD;
    
    // DCC Clock0 Counter Seed value configuration (ONCIN=16MHz).
    // Maximum Detection Time (MDT) = 2500 microseconds = (2.5*10^-3)seconds
    // CNT0_SEED = (OSC x MDT) = (16*10^6) * (2.5*10^-3) = 40000
    const DWORD CNT0_SEED = 40000U;
    // DCC Clock1 Counter Seed value configuration (EXTCLKIN1=1MHz).
    // Maximum Detection Time (MDT) = 2500 microseconds = (2.5*10^-3)seconds
    // CNT1_SEED = (EXTCLK1 x MDT) = (1*10^6) * (2.5*10^-3) = 2500
    const DWORD CNT1_SEED = 2500U;
    // DCC Clock0 Counter Seed value configuration (ONCIN=16MHz).
    const DWORD DCC_CNT0_SEED_VALUE = (2 * CNT0_SEED)-4;
    // DCC Clock0 Valid Counter Seed value configuration.
    const DWORD DCC_VALID0_SEED_VALUE = 4U;
    // DCC Clock1 Counter Seed value configuration (EXTCLKIN1=1MHz).
    const DWORD DCC_CNT1_SEED_VALUE = CNT1_SEED;
    // Clock Drift (55ppm for 16MHz)
    // Variation [in Hz] = (frequency [in Hz] * frequency variation [in ppm]) / 10^6
    // Variation [in Hz] = ((16*10^6) * (55)) / 10^6 = 880Hz
    // Maximum Detection Time (MDT) = 2500 microseconds = (2.5x10^-3)seconds
    // CLOCK0_COUNTER_OFFSET = (Variation x MDT) = (880 * (2.5x10^-3)) = 2.2
    //const WORD CLOCK0_COUNTER_OFFSET  = (DWORD)2U;
    const WORD CLOCK0_COUNTER_OFFSET  = (DWORD)50U;
    //DCC Clock0 Counter: Default Value and Thresholds.
    const WORD CLOCK0_COUNTER_DEFAULT = (DWORD)(CNT0_SEED);                                        // Default value.
    const WORD CLOCK0_COUNTER_LOWER   = (DWORD)(CLOCK0_COUNTER_DEFAULT - CLOCK0_COUNTER_OFFSET);   // Lower bound.
    const WORD CLOCK0_COUNTER_UPPER   = (DWORD)(CLOCK0_COUNTER_DEFAULT + CLOCK0_COUNTER_OFFSET);   // Upper bound.
    
    
    void StartTest (void)
    {
      // Configure DCC1.
    
      // Configure the clock sources.
      REG_DCC_1->CNT0CLKSRC = DCC1_CNT0_CLKSRC_OSCIN;
      REG_DCC_1->CNT1CLKSRC = DCC1_CNT1_CLKSRC_EXTCLKIN1;
    
      // Set counters seeds.
      REG_DCC_1->CNT0SEED = DCC_CNT0_SEED_VALUE;
      REG_DCC_1->VALID0SEED = DCC_VALID0_SEED_VALUE;
      REG_DCC_1->CNT1SEED = DCC_CNT1_SEED_VALUE;
    
      // DCC1 Global Control Register configuration.
      REG_DCC_1->GCTRL = (DWORD)0x5U |                  // Disable DCC1.
                         (DWORD)((DWORD)0x5U <<  4U) |  // Disable Error Interrupt.
                         (DWORD)((DWORD)0xBU <<  8U) |  // Enable Single Shot mode.
                         (DWORD)((DWORD)0x5U << 12U);   // Disable Done Interrupt.
    
       // Clear the Done and Error flags.
       REG_DCC_1->STAT = 0x03;
       // Enable DCC1.
       REG_DCC_1->GCTRL = (REG_DCC_1->GCTRL & 0xFFFFFFF0U) | 0xAU;
    }
    
    void TestWorker (void)
    {
        DWORD status = REG_DCC_1->STAT;
        if (status > 0)
        {
            DWORD counter0 = Dcc1GetCounter0();
            DWORD counter1 = Dcc1GetCounter1();
    
            // Test.
            if ((counter0 <= CLOCK0_COUNTER_UPPER) && (counter0 >= CLOCK0_COUNTER_LOWER))
            {
                // Good
                // Clear the Done and Error flags.
                REG_DCC_1->STAT = 0x03;
                // Enable DCC1.
                REG_DCC_1->GCTRL = (REG_DCC_1->GCTRL & 0xFFFFFFF0U) | 0xAU;
            }
            else
            {
                // Error.
                FatalError();
            }
        }
    }
    

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

    尊敬的 Marcio:

    感谢代码。

    我对延误表示歉意,我不在办公室,我将在星期一回到办公室。 我希望从您的角度看、这不会成为问题。

    --

    谢谢。此致、
    Jagadish。

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

    没问题  Jagadish。

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

    尊敬的 Marcio:

    我休假回来了、最后我开始重现问题。 我将尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Marcio:

    感谢您的耐心、今天我开始测试此问题、并将在明天尝试提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Marcio:

    很抱歉我的回复出现延迟!

    下面是一个我的更新。

    我在 RM57L853 Launchpad 上采用了与您相同的设置进行了测试  

    下面是我的测试代码:
    e2e.ti.com/.../DCC_5F00_TEST_5F00_RM57.zip

    在该代码中、我还使用 ETPWM1A 生成了1MHz 板载信号、然后将同一信号连接到 EXTCLKIN1并用于 DCC。

    这是调试结果:

    我测试了几乎20次、得到了相同的结果、却看不到 Cnt1值为"1"。

    因此、我想与您确认以下事项:

    1.您得到 Cnt1值1的频率有多高,而得到 Cnt1值的次数是多少?

    2.从何处施加1MHz 信号?

    3.您能测试我的代码吗,让我知道结果;您只需要用 B5 (EXTCLKIN1)短接控制器的 D9 (ePWM1A)引脚。

    --

    谢谢。此致、
    Jagadish。

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

    感谢您的答复 Jagadish。

    1.您得到 Cnt1值1的频率有多高,而得到 Cnt1值的次数是多少?

    大约每30秒1次、当 counter1为1而不是0时该状态变为1。 我们使测试重复运行、直到错误发生。

    2.从何处施加1MHz 信号?

    EXTCLKIN1是一个1MHz 的独立晶体振荡器。 OSCIN 是16MHz Chrystal。

    ETPWM1A 输出是否与 OSCIN 同步?

    3.您能测试我的代码吗,让我知道结果;您只需要用 B5 (EXTCLKIN1)短接控制器的 D9 (ePWM1A)引脚。

    好的。 我´ll 执行它并将结果返回给您。

    谢谢。此致、
    Marcio。

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

    您好!

    我在 LauchPad 板上运行了测试、将 EXTCLKIN1连接到 ePWM1A、并将 EXTCLKIN1连接到波形发生器。

    我首先运行您的程序。 它只比较一次 EXTCLKIN1和 OSCIN。  

    ´ve 我修改了程序以无限期重复比较。

    我无法重现我在电路板上看到的应用的问题。

    非常感谢您的支持。

    马尔西奥

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

    尊敬的 Marcio:

    同时将 EXTCLKIN1连接到波形发生器。
    我在开发板上的应用程序无法重现此问题。

    那么、您能将您的应用与我的代码进行比较吗、您能指出我们的代码中存在的任何差异吗?

    --

    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    没有太多的区别。 DCC 配置参数相同。 您的 dccInit 也会配置 DCC2、种子在之后进行配置。 我的应用程序没有配置 DCC2。 您的程序将保持在循环中、等待结果。 我的应用程序启动测试,做很多其他事情(包括处理其他的 perifherals ),比测试本身需要更多的时间,然后返回检查测试结果。

    我会将测试代码移至我的应用、并在我们的电路板上运行它、然后将结果发布到该主题中。 硬件团队还参与检查 EXTCLKIN1 输入。

    谢谢。此致、

    Marcio。

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

    尊敬的 Marcio:

    我将测试代码移至我的应用程序并在我们的电路板上运行,然后将结果发布在此主题中。 硬件团队还参与检查 EXTCLKIN1 输入。

    我想说这是一个好主意。

    --

    谢谢。此致、
    Jagadish。