GD32F103VE窗口看门狗定时器

GD32F103VE窗口看门狗定时器

看门狗定时器(WDGT)有两个:
1,独立看门狗定时器(FWDGT)
2,窗口看门狗定时器(WWDGT)

窗口看门狗定时器开启后,其7位向下递减计数器工作。
当"向下递减计数器"的计数值达到"预设的窗口值"时,会命令CPU复位;
为了不让窗口看门狗定时器产生复位CPU信号,必须按时设置"窗口看门狗定时器"计数器初始值,避免其引起CPU复位。

#include "WWDGT.h"
#include "stdio.h" //使能sprintf(),printf()

/*
看门狗定时器(WDGT)有两个:
1,独立看门狗定时器(FWDGT)
2,窗口看门狗定时器(WWDGT)

窗口看门狗定时器开启后,其7位向下递减计数器工作。
当"向下递减计数器"的计数值达到"预设的窗口值"时,会命令CPU复位;
为了不让窗口看门狗定时器产生复位CPU信号,必须按时设置"窗口看门狗定时器"计数器初始值,避免其引起CPU复位。
*/

void WWDGT_Init(void);
void Check_WWDGT_Reset(void);
void MySysRstSrcRecord(void);

//函数功能:配置"窗口看门狗定时器",更新"计数器初始值"的时间t满足,28.5ms<t<38.8ms
void WWDGT_Init(void)
{
	rcu_periph_clock_enable(RCU_WWDGT);//使能RCU_WWDGT外设时钟,enable WWDGT clock

	wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV8);
	//设置"窗口看门狗定时器"计数器初始值为127,预设的窗口值为80,预分频器值为8
	//因为:CK_SYS经过AHB和APB1预分频器得到PCLK1,PCLK1最大为54MHz,PCLK1/4096为"窗口看门狗定时器"的预分频器输入时钟
	//所以"窗口看门狗定时器"时钟 = (PCLK1/4096)/8
	//假定PCLK1=54MHz,则"窗口看门狗定时器"时钟 = (54/4096)/8= 1648MHz,即单一脉冲时间为606.8us
	//refresh window is: ~606.8 * (127-80)= 28.5ms < refresh window < ~606.8 * (127-63) =38.8ms.
	//如果想再次设置"窗口看门狗定时器"的计数器初始值,则时间t满足,28.5ms<t<38.8ms

	wwdgt_enable();
	//wwdgt_counter_update(127);//喂狗,update WWDGT counte
}

//函数功能:检查"窗口看门狗定时器"是否复位
void Check_WWDGT_Reset(void)
{
	if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST))
	{//读取"窗口看门狗定时器复位标志"
		rcu_all_reset_flag_clear();//清除CPU的"所有复位标志位"
		printf("\r\nWWDG reset!");
	}
}

/*
RCU_FLAG_IRC8MSTB:内部部8MHz时钟源稳定标志,IRC8M stabilization flag
RCU_FLAG_HXTALSTB:外部4~16MHz时钟源稳定标志,HXTAL stabilization flag
RCU_FLAG_PLLSTB:PLL时钟稳定标志,PLL stabilization flag
//RCU_FLAG_PLL1STB:PLL1时钟稳定标志,PLL1 stabilization flag(CL series only)
//RCU_FLAG_PLL2STB:PLL2时钟稳定标志,PLL2 stabilization flag(CL series only)
RCU_FLAG_LXTALSTB:外部32.768KHz的时钟源稳定标志,LXTAL stabilization flag
RCU_FLAG_IRC40KSTB:内部RC的40KHz时钟源稳定标志,IRC40K stabilization flag
RCU_FLAG_EPRST:外部引脚复位标志,external PIN reset flag
RCU_FLAG_PORRST:电源复位标志,power reset flag
RCU_FLAG_SWRST:软件复位标志,software reset flag
RCU_FLAG_FWDGTRST:独立看门狗定时器复位标志,free watchdog timer reset flag
RCU_FLAG_WWDGTRST:窗口看门狗定时器复位标志,window watchdog timer reset flag
RCU_FLAG_LPRST:低功耗复位标志,深度睡眠/待机复位发生时由硬件置位,low-power reset flag
*/
u8 MyReset_Buffer[11];
//函数功能:打印CPU复位原因
void MySysRstSrcRecord(void)
{
	u8 i;

	for(i=0;i<11;i++) MyReset_Buffer[i]=0;//清除

	MyReset_Buffer[0] = rcu_flag_get(RCU_FLAG_IRC8MSTB);//读取"内部部8MHz时钟源稳定标志"
  MyReset_Buffer[1] = rcu_flag_get(RCU_FLAG_HXTALSTB);//读取"外部4~16MHz时钟源稳定标志"
  MyReset_Buffer[2] = rcu_flag_get(RCU_FLAG_PLLSTB);  //读取"PLL时钟稳定标志"
  MyReset_Buffer[3] = rcu_flag_get(RCU_FLAG_LXTALSTB);//读取"外部32.768KHz的时钟源稳定标志"
	MyReset_Buffer[4] = rcu_flag_get(RCU_FLAG_IRC40KSTB);//读取"内部RC的40KHz时钟源稳定标志"

  MyReset_Buffer[5] = rcu_flag_get(RCU_FLAG_EPRST);    //读取"外部引脚复位标志"
	MyReset_Buffer[6] = rcu_flag_get(RCU_FLAG_PORRST);   //读取"电源复位标志"
  MyReset_Buffer[7] = rcu_flag_get(RCU_FLAG_SWRST);    //读取"软件复位标志"
  MyReset_Buffer[8] = rcu_flag_get(RCU_FLAG_FWDGTRST); //读取"独立看门狗定时器复位标志"
	MyReset_Buffer[9] = rcu_flag_get(RCU_FLAG_WWDGTRST); //读取"窗口看门狗定时器复位标志"
	MyReset_Buffer[10] = rcu_flag_get(RCU_FLAG_LPRST);   //读取"低功耗复位标志"
	if( MyReset_Buffer[0] ) printf("\r\nIRC8M OK!");
	if( MyReset_Buffer[1] ) printf("\r\nHXTAL OK!");
	if( MyReset_Buffer[2] ) printf("\r\nPLL OK!");
	if( MyReset_Buffer[3] ) printf("\r\nLXTAL OK!");
	if( MyReset_Buffer[4] ) printf("\r\nIRC40K OK!");

	if( MyReset_Buffer[5] ) printf("\r\nPIN reset!");
	if( MyReset_Buffer[6] ) printf("\r\nPOR reset!");
	if( MyReset_Buffer[7] ) printf("\r\nSWR reset!");
	if( MyReset_Buffer[8] ) printf("\r\nIWDG reset!");
	if( MyReset_Buffer[9] ) printf("\r\nWWDG reset!");
	if( MyReset_Buffer[10] ) printf("\r\nLPWR reset!");

  rcu_all_reset_flag_clear();//清除CPU的"所有复位标志位"
}

main.c程序如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t,bool
#include "delay.h"
#include "WWDGT.h"
#include "stdio.h"  //使能printf(),sprintf()

#include "UART3.h"

uint8_t Main_Count;
uint8_t Main_Cnt;

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
const char CPU_Is_Running_REG[]="\r\nCPU is running!\r\n";
int main(void)
{

	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  INTX_ENABLE();//开启所有中断
	GD32F103_UART3_Init(115200);

	printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"
	MySysRstSrcRecord();

	delay_init();

//	Check_WWDGT_Reset();//检查"窗口看门狗定时器"是否复位
	WWDGT_Init();//配置"窗口看门狗定时器",更新"计数器初始值"的时间t满足,28.5ms<t<38.8ms
	Main_Count=0;
	Main_Cnt=0;
	while(1)
	{
		delay_ms(30);//配置"窗口看门狗定时器",更新"计数器初始值"的时间t满足,28.5ms<t<38.8ms,所以这里需要延时30ms

		if(Main_Count<10)//30*30*10=9000毫秒后,不再喂狗
			wwdgt_counter_update(127);//喂狗,update WWDGT counte

		Main_Cnt++;
		if(Main_Cnt>=30)//每隔30*30=900毫秒,串口输出一次数据
		{
			Main_Count++;
			printf("%s",CPU_Is_Running_REG);//调试串口输出"\r\nCPU is running!\r\n"
			Main_Cnt=0;
		}
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值