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.

[参考译文] TMS570LS3137:与无外部振荡器的 LPO 一起使用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1398455/tms570ls3137-use-with-lpo-without-external-oscillator

器件型号:TMS570LS3137

工具与软件:

您好!

Hercules TRM 声明:

10.4.4 LPOCLKDET Enable
The LPO is enabled by default while nPORRST is low. During this time, the current source initializes,
holding the relaxation oscillator in reset until initialized. After the current source releases the HF LPO and
the LF LPO, these clock frequencies slew to their final frequencies; the final frequency may be achieved
while nPORRST is active or after its release. After, nPORRST is released, the HF LPO Valid signal is set
32 HF LPO clock cycles later.
The clock detect is enabled once the oscillator and HF LPO are valid. Because an oscillator failure could
occur from reset, the clock detect logic must provide an override path. If the HF LPO is valid and the
oscillator is not valid, the clock detect circuitry will become active (overriding the oscillator invalid signal)
after 16K LF LPO cycles (about 200ms)

但是、如果我将 OSCIN 引脚接地短路、并尝试进行 RST/PORRST/下电上电、MCU 似乎没有启动。

也许有人会提供以下方面的见解:

  • 在 RST/PORRST 之后的期间/紧接着的期间内、有没有办法来"调试"振荡器和 LPO 的有效性吗?
  • 是否需要外部振荡器故障事件来触发切换到 LPO?
  • 是否可以在没有外部振荡器的情况下启动(加电后)并运行 Hercules?

谢谢!

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

    您好、Varban、

    也许我们需要在 startup.c 文件中注释掉特定的时钟相关初始化代码来使用 LPO 运行代码。

    我认为如果你使用 LPO 直接执行你的代码、下面突出显示的函数将会产生问题。  

    这是因为、 setupPLL 不可能、因为我们的振荡器时钟不会生成、但在我们的时钟配置中、我们提到振荡器时钟作为 PLL 输入:

    此外、 trimLPO 是不可能的、因为 LPO 是现在唯一一个推动代码执行的时钟、所以我们在执行代码时不能调整时钟。

    同样地、mapClock 也无法实现、因为 PLL 现已停止使用。

    我创建了一个示例 LED 闪烁工程、其中进行了上述修改并且进行了少量其他修改。 在此附上我的项目供您参考:

    e2e.ti.com/.../OSCIFAIL_5F00_TEST_5F00_RM46.zip

    在该项目中、即使在将 OSC 引脚短接至地并按上电复位后、LED 也会闪烁。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的  Jagadish:

    感谢您提供示例和指导。

     在经过几个小时的调试之后缩小了您建议的范围、我只能通过摆弄 void trimLPO (void)内 CLKTEST 寄存器的值来使其起作用。 已进行以下尝试:

        /* USER CODE BEGIN (4) */
        systemREG1->SYSPC1 |= (uint32)((uint32)0x1U << 0U); /* Set the ECPCLKFUN to enable the clock on the ECLK pin */
    
        //
        // Bit 19 - 16 pattern is default: 1010
        //
    
        //
        // Experiment with bits 25 - 24
        //
            // systemREG1->CLKTEST = 0b00000001000010100000000000000000; /* Should be the default, fails to start with LPO after reset */
                                                                         /* TRM: The range detect enable is controlled by the RANGEDETCTRL bit (Bit 25) of the CLKTEST register.
                                                                                 The clock monitor range detection circuitry (RANGEDETECTENABLE) is disabled. */
    
            // systemREG1->CLKTEST = 0b00000000000010100000000000000000; /* Works perfectly */
                                                                         /* TRM: The range detect enable is generated by the hardware in the clock monitor wrapper. */
    
            // systemREG1->CLKTEST = 0b00000011000010100000000000000000; /* Works perfectly */
                                                                         /* TRM: The range detect enable is controlled by the RANGEDETCTRL bit (Bit 25) of the CLKTEST register.
                                                                                 The clock monitor range detection circuitry (RANGEDETECTENABLE) is enabled. */
    
        //
        // Experiment with bit 19 - 16 pattern: 0000 (no change on the ECLK pin, same as with 1010)
        //
            // systemREG1->CLKTEST = 0b00000001000000000000000000000000; /* Should be the default, again, fails to start with LPO after reset */
                                                                         /* TRM: The range detect enable is controlled by the RANGEDETCTRL bit (Bit 25) of the CLKTEST register.
                                                                                 The clock monitor range detection circuitry (RANGEDETECTENABLE) is disabled. */
    
            // systemREG1->CLKTEST = 0b00000000000000000000000000000000; /* Again, works perfectly */
                                                                         /* TRM: The range detect enable is generated by the hardware in the clock monitor wrapper. */
    
            systemREG1->CLKTEST = 0b00000011000000000000000000000000;    /* Again, works perfectly */
                                                                         /* TRM: The range detect enable is controlled by the RANGEDETCTRL bit (Bit 25) of the CLKTEST register.
                                                                                 The clock monitor range detection circuitry (RANGEDETECTENABLE) is enabled. */
        
        /* USER CODE END */

     

    如代码片段注释中所述、四个选项正常工作、复位后我直接从 LPO 启动、从而保持外设正确计时。 但是、我不清楚哪一个最安全。 更具体地说、涉及:

    1. 25:24位对的最佳配置是什么? 时钟监测"包装器"和"距离检测电路"之间有何差异?

    2. 19:16位 CLCK_TEST_EN 字段的含义。 无论是保持为"默认值"1010还是0000并启用 ECPCLKFUN、ECLK 引脚的行为都不会改变(在示波器上观察到)。

    另一个有趣的地方是 包含 while 循环的 void setupPLL (void):

        /* Disable PLL1 and PLL2 */
        systemREG1->CSDISSET = 0x00000002U | 0x00000040U;
        /*SAFETYMCUSW 28 D MR:NA <APPROVED> "Hardware status bit read check" */
        while((systemREG1->CSDIS & 0x42U) != 0x42U)
        {
        /* Wait */
        }

        3.在主振荡器上电并只依赖于 LPO 的情况下、是否保证它将始终满足条件并且永不循环          无穷大?

    谢谢。此致、

    Varban

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

    您好、Varban、

    如果时钟检测被禁用、则 将不会发生从 OSC 到 LPO 的切换。 这意味着、即使发生振荡器故障切换的情况、振荡器时钟也会尝试驱动内核、这意味着不会发生代码执行。

    所有失败情况下都会发生同样的情况(禁用时钟检测)。

    RANGEDETENASSEL=1和 RANGEDETCTRL=0:

    在这种情况下、时钟检测电路被禁用、这意味着如果振荡器出现故障、则不会切换到 LPO 时钟、代码执行将失败。

    RANGEDETENASSEL=1和 RANGEDETCTRL=1 :

    在这种情况下、时钟检测电路被启用、这意味着如果振荡器发生故障、那么将切换到 LPO。 这就是代码执行正确发生的原因。

    RANGEDETENASSEL=0 和 RANGEDETCTRL=X  

    在这种情况下、时钟检测或距离检测是通过硬件生成的、我的意思是、在前面两种条件下、软件直接控制时钟检测电路、但在这种情况下、硬件本身会生成时钟检测。

    这意味着对于该器件、在上电复位释放后、默认情况下硬件将启用时钟检测。 因此、这意味着在这种情况下、如果振荡器发生故障、也会切换到 LPO。 这就是这种情况下的原因、它也可以正常工作、没有任何问题。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish

    我的意思是、在前面两个条件下、软件直接控制了时钟检测电路、但在这种情况下、硬件本身产生了时钟检测

    软件控制时钟检测电路的意义是什么? 每种方法的优/缺点是什么?

    谢谢!

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

    您好、Varban、

    很抱歉、我在休假几天、因为响应延迟。

    软件对时钟检测电路的控制有何意义? 每种方法的优缺点是什么?

    这两种情况下都不会有任何性能差异。

    唯一的区别是、在硬件情况下、它采用时钟检测的默认状态。 仅在我们要禁用时钟检测时、才需要使用软件方法。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的  Jagadish:

    好的,非常感谢您的帮助和内容丰富的回复!

    -Varban