#include "Includes.h" typedef unsigned int uint32_t; #define __write_hw_reg32(reg,val) ((*reg) = (val)) #define CPR_CTLAPBCLKEN_GRCTL ((volatile unsigned *)(0x40000000 + 0x070)) #define CPR_RSTCTL_CTLAPB_SW ((volatile unsigned *)(0x40000000 + 0x100)) #define CPR_RSTCTL_WDTRST_MASK ((volatile unsigned *)(0x40000000 + 0x114)) #define WDT_CR ((volatile unsigned *)(0x40004000 + 0x00)) #define WDT_TORR ((volatile unsigned *)(0x40004000 + 0x04)) #define WDT_CRR ((volatile unsigned *)(0x40004000 + 0x0C)) /* --------------------------------------------------------------------------------------------------- //看门狗计数器对应的初值 (0x0)0000:0x FFFF (0x1)0001:0x 1FFFF (0x2)0010:0x 3FFFF (0x3)0011:0x 7FFFF (0x4)0100:0x FFFFF (0x5)0101:0x 1FFFFF (0x6)0110:0x 3FFFFF (0x7)0111:0x 7FFFFF (0x8)1000:0x FFFFFF----约2S (0x9)1001:0x 1FFFFFF----约5S (0xA)1010:0x 3FFFFFF----约10S (0xB)1011:0x 7FFFFFF----约20S (0xC)1100:0x FFFFFFF (0xD)1101:0x1FFFFFFF (0xE)1110:0x3FFFFFFF (0xF)1111:0x7FFFFFFF ----------------------------------------------------------------------------------------------------*/ /* --------------------------------------------------------------------------------------------------- - 函数名称: xc_wdog_init - 函数功能: 初始化看门狗 - 函数形参:看门狗计数器重装值 - 创建日期: 2019-04-22 ----------------------------------------------------------------------------------------------------*/ void xc_wdog_init(uint32_t counter_value) { __write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL,0x10001); //WDT_PCLK 时钟使能 __write_hw_reg32(CPR_RSTCTL_CTLAPB_SW,0x40000); //WDT 模块软复位 __write_hw_reg32(CPR_RSTCTL_CTLAPB_SW,0x40004); __write_hw_reg32(CPR_RSTCTL_WDTRST_MASK,0x20);//屏蔽 WDT 引起的 M0 的软复位,不屏蔽 WDT 引起的系统的软复位 __write_hw_reg32(WDT_CR,0x7);// WDT 使能 ,M0 复位信号,维持4个 pclk 时钟周期,工作模式 0,直接产生复位信号送给 CPR __write_hw_reg32(WDT_TORR,counter_value); __write_hw_reg32(WDT_CRR,0x76); //重启计数器 } /* --------------------------------------------------------------------------------------------------- - 函数名称: xc_wdog_feed - 函数功能: 喂看门狗 - 函数形参:无 - 创建日期: 2019-04-22 ----------------------------------------------------------------------------------------------------*/ void xc_wdog_feed(void) { __write_hw_reg32(WDT_CRR,0x76); //重启计数器 } extern void test_wdog(void) { uint8_t count=0; xc_wdog_init(0xA); //__write_hw_reg32(CPR_RSTCTL_WDTRST_MASK,0x3);//屏蔽看门狗复位 printf("wdog reset\n "); while(1) { printf("WDT_CCVR=%d\n",*WDT_CCVR); printf("WDT_STAT=%d\n",*WDT_STAT); for(uint32_t i=0; i<0x120000; i++); for(uint32_t i=0; i<0x120000; i++); for(uint32_t i=0; i<0x120000; i++); //不喂狗时可以测试几秒钟看门狗复位 if(5==count) { //xc_wdog_init(0xA); //xc_wdog_feed();//此处不喂狗会引起系统复位 count=0; } else { count++; } } }