GD32F103VE独立看门狗

GD32F103VE独立看门狗

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

独立看门狗定时器(FWDGT)有一个独立的时钟源(IRC40K).
独立看门狗定时器有一个向下计数器,当计数器到达0,会让CPU复位。
为了不让独立看门狗产生复位信号,必须向控制寄存器(FWDGT_CTL)中写0xAAAA,命令重装"计数器初始值";

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

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

独立看门狗定时器(FWDGT)有一个独立的时钟源(IRC40K).
独立看门狗定时器有一个向下计数器,当计数器到达0,会让CPU复位。
为了不让独立看门狗产生复位信号,必须向控制寄存器(FWDGT_CTL)中写0xAAAA,命令重装"计数器初始值";
*/

void IWDG_Config(void);
void SoftReset(void);
void SysRstSrcRecord(void);

//函数功能:设置看门狗复位周期为3.2秒
void IWDG_Config(void)
{
	rcu_osci_on(RCU_IRC40K);//启动"内部40KHz振荡器"
	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
	{//等待"内部40KHz振荡器稳定"
	}

	//fwdgt_write_enable();//允许访问FWDGT_RLD(看门狗重装载寄存器)和FWDGT_PSC(看门狗预分频器寄存器)
	fwdgt_config((4000-1), FWDGT_PSC_DIV32);
//1,允许访问看门狗重装载寄存器和预分频器寄存器,
//2,设置IWDG重装载值为3999,重装载寄存器IWDG_RLR有12位值,设置IWDG预分频值为32,复位周期:4000*32/40KHz=3200ms
//3,喂狗
	//fwdgt_counter_reload();  //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
	fwdgt_enable();  //使能IWDG
}

//函数功能:使用软件复位CPU
void SoftReset(void)
{
	__set_FAULTMASK(1);//关闭所有中端

	//fwdgt_write_enable();//允许访问FWDGT_RLD(看门狗重装载寄存器)和FWDGT_PSC(看门狗预分频器寄存器)
	fwdgt_config((2-1), FWDGT_PSC_DIV64);
//1,允许访问看门狗重装载寄存器和预分频器寄存器,
//2,设置IWDG重装载值为1,重装载寄存器IWDG_RLR有12位值,设置IWDG预分频值为64,复位周期:1*64/40KHz=1.6ms
//3,喂狗
	//fwdgt_counter_reload();  //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
	fwdgt_enable();  //使能IWDG

	NVIC_SystemReset();//等待CPU复位
	//rcu_flag_get(RCU_FLAG_SWRST);
}

/*
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 Reset_Buffer[11];
//函数功能:打印CPU复位原因
void SysRstSrcRecord(void)
{
	u8 i;

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

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

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

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

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 "IWDG.h"
#include "stdio.h"  //使能printf(),sprintf()

#include "UART3.h"

uint8_t Main_Count;

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"
	SysRstSrcRecord();//系统复位记录

	IWDG_Config();//设置看门狗复位周期为3.2秒
	delay_init();
	Main_Count=0;
	while(1)
	{
		Main_Count++;
		delay_ms(500);
		printf("%s",CPU_Is_Running_REG);//调试串口输出"\r\nCPU is running!\r\n"

		if(Main_Count<10)//前10次"喂狗",10次后3.2秒,CPU复位
			fwdgt_counter_reload();  //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
	}
}

GD32F103VE独立看门狗_第1张图片

 

你可能感兴趣的:(产品研发,单片机,嵌入式硬件,GD32,独立看门狗定时器)