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.

[参考译文] TMS570LS3137:TMS570LS3137:启动后使用 SYSESR 和 RTIWDSTATUS

Guru**** 2535150 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/925536/tms570ls3137-tms570ls3137-using-sysesr-and-rtiwdstatus-after-startup

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN
您好!
我对 SYSESR 寄存器和 WDRST 位有疑问。
当微控制器被 DWWD 超时所重置时、我需要应用代码中的信息。 我正在使用由 Halcogen 生成的引导加载程序和启动代码。 函数 _c_int00()的一部分如下所示。
信息如果复位是由 DWWD 引起的、则在启动过程(第16行)中清除、因此我无法在应用程序代码中使用此信息。 但在 DWWD 超时的情况下也被置位的 EXTRST 位不会被清零。 此外、在启动例程中、RTIWDSTATUS 不会改变、因此使用这两个信息、我可以确定复位是否由 DWWD 引起。
这是处理 DWWD 复位的安全方法吗?
第二个问题是、在执行所有测试后、我能否通过检查代码中其他位置的 WDRST 位来检查看门狗违反情况?
如果我注释掉 WDRST 被清除的代码(第16行)、那么我的应用程序永远不会启动(即使引导加载程序没有启动)、并且看起来函数在 STC()(第53行)之后永远不会执行。
void _c_int00 (void)
{
//在此处启用 EventBusExport、FlashEcc 和一些勘误表...

if ((SYS_EXception & powerON_RESET)!= 0U) /* SYSESR */
{
SYS_EXception = 0xFFFFFF;/*清除所有复位状态标志*/
}
如果((SYS_EXception & OSC_failure_reset)!= 0U)则为其他
{
}
如果((SYS_EXCE异常 和安全装置复位)!=0U)则为其他
{
if (watchdog_status!= 0U)
{
SYS_EXception = watchdog_reset;
}
其他
{
SYS_EXCE异常= ICEPICK_RESET;
}
}
否则((SYS_EXCE异常 和 CPU_RESET)!=0U)
{
SYS_EXception = CPU_RESET;

/*检查这是否是 stcSelfCheck 运行*/
if ((stcREG->STCSCSCR & 0xFU)== 0xAU) /*签名比较逻辑自检使能键*/
{
if ((stcREG->STCGSTAT & 0x3U)!= 0x3U)
{
stcSelfCheckFae(); /* STC 自检失败*/
}
其他 /* STC 自检已通过*/
{
stcREG->STCSCSCR = 0x05U; /*清除自检模式*/
stcREG->STCGSTAT = 0x3U; /*清除 STC 全局状态标志*/
esmREG->SR1[0U]= 0x08000000U;//清除 ESM 组1通道27状态标志*/

cpuSelfTest (STC_INTERVAL、STC_MAX_TIMEOUT、TRUE);
}
}
否则、如果((stcREG->STCGSTAT & 0x1U)== 0x1U) /*自检运行完成。 *
{
if ((stcREG->STCGSTAT & 0x2U)== 0x2U) /*测试失败*/
{
cpuSelfTestFae();
}
其他 /*成功完成 CPU 自检*/
{
stcREG->STCGSTAT = 0x1U;

fterSTC();
}
}
其他 /*软件写入 CPU 复位位引起的 CPU 复位*/
{
}
}
否则((SYS_EXception & SW_RESET)!= 0U) /*由于软件复位导致的复位。*/
{
}
其他 /*由从外部驱动低电平而导致的复位。*/
{
}


//检查 ESM 组3错误,初始化系统-时钟,使用 Efuse 自检的闪存设置,
//对内存自检控制器运行诊断检查,
//在 STC ROM 上运行并检查 PBIST,
//在 PBIST ROM 上运行并检查 PBIST,运行 stcSelfCheck

//....
} 

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

    您好!

     EXTRST 位应在启动代码中清零。 它不会被通过 HALCoGen 生成的代码清除、请添加代码以清除它。 您可以使用全局标志来记录复位源。  

    我们建议 在检查复位源时检查启动时的看门狗违反。 但是您可以在启动后使用 RTIWDSTATUS 寄存器中的信息和全局标志来检查它。

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

    感谢您的回答、

    您能解释一下使用全局标志吗?

    如果您认为是全局变量、我认为这是不可能的、因为它会在执行内存测试和测试期间的后续复位之后被吹走。

    此致

    Refik

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

    您好、Refik、

    如果发生新的复位、则不会自动清除 SYSESR 寄存器中先前的复位源状态位。 读取该寄存器后、软件应清除所有被置位的标志、以便确定未来复位的源。  

    EXTRST 位在所有复位条件下都被置位。 看门狗状态只能由 nPORRST 清除。 因此、使用 EXTRST+Wchdog 状态不是可靠的方法。

    你是对的、全局标志也不起作用。 另一种方法是在 systemInit()被执行后将这个标志编程到内置 EEPROM (组7)。

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

    您好!
    很抱歉耽误你的回答。  

    >> 另一种方法是在 systemInit()被执行后将这个标志编程到内置 EEPROM (组7)。


    这也是不可能的。  我在第一个帖子中描述了如果我不清除 SYS_EXception 寄存器、那么引导加载程序永远不会退出、我的应用程序也不会启动。 在自检过程中,代码在某个点被阻止,并且永远 不会到达 f后 STC()函数(与 systemInit()一样为墙)。
    当前工作的一种方法是、如果我调用:

    _IAR_DATA_init3 ();  

    TI_FEE ();

    WRITE_STATUS_TO_SYS_EXception_and_Watchdog_STATUS_TO_EEPROM ();

    在清除 SYS_EXception 之前。

    问题是这种安全方法、因为此代码是在实际 RAM 和闪存测试执行之前执行的。


    我还在考虑将 DWWD 超时从复位重定向到 NMI、并从中断例程将相关信息写入 EEPROM。

    此致、

    Refik