1. 看门狗的概念
2. 独立看门狗
独立看门狗的原理:设定一个重载值。赋值计数器。每来一个脉冲计数值减减。如果计数值减到0。还没有去喂狗就会产生复位。所以在计数值在0~重载值范围必须要喂一次狗。
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。
3. 窗口看门狗
窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。
之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。
窗口看门狗是在一个窗口内去喂狗。提前喂狗是无效的。
1. WWDG特征
可编程的自由运行递减计数器
复位条件
- 当递减计数器值小于 0x40 时复位(如果看门狗已激活) 注:0x40根据芯片会有所不同
- 在窗口之外重载递减计数器时复位(如果看门狗已激活)
提前唤醒中断 (EWI) :当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活)
2. WWDG功能
T[6:0] 就是 WWDG_CR 的低七位, W[6:0] 即是 WWDG->CFR 的低七位。 T[6:0]就是窗口看门狗的计数器,而 W[6:0](由用户定义) 则是窗口看门狗的上窗口,下窗口值是固定的( 0X40 )。 当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。
STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:
当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。
当计数器的数值从0x40减到0x3F时【T6位跳变到0】
如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。
4. 独立看门狗与窗口看门狗的比较
5. 独立看门狗寄存器介绍
1. 控制寄存器(FWDGT_CTL)
2. 预分频寄存器(FWDGT_PSC)
设置时钟分频
3. 重装载寄存器(FWDGT_RLD)
只用了2的12次方这个寄存器的值不能大于2的12次方
4. 状态寄存器(FWDGT_STAT)
6. 代码实现
WDG.h
#ifndef _WDG_H
#define _WDG_H
#include "gd32f10x.h"
void fwdg_init(void); //初始化独立看门狗
void fwdg_reload(void); //独立看门狗的喂狗函数
#endif
WDG.c
#include "WDG.h"
//初始化独立看门狗
void fwdg_init(void){
//开启时钟源(IRC40K),并等待其稳定以供看门狗使用
rcu_osci_on(RCU_IRC40K); //开启IRC40k 默认就是 IRC40k的时钟
while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)); //等待IRC40k稳定下来
fwdgt_write_enable();
/* 参数1:重载值 参数2:预分频值 */
/* (40K/64)*1000 = 1.625s 如果在1.625内没有喂狗就会复位 */
/* 喂狗后就会把重载值重新给计数值又会获得1.625s */
fwdgt_config(1000, FWDGT_PSC_DIV64);
fwdgt_write_disable();
fwdgt_enable(); //使能看门狗
}
//独立看门狗的喂狗函数
void fwdg_reload(void){
fwdgt_write_enable();
fwdgt_counter_reload(); /* 喂狗 */
}
main.c
#include "gd32f10x_eval.h"
#include <stdio.h>
#include "WDG.h"
int main(){
gd_eval_com_init(EVAL_COM0);
printf("This is a FWDGT DEMO test.\r\n");
// 对独立看门狗进行初始化
fwdg_init();
while(1){
fwdg_reload(); /* 喂狗 */
}
}