一、窗口看门狗定时器介绍
看门狗定时器(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
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44501991/article/details/143692041
|