主题中讨论的其他器件:C2000WARE
您好!
在我们的应用中、软件复位(看门狗)后、 控制器有时不再反应。 我正在对复位进行调试、以查找此行为的来源。
现在、我可以看到代码在 cbrom_itrap _ISR 中的 ESTOP0处停止、iTrap_addr 指向我的函数 Oscillator_Select_External_XTAL
以下是整个函数:
静态空振荡器_Select_External_XTAL (void) { // SPRUI33B.pdf 3.7.7使用外部晶振或谐振器的过程(第106页)*/ uint16_Exact retries = 0; EALLOW (); Clock_Config.XTALCR.items.OSCOFF = 0; // 1. 清除 XTALCR.OSCOFF 位/开启 XTALSC DO { Clock_Config.X1CNT.Items.CLR = 1; // 2. 通过向 X1CNT.CLR 写入1来清除 X1计数器。 while (Clock_Config.X1CNT.items.X1CNT < 1023) // 3. 等待 X1CNT 寄存器中的 X1计数器值达到1023 (0x3ff)。 ; Clock_Config.CLKSRCCTL1.items.OSCCLKSRCSEL = CLKSRCSEL_EXTERNAL_OSC;// 4. 通过向 CLKSRCCTL1.OSCCLKSRCSEL 写入1来选择 XTAL 作为 OSCCLK 源。 SYSCTRL_CLKSRCCTL1_DELAY (); /* 5. 检查 MCDCR 寄存器中的 MCLKSTS 位。 如果该位置位、则振荡器未完成上电、 *需要更多时间:*/ IF (Clock_Config.MCDCR.Items.MCLKSTS) Clock_Config.MCDCR.Items.MCLKCLR = 1;// a.通过向 MCDCR.MCLKCLR 写入1来清除缺少的时钟状态。 其他 中断; /* b.重复步骤2-5。 请勿重置设备。 这样做将使振荡器断电、这是需要的 *从步骤1重新启动的过程。 * c。如果振荡器在10毫秒内未完成上电、则会出现实际时钟故障。 */ }while (++重试< MAX_RETESS_for_CLOCK_SELECT); EDIS (); if (retries == MAX_RETESS_for_CLOCK_SELECT) ESTOP0(); }
当离开 X1CNT 的 while 循环时、陷阱被触发(Clock_Config.X1CNT.items.X1CNT 为1023)。 我已读取 https://processors.wiki.ti.com/index.php/Interrupt_FAQ_for_C2000 、但没有堆栈溢出、控制器在触发陷阱之前多次传递此代码。
这是 iTraP_addr 地址处的汇编器指令:
AL、@0x30、#0x3ff
我有什么想法如何解决这个问题?
此致、
Stefan
编辑:
有时它会在之前的指令处停止:
Clock_Config.X1CNT.Items.CLR = 1; // 2. 通过向 X1CNT.CLR 写入1来清除 X1计数器。
或 @0x31、#0x0001
因此、我不确定它是否真正离开了环路。 当调试器停止时、X1CNT 可能只是1023、而不是触发陷阱时。