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.

[参考译文] CCS/TMS320F2.8069万:CPU重置问题(监视程序软件重置)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635769/ccs-tms320f28069-question-about-cpu-reset-watch-dog-software-reset

部件号:TMS320F2.8069万

工具/软件:Code Composer Studio

大家好,

我正在开发客户引导加载程序。 应用程序存储在FLASHH_C (Origin = 0x3D8102,length = 0x017EFE),bootloader存储在FLASHH_A (origin = 0x3F0000,length = 0x007f80)。 下载应用程序时,bootloader执行监视程序软件重置,再次执行bootloader,找到应用程序代码,然后跳至应用程序代码。

问题是,在看门狗软件重置期间,是否存在对等非法_ISR中断服务? 有人能告诉我如何解决这个问题吗?

此致

云华

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

    这种情况(illegal _ISR)发生的频率如何? 说,如果你尝试了100次,你会看到多少次? SPRU430F的3.6 部分说:

    3.6 非法指令陷阱

    以下任一事件都会导致非法指令陷阱:

    • 解码无效指令(包括无效寻址模式)。
    • 操作码值0.0016万已解码。 此操作码对应于ITRAP0指令。
    • 对操作码值FFFFFF16进行解码。 此操作码对应于ITRAP1指令。
    • 32位操作尝试使用[@SP]寄存器寻址模式。
    • 地址模式设置AMODE=1和PAGE0=1

    不能阻止非法指令陷阱,即使在仿真过程中也是如此。 一旦启动,即为非法指令

    陷阱的操作与陷阱#19指令相同。 处理由启动的中断

    陷阱指令在第3.5 .2节中介绍。 作为其操作的一部分,非法指令陷阱会保存

    堆栈上的返回地址。 因此,您可以通过检查此保存的地址来检测出有问题的地址

    值。 有关trap指令的更多信息,请参见Chapter 6, C28x Assembly Language

    说明。

    是否可能有一个要点适用于您的情况? 是否可以检查堆栈以确定在哪一点进行了此中断?

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

    感谢您的回复。

    我认为illegal _isr为1000次尝试输入了5次。

    我检查堆栈,有时它看起来像下面,0x6A是SP指针。

    0x21.31万FF应该是保存在堆栈上的返回地址,这会令人困惑。

    有时,它以两种方式运行,SP也是0x6A。 问题

    是在bootloader中为ilical_isr提供服务,但返回地址

    堆栈中属于应用程序代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    云华
    在200次尝试中显示一次的内容可能难以调试。 是否可能有一些外部噪音损坏了程序计数器或CPU寄存器中的其它位?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    云华
    除了Hareesh的问题之外,您还明确提到启动加载程序中正在发生非法ISR。 因此,在看门狗重置后,引导加载程序将正确启动,有时无法启动应用程序。

    发生故障时:-
    >是否确定在上一步中正确设定了应用程序?
    >您的引导加载程序非法ISR是否会触发另一个监视程序重置并尝试再次启动应用程序,它是否工作正常?
    >设备如何从该状态恢复,您执行开机重置并运行应用程序,或者您是否必须重新刷新主板?

    尝试确保在发生错误时引导加载程序正确编程应用程序。 如果您确定应用程序已正确编程,并且引导加载程序仍然随机偶尔看到非法ISR,则必须将方案缩小到
    >是启动加载程序在重置看门狗后执行时发生的iTRAP (=非法ISR)

    > ITRAP是否在应用程序运行时发生。

    这将让您了解RAM是否损坏,引导加载程序/应用程序可能认为RAM中存在函数并分支到RAM位置,但RAM被之前的代码实例覆盖。 因此,请注意从闪存加载到RAM中以供执行的功能,并通过比较成功运行和失败运行之间的内存来查看是否存在任何损坏。

    您还可以比较两个不成功运行之间的memoy转储,查看故障本身是随机的还是有任何相似之处。

    希望这有所帮助。

    此致
    Santosh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    我会研究一下。

    此致!
    云华
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我会解决这个问题。
    在软件重置之前,将执行System_DeInit。 我对以下代码进行注释,没有非法_ISR了。 我不知道为什么?
    EALLOW;
    PieCtrlRegs.PIEIER2.bit.INTx1 = 0;
    PieCtrlRegs.PIEIER2.bit.INTx2 = 0;
    PieCtrlRegs.PIEIER2.bit.INTx7 =0;
    EDIS;

    EALLOW;
    PieCtrlRegs.PIEIER10.bit.INTx1 = 0;
    PieCtrlRegs.PIEIER10.bit.INTx2 = 0;
    EDIS;

    EALLOW;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 0;

    PieCtrlRegs.PIEIER1.ALL = 0x0;
    PieCtrlRegs.PIEIER2.all = 0x0;
    PieCtrlRegs.PIEIER3.ALL = 0x0;
    PieCtrlRegs.PIEIER4.ALL = 0x0;
    PieCtrlRegs.PIEIER5.ALL = 0x0;
    PieCtrlRegs.PIEIER6.ALL = 0x0;
    PieCtrlRegs.PIEIER7.ALL = 0x0;
    PieCtrlRegs.PIEIER8.ALL = 0x0;
    PieCtrlRegs.PIEIER9.ALL = 0x0;
    PieCtrlRegs.PIEIER10.ALL = 0x0;
    PieCtrlRegs.PIEIER11.ALL = 0x0;
    PieCtrlRegs.PIEIER12.ALL = 0x0;

    PieCtrlRegs.PIEIFR1.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR2.all = 0xFFFF;
    PieCtrlRegs.PIEIFR3.all = 0xFFFF;
    PieCtrlRegs.PIEIFR4.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR5.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR6.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR7.all = 0xFFFF;
    PieCtrlRegs.PIEIFR8.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR9.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR10.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR11.ALL = 0xFFFF;
    PieCtrlRegs.PIEIFR12.ALL = 0xFFFF;

    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 0;// ePWM1
    SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 0;// ePWM2
    SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0;// ePWM3
    SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0;// ePWM4
    SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 0;// ePWM5
    SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 0;// ePWM6
    SysCtrlRegs.PCLKCR1.bit.EPWM7ENCLK = 0;// ePWM7
    SysCtrlRegs.PCLKCR1.bit.EPWM8ENCLK = 0;// ePWM8

    SysCtrlRegs.PCLKCR0.bit.HRPWMENCLK = 0;// HRPWM
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; //在ePWM内启用TBCLK

    SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0;// eQEP1
    SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0;// eQEP2

    SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;// eCAP1
    SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;// eCAP2
    SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;// eCAP3

    SysCtrlRegs.PCLKCR2.bit.HRCAP1ENCLK = 0;// HRCAP1
    SysCtrlRegs.PCLKCR2.bit.HRCAP2ENCLK = 0;// HRCAP2
    SysCtrlRegs.PCLKCR2.bit.HRCAP3ENCLK = 0;// HRCAP3
    SysCtrlRegs.PCLKCR2.bit.HRCAP4ENCLK = 0;// HRCAP4

    SysCtrlRegs.PCLKCR0.bit.ADCENCLK =0; // ADC
    SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 0;// comp1
    SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 0;// Comp2
    SysCtrlRegs.PCLKCR3.bit.COMP3ENCLK = 0;// Comp3

    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 0;// CPU计时器0
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 0;// CPU计时器1
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 0;// CPU计时器2

    SysCtrlRegs.PCLKCR3.bit.DMAENCLK =0; // DMA

    SysCtrlRegs.PCLKCR3.bit.CLA1ENCLK = 0; // CLA1

    SysCtrlRegs.PCLKCR3.bit.USB0ENCLK = 0; // USB0

    SysCtrlRegs.PCLKCR0.bit.I2CAENCLK =0; // I2C-A
    SysCtrlRegs.PCLKCR0.bit.SCIANCLK =0; // SPI-A
    SysCtrlRegs.PCLKCR0.bit.SCIBENCLK =0; // SPI-A
    SysCtrlRegs.PCLKCR0.bit.SPIANCLK =0; // SPI-A
    SysCtrlRegs.PCLKCR0.bit.SPIBENCLK =0; // SPI-B
    SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK =0;// McBSP-A
    SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=0; // eCAN-A

    EDIS;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    云华
    这是一个很好的进展,我的建议是深入研究一下这个问题,看看上面哪一行代码是导致问题消失的代码。 我认为它必须是PIE中断,而且您很可能有PIE中断,并且中断处理程序尚未正确设置,因为SW正在引导加载程序和新应用程序之间切换。 准确找到问题部分将有助于进一步提高SW的稳健性。

    此致
    Santosh Athuru