STM8s窗口看门狗

  看看窗口看门狗的框图

从图里看出产生复位信号有2个方式:

1 WDGCR寄存器的T6 由1变0,也就是从此寄存器的值从0x40变成0x3F会产生复位信号;

2 当寄存器WDGCR的值大于WDGWR的时候写WDGCR寄存器会产生复位信号;

解释:

  WDGCR的最高位WDGA是开启看门狗的(WDGA=1开启),当然如果开启了硬件看门狗这个位就没用了。硬件看门狗在OPTION BYTES里设置。

WDGCR的低六位是计数用的从图里可以得出这个计数器的时钟是fCPU时钟分频得来的。这个分频值固定是12288,根据这个可以计算看门狗的延时时间。

WDGWR是窗口寄存器,最高位保留,低六位保存的是窗口值,从图里的逻辑图发现comparator=1 when T6:0>W6:0,意思是当WDGCR计数值大于WDGCR

且此时Write WDGCR(这个意思是软件刷新计数器的值)就会产生一个复位信号复位stm8s。当然我们不想这个事情发送。所以在写程序的时候不能在计时器的值

大于窗口寄存器设定值的时候刷新计数器的值。所以在设定这个窗口寄存器数值的时候只能设定在0x7f~0xC0之间。

程序:

  知道窗口电子狗怎么工作那么编程就好说了,三件事:

1  设定窗口寄存器值,开启看门狗(WDGA=1),这是初始化看门狗

2  判断看门狗计数值是否小于窗口值,是就喂狗

代码如下:

  用stm8s的官方库。

  WWDG_Init(0x7f, 0x50);  //初始化

  CounterValue = (u8)WWDG->CR & 0x7F;
  if(CounterValue < WINDOW){
    WWDG_SetCounter(COUNTERINIT); //喂狗
  }

解释一下WWDG_Init这个函数体的内容是:

void WWDG_Init(uint8_t Counter, uint8_t WindowValue)
{
/* Check the parameters */
  assert_param(IS_WWDG_WINDOWLIMITVALUE_OK(WindowValue));

  WWDG->WR = WWDG_WR_RESET_VALUE;
  WWDG->CR = (uint8_t)((uint8_t)(WWDG_CR_WDGA | WWDG_CR_T6) | (uint8_t)Counter);
  WWDG->WR = (uint8_t)((uint8_t)(~WWDG_CR_WDGA) & (uint8_t)(WWDG_CR_T6 | WindowValue));
}

WWDG_SetCounter的源码是:

void WWDG_SetCounter(uint8_t Counter)
{

  /* Check the parameters */
  assert_param(IS_WWDG_COUNTERVALUE_OK(Counter));

  /* Write to T[6:0] bits to configure the counter value, no need to do
  a read-modify-write; writing a 0 to WDGA bit does nothing */
  WWDG->CR = (uint8_t)(Counter & (uint8_t)BIT_MASK);

}

assert_param是参数检查,其他没啥好说的。搞清楚寄存器作用就行了。其他问题暂时想不起来。哦,对了延时时间看下图:

这里说得比较清楚如果stm8用的是内部HSI 16M晶振切fCPU的分频也是0那么窗口看门狗的时钟频率就是fCPU/12288,那么一个计时周期就是12288/fCPU就是0.768ms

如果设定的窗口值是0x50,那么从0x7F数下来一算就知道了。0.768*(0x7f-0x50)。要注意这里fCPU不一定是16m(CPUDIV分频系数可以改变),如果要搞清楚stm8的时钟频率看下面这个图。这里就不做详细讨论了,以后在说。

这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责
原文地址:https://www.cnblogs.com/ashitaka/p/4242498.html