91 lines
3.2 KiB
C
91 lines
3.2 KiB
C
|
||
|
||
|
||
#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++;
|
||
}
|
||
}
|
||
}
|