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.

[参考译文] TM4C1294KCPDT:看门狗0循环写入

Guru**** 2480775 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/700340/tm4c1294kcpdt-watchdog-0-cyclic-writes

器件型号:TM4C1294KCPDT

对于      在1毫秒内处理的开关情况、在信号量中断重新加载上下文中、循环写入 WDTLOAD REG-1失败  。 否则 、WDTLOAD 在 没有开关情况调用的情况下在同一个1毫秒信标中断中成功。

 然后、看门狗 WDTLOAD 值(333ms) 错误 地超时 超过 开关情况1 UserParameter.Count 、但仅在 精确循环1毫秒周期的信标中断期间。 将 UseParameter.Count 值设置为高于 WDTLOAD 值333ms 、 并且当它应该在    信标1ms 中断中处理的循环1ms 周期(情况1:)内重新加载时、狗超时。

换句话说,这只狗在  这种情况下似乎已经死了,拒绝吃他的食物。

switch (Newcase)
{
情况0;
{

/*在毫秒上下文中处理的各种 C 代码
PWM0 GEN0软件中断*/

/*加载用户毫秒计数值*/
计数= UserParameter.Count;

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

}

案例1:
{

/* Wdog0持续1ms 的用户保持计数 x 120k。
*注意:count 应该默认为毫秒、但不是*/
HWREG (WATCHDOG0_BASE + WDT_O_LOAD)=(计数* 120000);

/*在毫秒上下文中处理的各种 C 代码
PWM0第1代软件中断*/

/*启用 PWM 选择(启用)引脚多路复用器输出、用于门控 PWM。 *
HWREG (PWM0_BASE + PWM_O_ENABLE)||(ulPWMOutBits & 0x3F);

计数--;

如果(计数= 0)
{
Newcase = 2;

计数= UserParameter.Count;

/*锁定观察数其他寄存器以阻止写入访问。 *
HWREG (WATCHDOG0_BASE + WDT_O_LOCK)= WDT_LOCK_LOCKED;

中断;
}
//break;将1ms SW 信标中断加倍至情况1
}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BP101:
    我不清楚您的代码。 Switch 语句在何处实现? 开关是 PWM0 ISR 的一部分吗?

    请注意访问 WD Timer1时寄存器访问时序、如以下摘录中所述。

    寄存器访问时序
    由于看门狗定时器1模块有一个独立的时钟域、所以它的寄存器必须是
    写入两次访问之间的时间差。 软件必须保证这个延迟被插入
    之间的差异、或者在对 WDT1寄存器的连续写入之间或在对寄存器进行写操作之后进行读操作之间。
    从 WDT1模块进行背靠背读操作的时序没有限制。 中的 WRC 位
    WDT1的看门狗控制(WDTCTL)寄存器表示所需的时间差已经过去。
    写操作时该位清零、写操作完成后置位、向软件指示该位
    可以安全地开始另一个写入或读取操作。 在之前、软件应该查询 WDTCTL 寄存器中的 WRC=1
    访问另一个寄存器。 请注意,WDT0没有此限制,因为它在系统之外运行
    时钟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    [引用用户="Charles Tsaa"]是 PWM0 ISR 的开关部分

    不完全正确- 而 是零 中断触发与 PWM 频率相关的精确1ms 间隔的软件中断。 已通过 GPIO 端口和从 该信标上下文以1ms 间隔加载的开关情况进行确认。  该开关情况 会针对 用户参数计数值多次触发 PWMENABLE 寄存器、以毫秒为单位。 示波  器捕获的 PWMENABLE 输出波形比用户计数参数长一点、大约长50ms。

    [引用用户="Charles Tsaaaa">访问 WD 定时器1时、请注意以下摘录中所述的寄存器访问时序。
    [/报价]

    我们仅 加载 WatchDog0。

    情况 1似乎没有从底部下降、 在情况1中添加第二次中断没有任何影响。  当用户计数 高于 WDTLOAD 值时、无论 WDTLOAD 值何时重新加载333ms 计数 为1ms、Wdog0中断都会触发。 这可以防止狗在 PWMENABEL 点火前在案例1中喂食、从而避免狗超时。

     

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

    您好 BP101:

    什么是零中断? 哪个模块产生零中断?

    在您的原始帖子中、您说"对 WDTLOAD REG-1的循环写入在信标中失败..." 这就是我认为你所说的 WD 计时器1、而不是 WD 计时器0。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PWM0 Gen0产生负载计数零 INT、Gen1 INT 是每1ms 在 INT 零上下文中触发的 SW 信标 INT。

    WDTLOAD 值似乎只加载一次、即使用勺子通过 HWREG 直接加载(在情况1中)也是如此。 这是在零时解锁狗、在发生1次中断时再次锁定狗。 调用一个堆栈函数以每1ms 重新加载 WDog0加载值的关系。 每次情况1的1ms 间隔、而不是300ms、输出 PWMENABLE 寄存器所需的时间应小于100us。

    奇怪的是、添加第二个中断(情况1)将 PWMENABLE 函数的调用延长了几个100ms、比用户计数参数设置长。 用户输入的递减计数应发生在案例1内 SW 驱动1ms INT 的 PWM0 GEN0零 INT 上下文中、从案例1的角度回顾 NVIC 优先级链。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    加载 WDTLOAD (1200000 * 8.33333333ns SYSCLK)或10ms 超时的结果;WDog0在第一个1ms 间隔内超时。

    不必将参数用户计数乘以120k (上面的代码)。 这样做会使狗超时周期为几百毫秒、而不是 PWNENABLE 需要200us 的保护间隔(案例1)。 仅当周期在情况1的1ms 间隔内超过200us 时、狗狗才应进行倒刺。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    数据表与 WDTLOAD 寄存器的写入方式/时间存在矛盾 、因此重新启动计时器计数会留下一个关键的 tidbit。 然后、当  INTEN 位被设置 为打孔时、WDog0如何工作、狗并未首先清除 INTEN 位。 这似乎解释   了为什么在狗保护的环路 时间要短得多时、需要设置如此高的计时器值。   

    14.2功能说明
    如果在看门狗定时器计数器计数时 WDTLOAD 被写入一个新值、那么
    计数器加载新值并继续计数。

    (三

    看门狗中断使能
    INTEN 值如下定义:

    值描述

    0 中断事件被禁用。 一旦该位被置位、它只能是
     由硬件复位或由发起的软件复位清除
     将看门狗定时器软件复位(SRWD)寄存器中相应的位置位。  

    1 中断事件被使能。
     启用后、所有写入将被忽略。
     将该位置位将启用看门狗定时器。