stm32 看门狗

stm32 有两种看门狗,一种是独立的硬件看门狗,另一种是窗口看门狗

STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟并不是准确的40Khz,而是在30~60Khz之间变化的一个时钟,只是我们在估算的时候,以40Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

独立看门狗的配置是有一定顺序的,可以参考许多例程,配置起来也是很简单的,首先向IWDG_KR写入0X5555。通过这步,我们取消IWDG_PR和IWDG_RLR的写保护,使后面可以操作这两个寄存器。设置IWDG_PR(预分频值)和IWDG_RLR(重装载值)的值,通过这两个值的设置可以知道看门狗的喂狗时间,Tout=((4×2^prer) ×rlr) /40,其中Tout是看门狗溢出时间,单位是ms,prer是看门狗的预分频值,rlr是重装值,其中预分频值是0~7的值,重装值最大是0xfff。如果我们设置prer为4,rlr值为625,那么就可以得到Tout值为1000ms。其次是向IWDG_KR写入0XAAAA。通过这句,将使STM32重新加载IWDG_RLR的值到看门狗计数器里面。也可以用该命令来喂狗。最后是启动看门狗,向IWDG_KR写入0XCCCC。注意IWDG在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开IWDG,否则问题依旧,所以在这里提醒大家,如果不用IWDG的话,就不要去打开它,免得麻烦。代码应该是这样的:

void WatchDog_Init(u8 prer, u16 reld)
{
   IWDG->KR=0x5555; //允许访问PR和RLR寄存器
   IWDG->PR=prer;  //设置分频
   IWDG->RLR=rlr; //设定计数器初值
   IWDG->KR=0xaaaa; //初次装初值
   IWDG->KR=0xcccc;  //启动看门狗定时器
}

//喂狗
void WatchDog_Feed(void)
{
 IWDG->KR=0xaaaa;
}

这里独立看门狗的设置就完成了,在使用时,只要保证喂狗时间,就能够保证程序的顺利执行了。

个人问题汇总:

看似简单的配置,觉得看门狗也没有什么麻烦的,但是在用的时候总是无法顺利使用,第一是对看门狗理解不够透彻,第二是对自己不够信心,第三是试验手段太过欠缺,不能够验证自己代码的正确性,所以到头来一直没有成功的在自己的项目中运用独立看门狗,明天去一定的调试下,用之前写好的程序,烧写完毕后去掉JLINK测试,然后用示波器查看有没有电平变换,好了今天就写到这里了。

。。。。。。

经过一个上午的测试,发现并不是我看门狗配置的错误,而是本身看门狗的硬件存在问题,所以才会造成复位无法实现,通过示波器可以很好的看到由于看门狗产生的复位信号的下降沿尖端脉冲,但是由于下降的幅度不是太明显,所以造成无法复位,经过检查发现硬件的复位电路采用的是电阻为1K,电容为10uf的钽电容,电阻小,电容大造成复位时间长,因此看门狗无法复位,但是硬件看门狗能够顺利复位电路。随后将复位电路换成10K电阻,0.1uf的电容之后,看门狗能够很好的复位。由此可以看出

做硬件调试一定、一定要结合硬件检测仪器,示波器,万用表,逻辑分析仪。。。都是很好的工具,通过工具检测硬件与软件所出现的问题会更加只管,方便。



原文地址:https://www.cnblogs.com/longbiao831/p/4556277.html