CH573 CH582 CH592 CH579 看门狗WDOG例程

发布时间 2023-11-24 14:49:07作者: WCH蓝牙应用分享

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

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

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

看门狗有两种使用方法:

一、看门狗复位:

void main()
{
    WWDG_SetCounter(0);//喂狗
    WWDG_ClearFlag();
    WWDG_ResetCfg(ENABLE);//使能看门狗复位
   while(1)
   {
      WWDG_SetCounter(0);//喂狗
DelayMs(1000);//可修改延时测试看门狗复位
}
}

二、看门狗中断:

void main()
{
  WWDG_SetCounter(0);//喂狗 
  WWDG_ITCfg(ENABLE);//使用看门狗中断
  PFIC_EnableIRQ(WDOG_BAT_IRQn);//中断服务使能
   while(1)
   {
       WWDG_SetCounter(0);//喂狗
       DelayMs(1000);//可加大延时测试看门狗溢出
   }
}

CH573 CH582 CH592中断服务函数写法:
__INTERRUPT//中断函数
__HIGH_CODE
void WDOG_BAT_IRQHandler(void)
{
  WWDG_SetCounter(0);//喂狗 
  SYS_ResetExecute();//可在此处调用软件复位实现复位
}
CH579中断服务函数写法:
void WDT_IRQHandler(void)
{
  WWDG_SetCounter(0);//喂狗 
  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...