器件型号: F28M36P63C2
在 F28M36 支持库 V210 中、如果在行中调用函数 SysCtlClockConfigSet () 两次导致系统进入无限循环。 似乎问题与 SysCtlClockPllConfig(...) 中的 WATCHDOG1 配置有关 。 如何解决此问题?
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
在 F28M36 支持库 V210 中、如果在行中调用函数 SysCtlClockConfigSet () 两次导致系统进入无限循环。 似乎问题与 SysCtlClockPllConfig(...) 中的 WATCHDOG1 配置有关 。 如何解决此问题?
您好:
双锁是单个 PLL 初始化序列的一部分、但SysCtlClockConfigSet()在系统配置完毕后再次调用将导致系统复位或挂起。
数据表明确指出 、PLL 应连续锁定两次、并且该SysCtlClockPllConfig()函数会实现此双锁序列。 但是、SysCtlClockConfigSet()在应用程序中调用多次 (尤其是在引导加载程序已经配置 PLL 后)可能会导致系统复位和不稳定、因此您应该在初始化期间只配置一次 PLL。
SYSPLLSTS[SYSPLLLOCKS]寄存器的状态是什么? 您还可以检查 MRESC 寄存器以确认复位原因。
此致、
马特
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); //锁定看门狗
您好、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() 中从未捕获到的错误。
另外、原始 if-condition 未考虑 PLL 启用并锁定(寄存器 SYSPLLSTS)。 如何解决?
您是否打算在已锁定的情况下跳过时钟配置?
此致、
马特
您好、Matt!
如我所见,连接的调试器 — 即使在 SysCtlClockPllConfig () 初始化之前, PLL 也得到了某种配置。
我想 它是 在原始 _c_int00 函数下发生的 (根据 CFG-file 设置),在 main() 之前。
现在让我们想象一下、在调用 SysCtlClockPllConfig 之前、PLL 没有被正确锁定(例如,未考虑勘误表)、但
乘数的定义与上述条件相同 不会赶上 本例中。 这就是我的想法...
您好:
正如我可以看到的,使用附加的调试器 — 即使在 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 寄存器(重新加载值等)
此致、
马特
您好:
此时、WDT1 配置为 在 PLL 锁定发生故障 时提供复位机制、然后才能将其用作系统时钟源。
根据 勘误表:“看门狗计时器用于检测是否发生了这种情况、因为这种情况不由 PLL 输出计时。 在选择 PLL 作为时钟源之前、应启用看门狗、并配置为对器件进行复位。 如果 PLL 不产生时钟、看门狗将复位器件、因此用户初始化软件将重复 PLL 初始化。“
此致、
马特
您好、Matt! 在向我们的团队介绍情况后、我想提供另一个解决方案-
成功锁定并启用 PLL 后调用以下两个函数:
SysCtlPeripheralDisable (SYSCTL_PERIPH_WDOG1);//此函数已存在
SysCtlPeripheralReset (SYSCTL_PERIPH_WDOG1);//reset Only WDT1 寄存器
似乎它解决了所有可能的问题 、我们可以清楚地看到我们可以重新配置 PLL 两次、以此类推
本地外设复位后、也可以重新配置所有 WDT1 寄存器。
此解决方案是否存在任何可能的问题?