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.

[参考译文] TMS320F280049:复位后的 cbrom_itrap _ISR

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/930333/tms320f280049-cbrom_itrap_isr-after-reset

器件型号:TMS320F280049
主题中讨论的其他器件: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、而不是触发陷阱时。

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

    您好 Stefan、

    您是否已检查晶体时钟本身以确保其正常工作? 此外、看起来您已经编写了自己的结构;请尝试使用 C2000Ware 支持文件、以查看同一问题是否仍然存在。

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

    您好、Frank、

    感谢您的回复。 我已查看 C2000Ware 示例。 X1CNT 寄存器的过程不同。 我已在我们的守则中采用这一程序,至今似乎是有效的。 我会进一步测试、但我有信心。

    我想知道 TRM 或勘误表中为什么没有提到如何复位 X1CNT。 在我的例子中、它会非常有用。

    静态空
    PollX1Counter (void)
    {
    UINT16循环计数= 0;
    
    //
    //在 XTAL 加电时延迟1ms
    //
    // 2000个循环,每个循环5个周期+ 9个周期开销= 10009个周期
    //
    F28x_usDelay (2000);
    
    //
    //清除 X1CNT 并使其饱和4次以保证运行
    //
    操作
    {
    //
    //继续清除计数器直到它不再饱和
    //
    while (ClkCfgRegs.X1CNT.all > 0x1FF)
    {
    ClkCfgRegs.X1CNT.bit.CLR = 1;
    }
    
    //
    //等待 X1时钟饱和
    //
    while (ClkCfgRegs.X1CNT.all!= 0x3FFU)
    {
    ;
    }
    
    //
    //递增计数器
    //
    loopCount++;
    }while (loopCount < 4);
    } 

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

    您好 Stefan、

    有关如何正确复位 X1CNT 的勘误表。 我将提交一个 TT 以更新 TRM、从而使其更清晰。

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

    您好、Frank、

    抱歉、我没有找到此勘误表。    对于此控制器、除了 www.ti.com/.../sprz439f.pdf (TMS320F28004x MCU 器件勘误表器件修订版本 B、A、0)、我还需要考虑其他勘误表吗?  或者我是否忽略了该文档中的内容?

    此致、

    Stefan

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

    您好 Stefan、

    这确实是正确的勘误文档。 您是对的、不在勘误表中。 看起来、它不会以某种方式将其添加到文档中。 我已提交一个 TT、以便将其包含在下一个版本中。 您可以继续使用 C200Ware 代码、因为它包含解决方法的正确实现。 由此给您带来的不便、我们深表歉意。