之前的文章介绍过开启看门狗,链接:https://blog.csdn.net/weixin_45680838/article/details/155444550
如果再一些需要超低功耗的场景,需要节约每一点能量的时候,需要关闭看门狗就可以参考下文。

1、代码设计思路
依靠复位标志位,区分、控制是否初始化独立看门狗,如:
①上电,进入上电复位,初始化独立看门狗,等待复位
②进入看门狗超时复位,不初始化独立看门狗。等待确认不会复位,确认独立看门狗关闭。
③手动按下复位触发按键,进入外部复位脚复位,后初始化独立看门狗,随后立刻调用软件复位。
④进入软件复位,等待等待确认不会复位,确认独立看门狗关闭。
c
/*-----------------看门狗初始化--------------------------*/
void IWDG_Init()
{
PRINT(" ----- %s \n",__FUNCTION__);
LClk32K_Cfg(Clk32K_LSI,ENABLE);//使用外部晶振,如果没有外部晶振就需要注释
R32_IWDG_KR=0x5555;
R32_IWDG_CFG |= (7<<12);//32K分频512,时钟62.5Hz
R32_IWDG_CFG &=0xFFFFF000;
// R32_IWDG_CFG |=0xFFF;//看门狗时间约65s(0xFFF/(32K/512))
R32_IWDG_CFG |= 0x100;//看门狗触发时间缩短
R32_IWDG_KR=0xCCCC;
}
/*-----------------看门狗初始化--------------------------*/
int main()
{
HSECFG_Capacitance(HSECap_18p);
SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
PWR_DCDCCfg(ENABLE);
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
/* 配置串口调试 */
// DebugInit();
PRINT(" Start @ChipID=%02x\n", R8_CHIP_ID);
DelayMs(200);
uint8_t flag = R8_RESET_STATUS;
printf(" RESET_STATUS %x\r\n",flag & 0x07);
switch (R8_RESET_STATUS) {
case RST_FLAG_SW:{
PRINT(" ------ Software Reset\n");
}
break;
case RST_FLAG_RPOR:{
PRINT(" ------ Power On Reset\n");
IWDG_Init();
}
break;
case RST_FLAG_WTR:{
PRINT(" ------ Watch Dog tiemout Reset\n");
}
break;
case RST_FLAG_MR:{
PRINT(" ------ External Reset Pin Reset\n");
IWDG_Init();
SYS_ResetExecute();
}
break;
default:
break;
}
PRINT(" \n\r");
while(1)
;
}
2、实验
按照代码设计思路测试操作开发板就可以 测试出一下的LOG,验证关闭看门狗。
