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.

[参考译文] TM4C1294NCPDT:看门狗 WDTLOAD 在递减计数时失败

Guru**** 2538955 points
Other Parts Discussed in Thread: TM4C1294KCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C1294KCPDT

您好!

我已从迁移的 Stellaris 代码中启用了看门狗计时器0、但 TM4C1294看门狗计时器0有问题。 对于一个写入低于当前倒计数的 WDTLOAD 值的写入、将被忽略。 Tivaware 使用=将值写入 WDTLOAD 寄存器值、因此> 当前 WDLOAD 的值会在解锁条件下被忽略。 更改 Tiva 函数 WDTLOAD WRITE |=允许一个更大的超时值来更新递减计数中的看门狗0。 但是、较低 WDTLOAD 值的写入仍将被忽略。 这是勘误条件 、因为没有影子更新功能并且清零 WDTLOAD 0x0会触发立即中断。

除非在解锁的寄存器写入事件之后使用 CCS 调试检查 WDTLOAD 寄存器是否发生了变化、否则您永远不会知道它是否发生了变化、并且您的硬件将不会受到保护  

示例:将 WDTLOAD 值从微秒超时更改为几秒除非 您运行下面的代码 snip、否则永远不能将其改回较低的值。 此帖子通知 TM4C1294看门狗计时器0具有其他未记录的勘误表。 当 Tivaware 更新通过|=语法写入 WDTLOAD 寄存器时、下面的代码可以处理2个定义的 WDTLOAD 时间、以便在 WDTLOAD 被设置为更大值时在这两个时间之间切换或减少超时。

      /* Unlock the Watchdodgs registers for write access */
      HWREG(WATCHDOG0_BASE + WDT_O_LOCK) = WDT_LOCK_UNLOCK;
      /* Time writes to WDTLOAD occurs below current down count value */ 
      while(HWREG(WATCHDOG0_BASE + WDT_O_VALUE) >= WATCHDOG0_HI_RELOAD_VALUE)
      {
          /* Reset Watchdog-0 for lower WDTLOAD write values */
          HWREG(WATCHDOG0_BASE + WDT_O_LOAD) = WATCHDOG0_MED_RELOAD_VALUE;
          /* Check ok to lock the WDog0 registers */
          if(HWREG(WATCHDOG0_BASE + WDT_O_LOAD) <= WATCHDOG0_MED_RELOAD_VALUE)
          {
              /* Lock the Watchdodg registers blocking write access. */
              HWREG(WATCHDOG0_BASE + WDT_O_LOCK) = WDT_LOCK_LOCKED;

              break;
          }
       }

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

    您好、GL、

    [引用 userid="48581" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts ]Tivaware 使用=将值写入 WDTLOAD 寄存器值、以便在 解锁条件下忽略当前 WDLOAD 的值。

    我认为您会混淆|=和= C 代码的语法。

    使用=语法设置寄存器会覆盖整个寄存器内容、而不会考虑当时寄存器内部的内容。

    根据您的建议使用|=设置寄存器将保留当前位设置为"1"、同时向寄存器写入任何新的"1"位。 这将导致新的加载值是用户无法预测的新值和电流值的按位组合。 我不明白为什么你会提出这个想法。

    [引用 userid="48581" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts ]\n 此帖子通知 TM4C1294看门狗计时器0还有其他未记录的勘误表。 下面的代码可以处理 2个定义的 WDTLOAD 时间、以便在 Tivaware 更新通过|=语法写入 WDTLOAD 寄存器后将 WDTLOAD 设置为更大的值时切换或减少超时。[/引用]

    您能否共享整个看门狗更新过程? 我无法重新创建此问题。 我将看门狗设置为5秒长、一直等到看门狗值为4秒、然后刚刚使用 看门狗 ReloadSet 将其设置为1秒、它更新并以1秒的间隔进入看门狗 ISR、没有问题。

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    [引用 userid="189615" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4489184 #4489184"]使用=设置寄存器语法会覆盖整个寄存器内容,而不会考虑当时寄存器内部的内容。

    仍然是 C 语言代码必须轮询 VDLOAD 值、以了解何时可以加载较低的 WDLOAD 值。 如果 WDLOAD 值被设定为低于当前递减计数、则用于设定看门狗 WDLOAD 寄存器的 Tivaware 调用不起作用、= WRITE 被忽略。 WDLOAD 寄存器似乎打算随时由 SW 调用重新加载、未提及加载值递减计数时间限制。 未记录的行为会导致工程师 相信、无论当前 WDVAUE 计数如何、都可以随时更改 WDLOAD 寄存器。  

    因此、|=是在不轮询 WDVAUE 寄存器的情况下向任何 WDLOAD 计数添加更多(二进制)时间的唯一方法、实际上低于请求的新计数或减少的计数。 这=仅在 POR (0x0)上的初始 WDLOAD 值或没有改变时才起作用。  由于计时器从不会在计数0上重新加载已更改的值、否则它会中断 MCU 上的复位。 WDLOAD 寄存器一旦该值被置位、就不能轻易地通过调用 SW 函数中的 Tivaware 来减少该值。 CCS 调试表明、一旦时间增加到6秒、定时器就会忽略一个低得多的=值(333µs)。 代码将新的较低 WDLOAD 值乘以当前的减计数 WDVAUE 并将其推入当前减计数。   

    在对时间敏感的函数中使用代码 snip while 循环并不是一个好主意。 代码 snip 只能在退出非 ISR 可重入函数或调用复位 WDLOAD 寄存器之前使用、因为它不可预测、否则可能会锁定计时器。 通过|=在 ISR 循环中工作、向 WDLOAD 二进制值添加更多时间、=不会!

    /*解锁看门狗寄存器以进行写入访问*/
    HWREG (WATCHDOG0_BASE + WDT_O_LOCK)= WDT_LOCK_UNLOCK;

    //设置200ms 超时,一旦设置,就无法轻松地减少
    HWREG (WATCHDOG0_BASE + WDT_O_LOAD)= WATCHDOG0_MED_RELOAD_VALUE;   

    /*锁定看门狗寄存器以阻止写入访问。  *
    HWREG (WATCHDOG0_BASE + WDT_O_LOCK)= WDT_LOCK_LOCKED;

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

    您好、GL、

    [引用 userid="48581" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4490403 #4490403]Point 仍是 C 代码必须轮询 VDLOAD 值才能知道何时可以加载较低的 WDLOAD 值。 如果 WDLOAD 值被设定为低于当前递减计数、则用于设定看门狗 WDLOAD 寄存器的 Tivaware 调用不起作用、= WRITE 被忽略。[/引用]

    正如我在上一篇文章中所说的、我无法再现这一观察结果。 我创建了一个旨在降低 WDLOAD 值的示例、它工作正常。

    提供完整的看门狗实施、我可以尝试使用您的特定代码重新创建看门狗、或者确定导致问题的原因并提供解决方案。

    这里没有"未记录的勘误表"。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="189615" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4490455 #4490455"]正如我在上一篇文章中所说的,我无法重新创建此观察结果

    我只能说调试仿真器寄存器没有刷新、更新了6秒超时时间、通过使用=写入 WDLOAD 寄存器时的语法、降至333us。

    它甚至无法将6秒超时重新加载到500ms。 一旦将超时设置为6秒、定时器就会在没有 while 代码 snip 的情况下拒绝读取 WDLAOD 寄存器333us、甚至拒绝读取200ms。 while 循环中的计时器具有静态函数、能够在命令上的2个加载值之间切换、观察 WDLOAD 调试寄存器。

    为什么定时器配置与加载 WDLOAD 寄存器有任何关系?

    唯一的其他设置更改是 SYSCTRL 复位行为寄存器并配置看门狗计时器1、禁用 INT。

    我可以告诉您设置代码吗?   

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

    您好、GL、

    [引用 userid="48581" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4490546 #4490546"]我只能说调试仿真器寄存器未刷新、更新后的6秒超时缩短到333us、方法是使用=写入 WDLOAD 寄存器时的语法。

    我没有查看调试寄存器、而是根据使用的重新加载值、通过 LED 闪烁频率观察电路板行为。 我可以尝试查看是否可以在调试中重新创建刷新问题、但这不是 MCU 问题、而是 IDE 问题。 MCU 显然正在获得新值、而计时器也在相应地运行。

    [引用 userid="48581" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4490546 #4490546]为什么计时器配置与加载 WDLOAD 寄存器有关?

    我汇总的示例不使用任何锁定/解锁功能、了解如何使用具有这些功能的 WDT 可以为我提供更多的测试和验证元素。

    [引用 userid="48581" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4490546 #4490546]是否可以为您提供设置代码?   [/报价]

    当然。

    此致、

    Ralph Jacobi

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

     我将重新检查您提到的内容、尽管此问题也发生在 TM4C1294KCPDT 上、且 B2B 写入 WD1和 ISR 已禁用。 尽管 ISR 函数处理、但这两个安全带都将添加到 PM 中。

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

    您好、GL、

    我在查看您发送的内容后的第一个问题是看门狗0初始设置为什么、以及您尝试更新它的目标是什么?

    我看到 看门狗0的 WatchdogReloadSet 已注释、但它用于  WATCHDOG0_MED_RELOAD_VALUE。 我希望看到 WATCHDOG0_HI_RELOAD_VALUE 的一个?

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="189615" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4490841 #4490841"]因此,我在查看您发送的内容后的初始问题是看门狗0最初设置的内容

    在另一个函数中设置为125m 以下、并通过 while 环路、在本例中通过 GUI 选择来向下移动 WDLOAD 值。 另一个函数中也设置了1秒(snip)的高值、该函数具有 while 循环复位回125ms 的时间。 我在调试中重新测试了调用、请注意、我修改了以下>=下的 while 循环、使其小于<=。 您可能会遇到与锁定有关的问题、或类似的问题、因为在第二个时钟域中的 B2B 写入必须轮询 WD1位以了解写入 WD1寄存器的安全时间。

    //*****************************************************************************
    //
    //! The watchdog timer reload value. 120Mhz/3k:333us,
    //! 120/10:100ms 120/8:125ms /5:200ms, "/2:500ms
    //! SYSCLK/1164=859us
    //
    //*****************************************************************************
    #define WATCHDOG0_LOW_RELOAD_VALUE            (g_ui32SysClock / 8) //125ms
    
    #define WATCHDOG0_MED_RELOAD_VALUE            (g_ui32SysClock / 5) //200ms
    
    #define WATCHDOG0_HI_RELOAD_VALUE             (g_ui32SysClock * 1) //1sec
    
    //*****************************************************************************
    
            /* Set the WDOG0 registers for write access */
            HWREG(WATCHDOG0_BASE + WDT_O_LOCK) = WDT_LOCK_UNLOCK;
            /* Time WDLOAD occurs below current value of the down count */
            while(HWREG(WATCHDOG0_BASE + WDT_O_VALUE) >= WATCHDOG0_LOW_RELOAD_VALUE)//125ms
            {
                /* Reset the Watchdog 125ms for precharge PWM ISR events */
                HWREG(WATCHDOG0_BASE + WDT_O_LOAD) = WATCHDOG0_LOW_RELOAD_VALUE;
                /* Check ok to lock the WDog0 registers */
                if(HWREG(WATCHDOG0_BASE + WDT_O_LOAD) <= WATCHDOG0_LOW_RELOAD_VALUE)
                {
                  /* Lock the Watchdog registers blocking write access. */
                  HWREG(WATCHDOG0_BASE + WDT_O_LOCK) = WDT_LOCK_LOCKED;
    
                  break;
                }
             }
             
         
             /* Unlock the Watchdodgs registers for write access */
             HWREG(WATCHDOG0_BASE + WDT_O_LOCK) = WDT_LOCK_UNLOCK;
            // Set watchdog 1 second for a slower motor startup sequence
            HWREG(WATCHDOG0_BASE + WDT_O_LOAD) = WATCHDOG0_HI_RELOAD_VALUE;
            /* Lock the Watchdodg registers blocking write access. */
            HWREG(WATCHDOG0_BASE + WDT_O_LOCK) = WDT_LOCK_LOCKED;

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

    您好、GL、

    使用您的整个看门狗配置、只要定时器被首先解锁、我就能够成功地将较低的负载值写入看门狗定时器。 我使用 了 MAP_WatchdogUnlock、然后立即执行 了 MAP_WatchdogReloadSet、没有任何问题。 也许在特定的优化级别、您需要更多几个延迟周期、但对我来说、顺序使用这两个周期可以将较高的加载值设置为较低的加载值。 在本例中、我从5秒看门狗转到1秒看门狗。

    因此、您的设置似乎很好、我认为您需要准确调试您尝试更改加载值的方式和时间、并确保这些更改在您的系统中正确应用。

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    [引用 userid="189615" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1190795/tm4c1294ncpdt-watchdog-wdtload-fails-in-down-counts/4493033 #4493033"]使用整个看门狗配置,只要先解锁看门狗计时器,我就能够成功地将较低的加载值写入看门狗计时器。

    然而、我的应用在333us ADC ISR 函数期间重新加载计时器125ms、并且在另一个 GPTM 计时器 ISR 中再次写入 WDLOAD 寄存器。 即使在寄存器0和速度1极低的优化条件下、在两个 ISR 事件期间执行 B2B 写入 WDLOAD 寄存器也会即时出现翻转斩波加载值问题。

    发布此帖子后、我立即做出了折衷并停止了翻转时间值。 然而、即使静态调用 WDLOAD 也不会在它被设置1秒后写入更低的125ms。 这是因为 ADC ISR 在空闲模式下仍在运行、从而使爪形离合器333us 间隔保持不变。 同样、B2B 在 ISR 事件期间写入 WDLOAD 似乎会阻止应用程序写入较低的值、而我的 while 环路修补程序在空闲模式下不会被应用。