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.

[参考译文] TMS320F28035:WDT 操作和效果

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/626068/tms320f28035-wdt-operation-and-effects

器件型号:TMS320F28035

C2K 团队、家人和朋友;

我们的客户在下面有一个非常详细的请求、这是为了更好地了解 C2000 WDT。  任何评论都一定会受到欢迎!

摘要如下:

-一般而言,此处的培训模块很有帮助:  

但是,我们可能会寻找更多的文档

-对于 XRS 引脚上的简单 RC 可能感觉不是很舒服。  需要审查和提出建议。

感谢我们团队的任何指导。

----

客户提供;

C2000上的看门狗行为:

 

目标:我希望在使用 RAM 字交换某些状态信息的同时、从引导加载程序切换到应用程序(反之亦然)。

 

解决方案第1部分:

-         定义 RAM 字(将其称为"App_Vs_Boot_Info");

-         在运行应用程序时,看门狗以52ms 的持续时间启用;

-         在运行引导加载程序时,禁用看门狗;

-         在这两种情况下、看门狗被配置为复位器件、而将0写入 WDCR 被用来复位软件;

-         要从应用程序转至引导加载程序、请写入"App_Vs_Boot_Info"、然后强制执行看门狗复位(不是跳转至引导加载程序开始会导致我希望将外设恢复为其复位状态);

-         要从引导加载程序转到应用程序、请写入"App_Vs_Boot_Info"、然后跳转到应用程序启动;

到         目前为止,一切都按预期工作。 我们提供了几个类似的单元(大约100K...);

-         但有一个可能出现的情况、"App_Vs_Boot_Info"与预期不符。 (可能是因为我们从未复制过、但确定了它是如何发生的)因此、该单元将卡在引导加载程序中、这并不是很糟糕、因为我们可以对其进行重新编程、看起来加电复位可能会正常恢复;

 

解决方案第2部分:

-...          问题是、在上电复位时"App_Vs_Boot_Info"可能包含垃圾、因为 RAM 从未上电状态变为通电状态、所以我想知道我们是上电还是看门狗复位...;

         -...启动引导加载程序时、"App_Vs_Boot_Info"仅在 WDFLAG = 1时才是可靠的信息(即在看门狗复位之后、否则这是上电复位、"App_Vs_Boot_Info"包含垃圾信息);

所以         我在上电时添加了这个检查;

-         这在几个器件(同时配备 TMS320F28035和034)上似乎可以正常工作。 然后、我们使用"034"构建了40个单元、这些单元的运行方式与 WDFLAG 类似、但在我预期的情况下、未设置。 因此、该单元将卡在应用程序中、如果我们要重新刷写它、这会变得很糟糕、这是我们在每个单元上的 prod 行末尾所做的事情。 该单元不能提供 JTAG 访问权限(添加到所学的课程... 再次...);

 

解决方案器件#3:

-         删除解决方案第2部分,直到我们解决此问题。 这意味着我们可能会在现场遇到随机问题(启动时卡住的单元)、希望没有那么多;

 

我的理解与问题...:

-         我很难确保在我们的应用中正确使用 XRS 与看门狗与 WDFLAG:令人困惑的文档(或者让我们说个人无法自信地解释它... ;-);

-         我让看门狗从内部时钟计时、因此通常为10MHz;

-         当执行看门狗复位时、如果我查看 XRS 引脚、我应该会看到一个51us 低脉冲(51.2us = 512/10MHz)->这种情况;

-         在 XRS 引脚上、我们有一个时间常数为220us 的 RC (2.2k Ω 时为100nF)、这足够快、可以在420us 内看到 XRS 上升超过2.5V;

-         从 SPRUGL8C 文档第61-62页中、当 XRS 变为低电平时、WDFLAG 应为0。 当 WDRST 变为高电平时、如果 XRS 为1、则 WDFLAG 应变为1。 由于 XRS 在等于512个时钟周期(由于 WDRST 持续时间)+ RC 产生的持续时间内变为低电平、因此当 WDRST 变为高电平时、XRS 应始终为0、因此在看门狗复位后、不应将 WDFLAG 视为1。

-         还有一个"同步后和8192 SYSCLOCKOUT 周期延迟"条件、但我不确定如何应用;

-         要检查这一点、在引导加载程序的开头、我启用 GPIO 作为输出并将其切换、直到我看到 WDFLAG 为1 (或最大900个循环、即大约13ms)、并在 GPIO 上报告 WDFLAG (JTAG 不用于执行此操作)。 我注意到的是、在 XRS 引脚变为低电平(由于看门狗复位)后、引导加载程序启动975us、并且在我第四次读取 WDFLAG 时(即在 XRS 引脚变为低电平后1ms)读取为1。 然后、我有点困惑。 我找不到关于我所看到的内容的解释。 在复位1ms 后、设置 WDFLAG 的 XRS 引脚采样看起来是一样的;

-         如果我参考" http://secure-web.cisco.com/1WpVOAxyatWQwACpr0wgTXTIiPqtsQi5l95nkg1N5afT2bAcfKT1MoVpx0DrhXOi5r0aj6gWi1MvVgYMAKQ9F9lpXv2gz6TCN5hduKwOzUx7hBiGq4wQedKB1kAeyZEUhlfAjIIoHz2ZPfgREbBY4fgFCDPFEpWxlzxQ6GFjQHSOKjUeaji0luyc2XAJFrJEWDLNubw72eEoa_nz_Fuj1jHQ8V1W5Zzy2Lhlaum_BNdoeymlU5wR8xHS6_wCwldoHAn7CGpdZc9xpCmILHaVedQ/http%3A%2F%2Fprocessors.wiki.ti.com%2Findex.php%2FWDFlag_on_Piccolo"、在看门狗复位时、在 XRS 变为低电平后、WDFLAG 应设置为3.3ms。 不适合我看到的内容。 我们应该对 XRS 变为低电平的8192+512个时钟周期进行计数、这将使我们距离我看到的不远、但不完全是;

然后         ,这个 wiki 还告诉我,如果我想使用 WDFLAG 的话,一个简单的 RC (就像我们使用的 RC)不是一个好主意 (...是的,似乎我们现在已经被指责了... );

-         似乎我们应该使用 TLV803S 或类似的替换器件、因为 CPU 无法识别上电复位、因为在对其进行采样时、它将始终看到 XRS 线路设置为1;

         那么、让我们尝试一下... 如果我执行上电复位... ;

-         我看到 XRS 线路从0上升到接近2V、然后在0us 时变为低电平、发布时间为630us (类似于文档 SPRS584K 第33页的 XRS 脉冲持续时间或典型值为600us 的脉冲持续时间、 或第27页400至800us 范围内的监控器复位释放延迟),900us 时为2V,引导加载程序在1.55ms 时启动,在14.67ms 时 WDFLAG 仍然不为1;

-...          嗯…… 它似乎检测到上电复位并区分看门狗复位...;

...         这很好,作为一种解决方案还可以,但因为它确实符合我对文档的理解,所以我很不习惯使用它;

 

我的问题是:

-         在我对该看门狗的理解中,什么是缺失或错误的?

-         是否有一份明确/简单/正式的文件能更好地描述这一点?  (我还看 了 https://secure-web.cisco.com/1gMDhxAQph3uDs7BGidjMZXQIcCq_dGgK10qSKt3WST8rEzFraNKuyEuayPaY_MVnOQIY0m4N7E9zyJHmkL0WeI_F4CkJJxw9km6squFphzwejXaA4-O9Aol1NzmOcrqxqq65abo4rnJQXpegUBUWGLZt7cXDByRJYNHPv9kD7Iza9SUmFKcY36yG9BMascgxOAVG6YE-n-pBldFXL0oDYVv8Qt-ri7QVdK0gK9kPkRiUws6WjQ1xwQZo09UtX0pxw3sDzYv72ntniu42Ym38lw/https%3A%2F%2Fe2e.ti.com%2Fsupport%2Fmicrocontrollers%2Fc2000%2Ff%2F171%2Ft%2F419598、也说不清楚...)

-         我们是否可以在 XRS 引脚上使用简单的 RC?

—         —有什么建议/提示/建议?

----

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

    -Chris 您好、

    [引述]

    -         还有一个"同步后和8192 SYSCLOCKOUT 周期延迟"条件、但我不确定如何应用;

    -         要检查这一点、在引导加载程序的开头、我启用 GPIO 作为输出并将其切换、直到我看到 WDFLAG 为1 (或最大900个循环、即大约13ms)、并在 GPIO 上报告 WDFLAG (JTAG 不用于执行此操作)。 我注意到的是、在 XRS 引脚变为低电平(由于看门狗复位)后、引导加载程序启动975us、并且在我第四次读取 WDFLAG 时(即在 XRS 引脚变为低电平后1ms)读取为1。 然后、我有点困惑。 我找不到关于我所看到的内容的解释。 在复位1ms 后、设置 WDFLAG 的 XRS 引脚采样看起来是一样的;

    [/报价]  

    8192 SYSCLKOUT 周期延迟是 WDRST 去耦之后的时间、当在硬件中检查 XRSn 引脚的状态以确定复位是由 XRSn (外部电路)还是由 WD 造成的并且基于该 WDFLAG 位将被置位。  由于这个8192周期延迟、当您在代码中读取 WDFLG 时、它可能不会被读取为"1"、因为 您读取的太早。  在您的代码中、您可能需要在读取 WDFLG 之前插入一些延迟(超过3ms) 、以确保正确读取值。

    [引述] 我们是否可以在 XRS 引脚上使用简单的 RC? [/报价]

    如果您想使用 WDFLAG 位来区分外部 XRSn 和 WDRST、那么简单的 RC 电路可能无法工作、但在您的解决方案#2中、您使用的 是上电复位、问题仅在于您看不到 WDFLG 位被置位(而不是其他方法)、 WDFLG 在外部 XRSn 上设置)、因此您可能需要在读取 WDFLG 状态之前在 SW 中插入延迟(如前所述)、并查看延迟是否有用。

    此致、

    Vivek Singh

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

    您正在处理一些问题、谢谢!

    请记住、他们在最长接近13ms 之后已经读取了 WDFLAG;他们显然看到的是 WDFLAG 在1ms 之后设置、而不是3ms 之后设置(这是造成混淆的部分原因)。

    此外,它似乎区分了看门狗复位和上电复位(因此,它似乎起作用,但我们的理解是它不应该起作用...)? 因此,据您所知,它是否会始终有效? 如果是,为什么?

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

    Chris、

    [引用]请记住、他们在最长接近13ms 之后已经读取了 WDFLAG;他们显然看到的是 WDFLAG 在1ms 之后设置、而不是3ms 之后(这是造成混淆的部分原因)。 [/报价]

    他们是如何测量这次的? 在代码跳转到应用程序之前、我们会运行 BootROM 代码以及初始化代码。 此外 、由于 RC 电路、XRSn 释放会有一些延迟。 一旦内部 WDRST 失效、内部计数器就会开始运行、而 CPU 只在 XRSn 失效后执行。 因此、该时间可以小于3ms。

    [引用] 此外,它似乎区分了看门狗复位和上电复位(因此,它似乎起作用,但我们的理解是它不应该起作用...)? 因此,据您所知,它是否会始终有效? 如果是,为什么? [/报价]

    电路板上的上电复位电路会有所不同、我希望它能满足3.7ms 的要求、因此在这种情况下、不会在上电复位情况下设置 WDFLG 位。

    此致、

    Vivek Singh

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

    它们的测量方式(可能描述不够清晰、抱歉...):
    - 在 XRS 引脚上有一个示波器通道、查找 XRS 引脚下降、低电平持续时间(51us)和 RC 效应开始;
    - GPIO 上的另一个示波器通道。 GPIO 第一个上升沿上的示波器触发、以检测代码何时启动;
    - 在代码中完成的第一件事是将 GPIO 设置为输出;
    - 接下来重复10次:if ((SysCtrlRegs.WDCR & 0x0080)=0){GPIO =1;GPIO =0;}
    - 然后在循环中重复此操作,最多900次或直至(SysCtrlRegs.WDCR & 0x0080)!= 0);
    - 然后等待400-500ns、通过切换 GPIO 发送寄存器值(每位400-500ns) 并使用示波器对此进行监控;
    - 测量从 XRS 的下降沿到第一个 GPIO 上升沿的时间。 这是应用程序代码在 XRS 下降沿之后开始-> 975us 的位置;
    - 测量从 XRS 的下降沿到 GPIO 停止切换的时间。 这是在 XRS 下降沿之后、在看门狗复位-> 1000us 后设置 WDFLAG 的位置;

    您可能会问"最初10次愚蠢的重复次数之间有何区别"和900x 循环?" ->执行速度... 如果它们仅使用循环、显然、在循环第一次检查时 WDFLAG 已设置。 看起来初始化和检查第一个循环的执行几乎需要20-25us 的间隔,因此想向自己证明代码可以在设置标志之前启动... 显然情况就是这样。

    再次欢迎评论! 再次感谢您的支持。

    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误你的回答。 我需要向设计团队核实这一点。

    同时、您能否在运行任何代码(恰好在进入主代码之后)之前以及在 WDFLG 置1时检查 PLLSTS 寄存器中 DIVSEL 位域的值。 请注意、延迟值取决于 SYSCLKOUT frq、如果该时钟快速、则该延迟将更小。

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

    没问题、感谢您的帮助!

    来自我们的朋友:

    - 就在进入主器件后 DIVSEL = 3 (在上电复位和看门狗复位之后)。 这似乎与文档"tms320f28035_Revk.pdf"第65页注释3中所述相同。 显然是由引导 ROM 设置的;
    - 在看门狗复位后、一旦 WDFLG 被置位、DIVSEL = 3;
    - 之后、我初始化 PLL 以使 DIVSEL = 2、这就是我看到的报告;

    P.S.

    为了让您理解、让我解释一下他们如何监控这一点。 他们希望确保使用 JTAG/调试器不会产生任何影响、因此当他们需要时、他们会将 PLLSTS 存储在 RAM 副本中、一旦他们满意、就使用 GPIO 报告所有值;

    一个非常类似的示例...

    //用于初始化和切换 GPIO 的宏
    #define DRV_DEBUG_TP7_ENABLE {EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO11= 1;EDIS;}//启用调试测试点 TP7
    #define DRV_DEBUG_TP7_ON {GpioDataRegs.GPASET.bit.GPIO11 = 1;} //"
    #define DRV_DEBUG_TP7_OFF {GpioDataRegs.GPACLEAR.bit.GPIO11 = 1;} //"

    // PLLSTS 寄存器 A 的 RAM 副本3个不同的时间戳
    uint16 Val1、Val2、Val3;

    ///----------------------------------
    int main (空)

    //初始时复制 PLLSTS 值
    Val1 = SysCtrlRegs.PLLSTS.all;

    //切换 GPIO 只要看不到 WDFLAG 逻辑"1"(手动完成10次以方便处理速度...)
    DRV_DEBUG_TP7_ENABLE;
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    //看门狗复位后不执行任何操作,GPIO 仅切换3次,不执行以下7次电位切换(即 WDFLAG 现在已设置...)

    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    if ((SysCtrlRegs.WDCR & 0x0080)=0){DRV_DEBUG_TP7_ON;DRV_DEBUG_TP7_OFF;}
    //注:在上电复位后、GPIO 切换10次(即 WDFLAG 仍不置位...)

    //标记,显示前10个可能的 GPIO 切换已完成。
    DRV_DEBUG_TP7_ON;
    asm (" RPT #4 || NOP");
    DRV_DEBUG_TP7_OFF;

    //设置 WDFLAG 后复制 PLLSTS 值
    Val2 = SysCtrlRegs.PLLSTS.all;

    //初始化 CPU
    MCU_Init();//检查切换 GPIO 直到 WDFLAG 设置(最多500个循环),读取并报告 GPIO 上的 RAM 标志,禁用看门狗,Init PLL,Init 外设时钟,Init Pie..., InitFlash
    DRV_Init();//将我的所有引脚插入

    //设置 WDFLAG 后复制 PLLSTS 值
    Val3 = SysCtrlRegs.PLLSTS.all;

    //发送 PLLSTS 寄存器的3个副本
    SendVal (Val1);
    SendVal (Val2);
    SendVal (Val3);


    真正的东西...



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

    如果 DIVSEL 设置为值3、则意味着 SYSCLKOUT=CLKIN、在这种情况下、WDFLG 将在1ms 时间前被置位。 值3.7ms 针对 SYSCLKOUT=CLKIN/4 (DIVSEL = 0、缺省值)。 客户观察到的结果是可以的。 对吧?

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

    我与工程师进行了更多沟通、并回复了以下内容:
    --
    因此、如果 DIVSEL 默认值为0、采样通常为3.7ms; 假设 CPU 始终从引导 ROM 中的引导加载程序启动、如 图3上的文档" www.ti.com/.../sprugo0b.pdf"-如果是、DIVSEL 始终更改为3、我们看不到3.7ms 在哪里可以看到...;

    无论如何、似乎在代码开始时、DIVSEL 由引导 ROM 设置为3、然后 XRS 采样通常为925us;
    假设引导 ROM 需要几微秒的时间将 DIVSEL 从0更改为3、那么 XRS 引脚的采样在 XRS 变为低电平后大约为975us (假设恰好为1ms 进行简化) 用户可以在读取前等待1ms;

    (笑声) 那么、后续问题:
    当执行看门狗复位时,如果 XRS 引脚在 CPU 内部电路释放 XRS 引脚800us 后一直是逻辑“1”,WDFLAG 是否会在代码开始1ms 后读取它指示“0”或“1”?
    当执行上电复位时,如果 XRS 引脚在 CPU 内部电路释放 XRS 引脚800us 后始终为逻辑“1”,WDFLAG 是否会在代码开始1ms 后读出“0”或“1”?
    ----
    谢谢!
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chris:

    [引述]... 那么、后续问题:
    当执行看门狗复位时,如果 XRS 引脚在 CPU 内部电路释放 XRS 引脚800us 后一直是逻辑“1”,WDFLAG 是否会在代码开始1ms 后读取它指示“0”或“1”? [/报价]

    在这种情况下、WDFLAG 将设置为"1"。

    [引用]执行上电复位时,如果 XRS 引脚在 CPU 内部电路释放 XRS 引脚800us 后始终为逻辑“1”,WDFLAG 是否指示“0”或“1”(如果我在代码开始后1ms 读取它)? [/报价]

    在这种情况下、也可以将 WDFLAG 设置为"1"。   

    此致、

    Vivek Singh

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

    目前、我们的基本结论是、如果不对电路进行更改、他们无法真正解决他们想要避免的问题。

    因此、我认为他们需要依靠运气。 一些可能改进的解决方案可能无法向后兼容已在现场的装置、可能会有一些(可能太多...)的风险 要在工厂退回的零件。 :-)

    对于未来的设计、他们可能会考虑在 XRS 引脚上使用不同的电路拓扑。 欢迎您提出设计建议、以便充分利用 MCU 的全部潜能!

    我们一如既往地感谢您提出任何最终意见或指导。

    谢谢、
    Chris