ch58x/ch59x窗口、独立看门狗使用

一、窗口看门狗

ch582 584/5 592的看门狗计数器是8位的(计数最大255),计数周期131072/Fsys

以582 592为例,evt中主频都是60M,看门狗最大时间 (131072/60000000)*255=0.557056s

具体使用方式:

/*******************************************************************************

* Function Name  : WWDG_ITCfg

* Description    : 看门狗定时器溢出中断使能

* Input          : DISABLE-溢出不中断      ENABLE-溢出中断

* Return         : None

*******************************************************************************/
void  WWDG_ITCfg( FunctionalState s )
{
sys_safe_access_enable();
if(s == DISABLE)R8_RST_WDOG_CTRL&=~RB_WDOG_INT_EN;
else R8_RST_WDOG_CTRL|=RB_WDOG_INT_EN;
sys_safe_access_disable();

}
/*******************************************************************************

* Function Name  : WWDG_ResetCfg

* Description    : 看门狗定时器复位功能

* Input          : DISABLE-溢出不复位      ENABLE-溢出系统复位

* Return         : None

*******************************************************************************/
void WWDG_ResetCfg( FunctionalState s )
{
sys_safe_access_enable();
if(s == DISABLE)R8_RST_WDOG_CTRL&=~RB_WDOG_RST_EN;
else R8_RST_WDOG_CTRL|=RB_WDOG_RST_EN;
sys_safe_access_disable();
}

/*******************************************************************************

* Function Name  : WWDG_ClearFlag

* Description    : 清除看门狗中断标志,重新加载计数值也可清除

* Input          : None

* Return         : None

*******************************************************************************/
void WWDG_ClearFlag( void )
{
sys_safe_access_enable();
R8_RST_WDOG_CTRL |= RB_WDOG_INT_FLAG;
sys_safe_access_disable();
} 

用法
看门狗中断 如:
void main()
{
  WWDG_SetCounter(0);//喂狗 
  WWDG_ITCfg(ENABLE);
  PFIC_EnableIRQ(WDOG_BAT_IRQn);

   while(1)
   {
       WWDG_SetCounter(0);//喂狗
   }
}

__INTERRUPT//中断函数
__HIGH_CODE
void WDOG_BAT_IRQHandler(void)
{
  WWDG_SetCounter(0);
} 

看门狗复位(582) 如:
void main()

{
    WWDG_SetCounter(0);//喂狗
    WWDG_ClearFlag();
    WWDG_ResetCfg(ENABLE);
   while(1)
   {
       WWDG_SetCounter(0);//喂狗
   }
}

 二、独立看门狗

 独立看门狗(IWDG)由专用的内部低速时钟(LSI)驱动(584/585)

image

 

根据寄存器描述,IWDG最大时间可以是(0xFFF/(32K/512))=65.52s

代码如下:

#define  FEED_IWDG()   {R32_IWDG_KR=0xAAAA;} //需要定时调用喂狗

初始化及喂狗配置:

void IWDG_Enable()
{
    R32_IWDG_KR=0x5555;//解除IWDG保护
    R32_IWDG_CFG |= (7<<12);//32K分频512,时钟62.5Hz
    R32_IWDG_CFG &=0xFFFFF000;
    R32_IWDG_CFG |=0xFFF;//看门狗时间约65s(0xFFF/(32K/512))
    R32_IWDG_KR=0xCCCC; //开启IWDG保护
}

void main()
{
    IWDG_Enable(); //使能IWDG
    PRINT("R32_IWDG_CFG = %x\r\n", R32_IWDG_CFG);
    while(1){
        FEED_IWDG(); //喂狗
    }
}
 喂狗时间具体由这个寄存器决定的R32_IWDG_CFG通过修改分频系数和重装载值。

posted @ 2025-08-01 23:22  小舟从此逝_1  阅读(100)  评论(0)    收藏  举报