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.

[参考译文] TMS570LS0914:在 SYSESR 寄存器中看门狗与窗口式看门狗;也加电

Guru**** 2538960 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/953804/tms570ls0914-watchdog-versus-windowed-watchdog-in-sysesr-register-also-power-up

器件型号:TMS570LS0914
主题中讨论的其他器件:HALCOGEN

我使用的是数字看门狗(DWD)、而不是数字 Windows 看门狗(DWWD)。  我想在启动时确定复位是否由看门狗引起、因此我正在读取 SYSESR 寄存器。  (在 sys_startup 中的 HAL 代码清除之前)。  文档似乎暗示 SYSESR 中的位13只能由于 icepick 或窗口化看门狗而置位、实际上当我强制执行 DWD 超时和复位时、该位不会置位。  是否有办法确定未加窗口的看门狗是否触发了复位?

类似地、如果我关闭处理器电源然后重新打开处理器电源、则不会设置 SYSESR 中的位15 (POR)。

我的问题是:

1)是否有方法确定重启是由非 Windows 看门狗(DWD)引起的

2) 2)是否有方法确定重启是由上电还是重启引起的?

谢谢。。。

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

    Burns、您好!

    SYSESR[15]将通过 POR 复位或下电上电进行设置。 SYSESR[13]由 DWD 或 DWWD 设置。

    这些位在 sys_startup.c 中清除 请在 SYSESR 位被清零前检查 SYSESR 寄存器。

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

    谢谢、QJ。  这正是我所期望的(尽管我可以阅读文档、以说明位15只会根据 nPOR 引脚和引脚13进行设置、而只会使用窗口 WD。  我认为我及时正确地保存了 SYSESR 寄存器、但我将再次检查。  

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

    很抱歉,这不是我看到的。  我在 sys_startup 中的_c_int00之后立即放置以下代码:

    void _c_int00 (void)
    {    
    /*用户代码开始(5)*/
       ERRReg = SYS_EXception;//将此保存以供以后使用
    /*用户代码结束*/

    请注意、在启动过程中、有几个地方会擦除存储器、我必须将其临时放入寄存器中。  HAL system.h 文件将 SYS_execseption 定义为

    #define SYS_EXception       (*(volatile UINT32 *) 0xFFFFFFE4U)


    一切启动后、我可以打印出以下内容、当我从断电状态启动时、只需打开电源即可获得:

    错误寄存器为0x20
    电源:0、OSC:0、WD:0、复位:1、SwRst:0、ExtRst:0

    如果我通过允许 DWD 超时来重新启动、我会得到以下结果:

    错误寄存器为0x28
    电源:0、OSC:0、WD:0、复位:1、SwRst:0、ExtRst:1

    为了证明所有位都从我读取 SYSESR 寄存器的位置成功获取、我使用了以下代码:

    void _c_int00 (void)
    {    
    /*用户代码开始(5)*/
       ERRReg = SYS_EXception;//将此保存以供以后使用
       ERRReg |= 0xA000;
    /*用户代码结束*/

    并获得该输出、从而证明最有效的位正在通过。

    错误寄存器为0xa020
    电源:1、OSC:0、WD:1、复位:1、SwRst:0、ExtRst:0

    您能提供更多帮助吗?  谢谢。。。

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

    使用 TI Launchpad 进行测试(POR 复位)时没有问题:

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

    谢谢 QJ。  我已经查看了 Launchpad 的原理图、我发现 nPOR 线路的使用与我们的使用有很大不同。  我必须向我们的硬件人员介绍这一点。

    这可能解决了 POR 位问题。  但是、如果您也可以尝试常规看门狗(而不是窗口看门狗)、我将不胜感激。 外部接线似乎不会对 WD 产生任何影响、因此我希望得到一些指导。  我们的代码是:

       dwdInit (DWD_RESET_VALUE);//DWD_RESET_VALUE 为0xFFF
       dwdCounterEnable();

    如果我们不这么做

           dwdReset();


    频率足够高、当然处理器会复位、但我们的系统上未设置 SYSESR 的位13。

    谢谢。。。

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

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

    Burns、您好!

    我的测试表明、SYSESR[13]位通过 WD 复位进行设置。

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

    我看到它是这样的。  哇哦。  我无法想象为什么我们会获得如此不同的结果、除非这仍然与 nPOR 接线有关。  我将继续搜索并告知您。

    感谢您的工作...

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

    好的、谢谢

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

    我的操作方式与您的操作方式完全相同、实际上设置了 WD 位。  然后、我在下电上电时尝试了它。  这也是它为您所做的那样。  更多的检查告诉我还有另一个复位正在进行、我们在实际进入主程序之前至少输入此代码两次。  第二次也是后来一次、POR 和 WD 位都没有置位、我保存的是更新版本。  

    这是否与执行自检有关?  或者、你是否有其他想法、为什么执行_c_int00两次、或者在我进入主程序之前、我可以在哪里保存这个值?  (我想将其作为遥测从航天器发出)。

    谢谢。。。

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

    Burns、您好!

    Hercules 系列架构支持使用硬件逻辑 BIST (LBIST)引擎自检控制器(STC)。  无论通过与否、STC 都会在测试完成后生成 CPU 复位。  

    测试中的第二个复位是由 CPU 自检引起的。

    请参阅 Hercules 器件初始化应用手册中的#22:

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

    [引用 USER="Burns Fisher ]抱歉、这不是我看到的。  我在 sys_startup 中的_c_int00之后立即放置以下代码:

    void _c_int00 (void)
    {    
    /*用户代码开始(5)*/
       ERRReg = SYS_EXception;//将此保存以供以后使用
    /*用户代码结束*/该代码不是紧随 其后调用_coreInitRegisters_()来初始化所有内核寄存器,因此会干扰在 寄存器中保存 SYS_EXception 的尝试? (这本身就是 RAM 归零的一个变通方法、稍后在初始化期间发生)

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

    谢谢 QJ、我想这是最重要的原因。  我将读取代码以弄清为什么这不是一个无限循环:-)

    再次感谢...

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

    切斯特、你的确是对的。  擦除寄存器的位置有几个不同、擦除存储器的位置也有几个不同。  我只将内存保存在内存擦除位置周围的寄存器中。  这样、我也不会过多地依赖编译器来使用寄存器(毕竟、根据 C 语言、这只是一个提示)。

    我不能完全确定您所看到的是什么。  我最近才在 HAL 中打开 CPU 自检、因此我不确定如果您不这样做、是否会发生这种重复复位。  我知道一件奇怪的事情: 当我选中该复选框时、调试器无法可靠工作。  

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

    您好!

     _coreInitRegisters_()是初始化 MCU 通用寄存器:R0、R1、... R15。 除 CPU 复位外的所有复位都将寄存器的值复位为其默认值。

    如果调用 MCU SRAM PBIST 或调用 SRAM 硬件初始化、 则 SRAM 的内容将发生更改、因此 errReg 的值不是 SYSESR 的原始值。

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

    [引用 USER="Burns Fisher ]]擦除寄存器的位置有几个不同、擦除存储器的位置也有几个不同。  我只在擦除内存的位置将内存保存在寄存器中。感谢您的解释。 通过查看 HALCoGen 生成的_c_int00函数、已经有一个检查看门狗复位的部分、其中有些 用户代码块可以记录看门狗复位:

    /*SAFETYMCUSW 139 S MR:13.7 "硬件状态位读取检查"*/
    如果((SYS_EXCE异常 和安全装置复位)!=0U)则为其他
    {
    /*复位原因
    * 1)窗口式看门狗违规-在此处添加用户代码以处理看门狗违规。
    * 2) ICEPICK 复位-通过 CCS 加载代码/通过 CCS 复位系统之后
    *
    /*检查看门狗状态寄存器*/
    if (watchdog_status!= 0U)
    {
    /*在此处添加用户代码以处理看门狗违规。 */
    *用户代码开始(17)*/
    *用户代码结束*/
    
    /*清除异常状态寄存器中的看门狗复位标志*/
    SYS_EXception =安全装置复位;
    
    /*用户代码开始(18)*/*
    用户代码结束*/
    }
    其他
    {
    /*清除异常状态寄存器中的 ICEPICK 复位标志*/
    SYS_EXCE异常= ICEPICK_RESET;
    //用户代码开始(19)*/
    //用户代码结束*}
    
    
    

     其中看门狗状态寄存器(Watchdog_status)具有 DWD 和 DWWD 状态字段。

    [引用 user="Burns Fisher "]我最近才在 HAL 中打开 CPU 自检,因此我不确定如果不这样做,是否会发生重复复位。  我知道一件奇怪的事情: 当我选中该复选框时、调试器无法可靠工作。  [/引用]TMS570断点和 CPU 自检 包含一些有关启用 CPU 自检如何影响调试的信息。 这与您看到的行为是否匹配?

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

    切斯特、感谢您提出这个问题。  我确实得到了这种行为、但"暂停"按钮有时也会灰显。  作为一种权变措施、我可以在加载代码后断开调试器、然后使用不加载的 ccxml 文件重新连接调试器、只连接。  此时、我可以设置起作用的断点。  目前、我已在 HAL 中取消选中"自检"、并在我们接近发布时提醒重新启用它。

    和 BTW、还感谢您出于明确的复位原因在用户代码中提及这些位置。  我还看到了它们、并切换到使用它们。  您仍然必须在内存测试和其他几项测试中保存。