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.

[参考译文] TMS320F2.8377万S:计时器中断第一次发生故障,每次复位后都工作。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/581939/tms320f28377s-timer-interrupt-fails-the-first-time-works-every-time-after-a-reset

部件号:TMS320F2.8377万S
主题中讨论的其他部件:C2000WARE

您好,

我观察到一种奇怪的行为。 我的代码从RAM执行。 首次运行时,代码将在无效位置结束。 但是,之后每次都能完美地工作。 我最初认为它可能与初始化有关,但我已经达到了这样的地步:我可以通过评论/取消评论一行来复制行为:中断启用。即,我评论中断启用,编译,运行,代码行为正确。 我取消评论,第一次失败时,我重置它(使用CCS),它工作正常。 正如您在代码中所看到的,我特意从中断中删除了所有代码

下面是相关代码:

__interrupt void TimerInterrupt_vector(void){//void

for testing
}


void TimerInt_Init(void){

/*首先,禁用中断...*/
色调;

/*清除任何中断标志*/
_ASM ("和IER,#0");
_ASM ("和IFR,#0");

EALLOW();
PiVectorTable.Timer1_INT =&TimerInterrupT_vector;
EDIS ();


/*停止计时器*/
REG_CpuTimer1.tcr.bit.ts = 1U;

/*使用初始值和重置值*/设置定时器寄存器
REG_CpuTimer1.PRD.ALL = TIME_Period_40US;

/*由于时间太短,我们不需要预分频器*/
REG_CpuTimer1.TPR.bit.TDDR = 0;
REG_CpuTimer1.Thump.bit.TDDRH = 0;

/*重置计时器(将周期加载到计时器寄存器中)*/
REG_CpuTimer1.tcr.bit.trb = 1U;




/*启用中断*/
REG_CpuTimer1.tcr.bit.tie = 1U; 


/*启动计时器*/
REG_CpuTimer1.tcr.bit.ts = 0U;

enable_t1_INT();
EINT();
ERTM();
}


我已经验证了您可能会期望的内容:矢量设置正确,位正确等。但是我注意到,我最终使用的无效地址以某种方式被推入堆栈(我在无效地址中使用断点验证了此情况,然后检查堆栈)。

我是否遗漏了一个配置位或一些可以解释这种奇怪行为的东西?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看来突出显示该行毕竟不是一个好主意(格式不正确)。 我希望直到清楚该代码是什么以及哪个代码是突出显示的行:

    REG_CpuTimer1.tcr.bit.tie = 1U;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议看几个项目。
    饼图初始化是什么样子的? 这与C2000Ware中的示例相比如何?
    初始化和启用中断的顺序。 也许有一些在启用项目后初始化的内容,当您重新启动进行第二次尝试时,现在这些内容已初始化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哈维尔,您好!

    与前面提到的Brandon一样,请尝试启用PIE,然后将计时器ISR分配给PIE矢量表。 如果您在首次运行时仍然遇到错误,请告诉我。

    //启用PIE矢量表
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

    此致,

    Nirav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    相反,它的作用顺序是:我更新了矢量,然后再次启用PIE



    EALLOW();
    PiVectorTable.Timer1_INT =&TimerInterrupT_vector;

    /*重新启用PIE*/
    REG_PIECTRL.PIECTRL.bit.ENPIE = 1;

    EDIS ();



    我仍然不确定内部机制是什么。 ENPIE以前被设置为1 (在启动代码中,在我的代码之前),但不知为何它“没有计数”。 设置引导程序后再次设置ENPIE。


    非常感谢您的帮助