看门狗功能是基于一个8位的递增计数器,计数时钟周期为131072/Fsys。当开启了看门狗超时复位功能后,一旦此计数器溢出会复位整个系统。

CH579例程中主频都是32M,看门狗超时复位最长时间为 131072/32000000*255=1.04448s。

CH573 CH582 CH592例程中主频都是60M,看门狗超时复位最长时间为 131072/60000000*255=0.557056s。

最近一次复位状态:
000:软件复位 SR(RB_WDOG_RST_EN=0
时软件复位可产生此状态,否则可复位
但不产生此状态);
001:上电复位 RPOR;
010:看门狗超时复位 WTR;
011:外部手动复位 MR;
101:从下电模式唤醒时的复位 GRWSM;
100/110/111:唤醒复位 LRW,且此前的
上一次复位分别是 SR/WTR/MR。

看门狗有两种使用方法:

一、看门狗复位:

CH573 CH582 CH592示例:

void main()
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);//设置主频为60M
    DebugInit();//串口打印初始化
    PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因
    WWDG_SetCounter(0);//喂狗
    WWDG_ClearFlag();//清除中断标志
    WWDG_ResetCfg(ENABLE);//使能看门狗复位
    while(1)
    {
      WWDG_SetCounter(0);//喂狗
      DelayMs(1000);//可修改延时测试看门狗复位
      PRINT("WDOG TEST\n");//串口打印数据方便观察
    }
}

CH579示例:

void main()
{
    DebugInit();//串口打印初始化
    PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因
    WWDG_SetCounter(0);//喂狗
    WWDG_ClearFlag();//清除中断标志
    WWDG_ResetCfg(ENABLE);//使能看门狗复位
    while(1)
    {
      WWDG_SetCounter(0);//喂狗
      DelayMs(1500);//可修改延时测试看门狗复位
      PRINT("WDOG TEST\n");//串口打印数据方便观察
    }
}

二、看门狗中断:

CH573 CH582 CH592示例:

void main()
{
  SetSysClock(CLK_SOURCE_PLL_60MHz);//设置主频为60M
  DebugInit();//串口打印初始化
  PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因
  WWDG_SetCounter(0);//喂狗
  WWDG_ITCfg(ENABLE);//使用看门狗中断
  PFIC_EnableIRQ(WDOG_BAT_IRQn);//中断服务使能
   while(1)
   {
       WWDG_SetCounter(0);//喂狗
       DelayMs(1000);//可加大延时测试看门狗溢出
   }
}

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void WDOG_BAT_IRQHandler(void)
{
  WWDG_SetCounter(0);//喂狗
  PRINT("WDOG_BAT_IRQHandler\n");//串口打印数据方便观察
  SYS_ResetExecute();//可在此处调用软件复位实现复位
}

CH579示例:

void main()
{
  DebugInit();//串口打印初始化
  PRINT("R8_RESET_STATUS =%02x\n",R8_RESET_STATUS&0x07);//打印复位状态寄存器,显示复位原因
  WWDG_SetCounter(0);//喂狗
  WWDG_ITCfg(ENABLE);//使用看门狗中断
  NVIC_EnableIRQ(WDOG_BAT_IRQn);//中断服务使能
   while(1)
   {
       WWDG_SetCounter(0);//喂狗
       DelayMs(1500);//可加大延时测试看门狗溢出
   }
}


void WDT_IRQHandler(void)
{
  WWDG_SetCounter(0);//喂狗
  PRINT("WDT_IRQHandler\n");//串口打印数据方便观察
  SYS_ResetExecute();//可在此处调用软件复位实现复位
}

看门狗的库函数文件目录:StdPeriphDriver/CH57x_sys.c或StdPeriphDriver/CH58x_sys.c或StdPeriphDriver/CH59x_sys.c

下面是看门狗库函数介绍:

1.看门狗中断使能

/*********************************************************************
 * @fn      WWDG_ITCfg
 *
 * @brief   看门狗定时器溢出中断使能
 *
 * @param   s       - 溢出是否中断
 *
 * @return  none
 */
void WWDG_ITCfg(FunctionalState s)
{
    uint8_t ctrl = R8_RST_WDOG_CTRL;

    if(s == DISABLE)
    {
        ctrl &= ~RB_WDOG_INT_EN;
    }
    else
    {
        ctrl |= RB_WDOG_INT_EN;
    }

    sys_safe_access_enable();
    R8_RST_WDOG_CTRL = ctrl;
    sys_safe_access_disable();
}

2.开门狗复位使能

/*********************************************************************
 * @fn      WWDG_ResetCfg
 *
 * @brief   看门狗定时器复位功能
 *
 * @param   s       - 溢出是否复位
 *
 * @return  none
 */
void WWDG_ResetCfg(FunctionalState s)
{
    uint8_t ctrl = R8_RST_WDOG_CTRL;

    if(s == DISABLE)
    {
        ctrl &= ~RB_WDOG_RST_EN;
    }
    else
    {
        ctrl |= RB_WDOG_RST_EN;
    }

    sys_safe_access_enable();
    R8_RST_WDOG_CTRL = ctrl;
    sys_safe_access_disable();
}

3.看门狗清除中断

/*********************************************************************
 * @fn      WWDG_ClearFlag
 *
 * @brief   清除看门狗中断标志,重新加载计数值也可清除
 *
 * @param   none
 *
 * @return  none
 */
void WWDG_ClearFlag(void)
{
    sys_safe_access_enable();
    R8_RST_WDOG_CTRL |= RB_WDOG_INT_FLAG;
    sys_safe_access_disable();
}

4.看门狗喂狗

/**
 * @brief   加载看门狗计数初值,递增型
 *
 * @param   c       - 看门狗计数初值
 */
#define WWDG_SetCounter(c)    (R8_WDOG_COUNT = c)

5.看门狗中断服务函数

__INTERRUPT
__HIGH_CODE
void WDOG_BAT_IRQHandler(void)
{
  WWDG_SetCounter(0);
}

END...

posted on 2023-11-24 14:45  WCH蓝牙应用分享  阅读(464)  评论(0编辑  收藏  举报