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.

[参考译文] F28M36P63C2:在行中调用函数 SysCtlClockConfigSet () 两次会导致系统进入无限循环

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1631077/f28m36p63c2-calling-function-sysctlclockconfigset-twice-in-the-row-causes-system-to-enter-endless-loop

器件型号: F28M36P63C2

在 F28M36 支持库 V210 中、如果在行中调用函数 SysCtlClockConfigSet () 两次导致系统进入无限循环。 似乎问题与 SysCtlClockPllConfig(...) 中的 WATCHDOG1 配置有关 。 如何解决此问题?

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

    您好:

    抱歉、我离开办公室直至星期四 (3/2)。 请等待回复。  

    此致、
    马特

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

    您好:

    双锁是单个 PLL 初始化序列的一部分、但SysCtlClockConfigSet()在系统配置完毕后再次调用将导致系统复位或挂起。

    数据表明确指出 、PLL 应连续锁定两次、并且该SysCtlClockPllConfig()函数会实现此双锁序列。 但是、SysCtlClockConfigSet()在应用程序中调用多次 (尤其是在引导加载程序已经配置 PLL 后)可能会导致系统复位和不稳定、因此您应该在初始化期间只配置一次 PLL。

    SYSPLLSTS[SYSPLLLOCKS]寄存器的状态是什么?  您还可以检查 MRESC 寄存器以确认复位原因。

    此致、
    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SYSPLLSTS[SYSPLLLOCKS]寄存器的状态是什么?  您还检查 MRESC 寄存器以确认复位原因

    我来检查一下

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

    请告诉我您找到了什么。 调用  SysCtlClockPllConfig() 两次是否有任何原因? 调用它两次似乎是一个已知问题、如上面链接的线程所记录。

    此致、
    马特

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

    RESC = 0x0000000(显然未发生重置)

    SYSPLLSTS = 0x00000001

    在行中运行从 SysCtlClockPllConfig() 函数提取的代码两次:

      //第一次运行

      SysCtlPeripheralEnable (SYSCTL_PERIPH_WDOG1);
       //在切换到 PLL 之前设置看门狗
      WatchdogUnlock (WATCHDOG1_BASE);        //解锁对看门狗配置的写入

      while(!WatchdogWriteReady ();
      WatchdogIntClear (WATCHDOG1_BASE);      //清除中断状态

      while(!WatchdogWriteReady ();
      WatchdogResetEnable (WATCHDOG1_BASE);   //启用从看门狗计时器生成复位。

      while(!WatchdogWriteReady ();
      WatchdogReloadSet (WATCHDOG1_BASE、0xFFFFFFFF); //设置看门狗计时器的周期。

      while(!WatchdogWriteReady ();
      WatchdogEnable (WATCHDOG1_BASE);        //启用看门狗计时器。

      while(!WatchdogWriteReady ();
      WatchdogLock (WATCHDOG1_BASE);          //锁定看门狗

      //第二次运行

      WatchdogUnlock (WATCHDOG1_BASE);        //解锁对看门狗配置的写入。

      while(!WatchdogWriteReady ();
      WatchdogIntClear (WATCHDOG1_BASE);      //清除中断状态

      while(!WatchdogWriteReady ();
      WatchdogResetEnable (WATCHDOG1_BASE);   //启用从看门狗计时器生成复位。

      while(!WatchdogWriteReady ();
      WatchdogReloadSet (WATCHDOG1_BASE、0xFFFFFFFF); //设置看门狗计时器的周期。

      while(!WatchdogWriteReady();<--------------------------------------------------------------------   被困在这里!!!!
      WatchdogEnable (WATCHDOG1_BASE);        //启用看门狗计时器。

      while(!WatchdogWriteReady ();
      WatchdogLock (WATCHDOG1_BASE);          //锁定看门狗

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

    您好:

    SYSPLLSTS = 0x1 表示 PLL 已锁定。  

    感谢您缩小问题的范围。 问题似乎是、启用看门狗中断后、所有写入都将被忽略(请参阅 WDTCTL.INTEN 位):

    再次询问:

    您调用  SysCtlClockPllConfig() 两次是否有任何原因? 如上面链接的线程所述、调用它两次似乎是已知问题。

    此致、
    马特

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

    您好、Matt! 感谢您发送编修。 现在,当我们清楚地了解这种行为的原因时,我将检查 在我们的设计中是否必须调用 SysCtlClockPllConfig () 两次。

    但现在在相同的函数实现中出现了另一个问题:

    原始 if-condition 声明:

    //如果任何 PLL 设置发生更改、请重新配置 PLL
    if ((CurPllSrc!=(ClkSrcReq >> SysCtl_USE_PLL_SHIFT )||(CurPllIMult!=(PllMULT & SysCtl_SPLLIMULT_M)||(CurPllFMult!=(PllMULT & SysCtl_SPLLFMULT_M))

    {...}

    它是否应该如此(没有对 ClkSrcREQ 进行奇数位移位)?

    //如果任何 PLL 设置发生更改、请重新配置 PLL
    if ((CurPllSrc!= ClkSrcREQ)|| (CurPllIMult!=(PllMULT & SYSCTL_SPLLIMULT_M))|| (CurPllFMult!=(PllMULT & SYSCTL_LFSPLMULT_M)))

    {...}

    此外、原始的 IF 条件未考虑 PLL 启用并锁定(寄存器 SYSPLLSTS)。 如何解决?

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

    您好:

    [报价 userid=“692026" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1631077/f28m36p63c2-calling-function-sysctlclockconfigset-twice-in-the-row-causes-system-to-enter-endless-loop/6309263

    它是否应该如此(没有对 ClkSrcREQ 进行奇数位移位)?

    //如果任何 PLL 设置发生更改、请重新配置 PLL
    if ((CurPllSrc!= ClkSrcREQ)|| (CurPllIMult!=(PllMULT & SYSCTL_SPLLIMULT_M))|| (CurPllFMult!=(PllMULT & SYSCTL_LFSPLMULT_M)))

    {...}

    [/报价]

    正确。 这看起来像是 SysCtlClockConfigSet() 中从未捕获到的错误。  

    ClkSrcREQ 和 CurPllSrc 的位 31 都代表 SYSPLLCTL 寄存器 SYSPLLEN 的位 0。   当 ClkSrcReq[31]  =“1"时“时、右移到 ClkSrcReq 将导致 PLL 意外重新锁定。  和  CurPlllSrc[31] =“1"(“(即使(即使 IMULT/FMULT 相同)。
     
    另外、原始 if-condition 未考虑 PLL 启用并锁定(寄存器 SYSPLLSTS)。 如何解决?

    您是否打算在已锁定的情况下跳过时钟配置?  

    此致、
    马特

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

    您好、Matt!

    如我所见,连接的调试器 — 即使在 SysCtlClockPllConfig () 初始化之前, PLL 也得到了某种配置。

    我想 它是 在原始 _c_int00 函数下发生的 (根据 CFG-file 设置),在 main() 之前。

    现在让我们想象一下、在调用 SysCtlClockPllConfig 之前、PLL 没有被正确锁定(例如,未考虑勘误表)、但

    乘数的定义与上述条件相同 不会赶上 本例中。 这就是我的想法...

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

    请再问一个问题! 这是否 意味着调用  SysCtlClockPllConfig() 后无法重新配置 Watchdog1?

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

    您好:

    正如我可以看到的,使用附加的调试器 — 即使在 SysCtlClockPllConfig () 初始化之前、也会以某种方式配置 PLL。

    我相信、如果您通过 JTAG 刷写器件、PLL 将由 CCS 中的闪存插件配置。

    [报价 userid=“692026" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1631077/f28m36p63c2-calling-function-sysctlclockconfigset-twice-in-the-row-causes-system-to-enter-endless-loop/6311271

    现在让我们想象一下、在调用 SysCtlClockPllConfig 之前、PLL 没有被正确锁定(例如,未考虑勘误表)、但

    乘数的定义与上述条件相同 不会赶上 本例中。 这就是我的想法...

    [/报价]

    通常不应出现这种情况。 如果 PLL 未成功锁定、看门狗将使器件复位。

    您 可以 按如下所示向 if-condition 添加(伪代码)、但不一定完全如此:

    if ((!SYSPLLSTS[SYSPLLLOCKS]&& SYSPLLCTL[SPLLEN]) || CurPllSrc!= ClkSrcREQ) ||……){}

    这是否 意味着调用  SysCtlClockPllConfig () 后无法重新配置 Watchdog1?

    当看门狗中断已启用时、对 WDTCTL 控制寄存器的所有后续写入都将被忽略。 唯一可以重新启用写入的机制是硬件复位。 我相信您仍然可以重新配置其他 WDT1 寄存器(重新加载值等)

    此致、

    马特

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

    现在、当我们看到看门狗重新配置的问题时、可以说在 SysCtlClockPllConfig (...) 之前禁止运行 WATCHDOG1 是多少?

    我们的目标 — 在启动后配置一次 PLL、但 随后将 Watchdog1 用于我们自己的目的。

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

    您好:

    是的、我建议  在 F28M36x 器件上调用 SysCtlClockPllConfig () 之前不要运行 Watchdog1。 最佳实践建议 先配置 PLL、然后初始化看门狗。 大多数 TI 参考代码会 在打开任何外设驱动程序(包括看门狗)之前调用 SysCtlClockPllConfig ()。

    此致、

    马特

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

    您好、Matt

    按照这种方法、我们必须在上电后配置 PLL 一次、然后配置 WDT1、而无需随后写入其 CTL 寄存器。

    我也想考虑另一个解决方案 — 只需从 PLL 配置中删除 WDT1。 请提供建议。

    WDT1 仅在 PLL 已成功锁定(循环进行 5 次尝试后)后启动、在此步骤中运行 WDT1 是否合理?  

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

    您好:

     此时、WDT1 配置为 在 PLL 锁定发生故障 时提供复位机制、然后才能将其用作系统时钟源。  

    根据 勘误表:“看门狗计时器用于检测是否发生了这种情况、因为这种情况不由 PLL 输出计时。 在选择 PLL 作为时钟源之前、应启用看门狗、并配置为对器件进行复位。 如果 PLL 不产生时钟、看门狗将复位器件、因此用户初始化软件将重复 PLL 初始化。“

    此致、
    马特

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

    我看不到在 PLL 锁定尝试之前特意配置和运行 WDT1 (F28M36 支持库 V210)。

    如果 PLL 锁定失败、它是否应该在 while 循环开始之前运行、以防止无限循环?

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

    您好:

    这是真的,如果锁故障,似乎有潜在的 livelock。 您可以添加软件超时(使用计数器)、也可以事先使用合适的超时值进行 WDT1 配置。  许多 TI 支持库示例假定存在标称硬件条件、并且不包括针对 PLL 锁定环路的超时保护。

    此致、
    马特

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

    谢谢你,马特! 我想安排下周和与团队成员举行一次简短的会议

    如果我们没有其他问题、我们可以将主题标记为“已解决“并进行总结。

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

    您好、

    听起来不错! 如果需要澄清任何其他问题、我将在这里提供帮助。

    此致、

    马特

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

    您好、Matt!   在向我们的团队介绍情况后、我想提供另一个解决方案-  

    成功锁定并启用 PLL 后调用以下两个函数:

    SysCtlPeripheralDisable (SYSCTL_PERIPH_WDOG1);//此函数已存在
    SysCtlPeripheralReset (SYSCTL_PERIPH_WDOG1);//reset Only WDT1 寄存器

    似乎它解决了所有可能的问题 、我们可以清楚地看到我们可以重新配置 PLL 两次、以此类推

     本地外设复位后、也可以重新配置所有 WDT1 寄存器。

    此解决方案是否存在任何可能的问题?

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

    您好:

    是的、这是解决 WDTCTL 寄存器锁定问题的有效权变措施。 我很高兴听到现在的事情正在工作!

    此致、

    马特

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

    非常感谢!