看门狗分两种
1.独立看门狗,IWDG
只是简单的设置一个数,然后递减,减到0之前,还没有喂狗,狗就死了,系统重启。
没有中断。只有自己代码里去喂狗。
频率是内部时钟40K,可以分频。
2.窗口看门狗,WWDG
频率是PLCK1 我这是36M最多8分频,然后呢除以4096,就是WWDG的时钟
有个2个值比较重要,
1.一个是窗口值,W,在这个值之前不能喂狗,喂了狗就撑死了,reset。
2.一个是临界值,0x3F到这个值还没喂狗,狗就饿死了,reset。
我也不知道为什么设置是0x3F,挺奇怪的,为什么不设0x00?
WWDG有一个中断函数HAL_WWDG_WakeupCallback,在倒计时到0x40的时候会掉这个,你得赶紧Refresh一下。
这些都是基本的,我搞的时候遇到2个问题:
1.
一个是Hal库版本的问题,HAL库升级到1.6版本后WWDG只有init函数,没有StartIT接口了,不知道是不是Bug,还是ST有新的用法,折腾我半天。后来我退回到1.4版本就OK了,但是新版本的Cube用就版本的HAL库竟然也有Bug,哎。无语。
2.
我自己项目需求是,板子USB通信,然后将内容与I2C进行读写,但是当接线不当的时候(比如没有接GND),I2C会挂掉,Systick不更新,然后就While死循环了,板子也就挂掉了,所以我就用了一个看门狗。
然后我发现就算这样也不行,好像USB的中断级别比WWDG高(在Cube里设的时候是一样都是0),USB当数据量大的时候,只用中断喂狗,来不及,所以特别容易死机。
后来我把窗口值设成126,每次刷新就刷到125,在我自己的逻辑代码里也增加了喂狗程序,然后就OK了。