GD32F103-窗口看门狗定时器(WWDGT)

一、窗口看门狗定时器介绍

看门狗定时器(WDGT)有两个:

1、独立看门狗定时器(FWDGT)GD32F103 独立看门狗定时器(FWDGT)学习-CSDN博客

2、窗口看门狗定时器(WWDGT)(这篇介绍的是这个)

1.1、简介

窗口看门狗定时器(WWDGT)是用来监测由软件故障导致的系统故障。窗口看门狗定时器相对于独立看门狗定时器,它的精度更高,窗口看门狗开启后,7为向下递减计数器值逐渐减小。计数值达到0x3F是会产生复位(CNT[6]位被清0)。在计数器计数值达到窗口寄存器之前,计数器的更新也会产生系统复位。因此软件需要再给定的区间内更新计数值。串口看门狗定时器在计数值达到0x40,会产生一个提前唤醒标志,如果使能中断将会产生提前唤醒中断。

窗口看门狗定时器时钟是由APB1是中国预分频而来。窗口看懵够定时器适用于需要精确计时的场合。

1.2、主要特征

1.可编程的7位只有运行向下递减计数器。

2.当串口看门狗使能后,有以下两种情况会产生复位:

当计数器达到0x3F时产生复位;

当计数器的值大于窗口寄存器的值是,更新计数器会产生复位。

3.提前唤醒中断(EWI):看门狗定时器打开,中断使能,计数值达到0x40是会产生中断。

4.可以配置窗口看门狗定时器在调试模式下选择停止还是继续工作。

1.3、功能说明

如果窗口看门狗定时器使能(将WWDGT_CTL寄存器的WDGTEN位置1),计数值达到0x3F的时候产生系统复位(CNT[6]位被清0)或是在计数值达到窗口寄存器值之前,更新计数器也会产生系统复位。

上电复位之后窗口看门狗定时器总是关闭的。软件可以向WWDGT_CTL的WDGTEN写1开启窗口看门狗定时器。窗口看门狗定时器。窗口看门狗定时器。窗口看门狗定时器打开后,计数器始终递减计数,计数器配置的值应该大于0x3F,也就是说CNT[6]位应该被置1。 CNT[5:0]决定了两次从装载之间的最大间隔时间。计数器的递减速度取决于APB1时钟和预分频器(WWDGT_CFG寄存器的PSC[1:0]位)。

配置寄存器(WWDGT_CFG)中的WIN[6:0]位用来设定窗口值。当计数器的值小于窗口值,且大于0x3F的时候,重装载向下计数器可以避免复位,否则在其他时候进行重加载就会引起复位。

对WWDGT_CFG寄存器的EWIE位置1可以使能提前唤醒中断(EWI),当计数值达到0x40的时候该中断产生。同时可以用响应的中断服务程序(ISR)来触发特定的行为(例如通信或数据记录),来分析软件故障的原因以及在器件复位的时候挽救重要数据。此外,在ISR中软件可以重装载计数器来管理软件系统检查等。在这种情况下,窗口看门狗定时器将永远不会复位但是可以用于其他地方。通过将WWDGT_STAT寄存器的EWIF位写0可以清除EWI中断。

窗口看门狗定时器时序图介绍:

0x7F:这个是窗口定时器的预设值

WIN:也叫窗口上限,如果CNT>WIN时喂狗会复位(用户可以设置)

0x3F:这个是窗口下限,如果CNT=0x3F就会造成复位(用户不能设置)

也就是用户必须在0x3F到WIN这个区间喂狗才不会造成复位

窗口看门狗定时器超时的计算公式如下:

二、寄存器介绍

WWDGT基地址:0x4000 2C00

2.1、控制寄存器(WWDGT_CTL)

2.2、配置寄存器(WWDGT_CFG)

2.3、状态寄存器(WWDGT_STAT)

三、函数介绍

这里我把可以用到函数全部贴出来,方便查询,如果要使用某个函数,传参可以查看"GD32F10x_固件库使用指南",也可以在调用的时候,查看函数介绍。

四、函数实现

4.1、WWDGT_Init初始化

void WWDGT_Init(void)
{
    rcu_periph_clock_enable(RCU_WWDGT);//使能WWDGT外设时钟
    /************************************************************************************
    设置"窗口看门狗定时器"计数器初始值为127,窗口值为80,预分频器值为8
    由于我的程序PCLK1=36MHz 所以 窗口定时器时钟频率=36MHz/4096/8=1098.63Hz
    单一脉冲时间=1S/1098.63Hz=910.22uS
    窗口看门狗定时器时间=(127-80)*910.22=42.78ms(这里不是和表13-2的最大和最小时间不同,因为我这里使用的时钟频率是36MHz)
    ************************************************************************************/
    wwdgt_config(127,80,WWDGT_CFG_PSC_DIV8);
    wwdgt_enable();//使能窗口看门狗
    
    wwdgt_flag_clear();//清除提前唤醒中断标志
    wwdgt_interrupt_enable();//开启窗口看门狗中断
    
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
    nvic_irq_enable(WWDGT_IRQn,2,0);
}

4.2、WWDGT中断响应函数

void WWDGT_IRQHandler(void)
{
    printf("Reset\n\r");//打印重启标志
    wwdgt_flag_clear();//清除中断标志
}

4.3、主程序初始化

从程序中看出,每43ms我们喂一次狗,然后通过cnt变量喂狗5次后,会超时未喂狗,导致系统重启,我们重启前会进入中断,打印重启,这样看,可以得出我们程序在重启之前可以进行一些列重要操作。

int main(void)
{
    int cnt=1;
    SystemClock_Config();//系统时钟配置
    systick_config();//systick配置
    delay_ms(100);
    WWDGT_Init();//窗口看门狗初始化
    USART_init(115200);//USART2初始化
    printf("start\r\n");
        
    while(1)
    {
        delay_ms(43);
        wwdgt_counter_update(127);//喂狗
        if(cnt++ % 20==0)//43*20=860ms,每860ms打印一次数据,表示程序在运行
        {
            printf("cnt=%d\r\n",cnt/20);
            if(cnt/20>=5)
            {
                delay_ms(50);
            }
        }
    }

    return 0;
}

五、结果

start,表示程序初始化完成

reset,表示重启

cnt=,表示程序运行中

此篇文章大部分都是摘抄的“GD32F10X用户手册”

参考:https://blog.51cto.com/bruceou/5646569

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值