STM32 独立看门狗异常复位

程序中使用了定时器来执行喂狗操作,

void TIM4_IRQHandler(void)
{	    
    if (TIM_GetITStatus(TIM4, TIM_IT_Update)!=RESET)
	{		 
        t4_count++;
		g_iwdg_cnt++;

		if(t4_count == 10)
		{
			t4_count = 0;

			DS18B20_value = DS18B20_Get_Temp();
		}

		if(g_iwdg_cnt >= 200)
		{
			//等待看门狗超时复位
			while(1);
		}

		IWDG_Feed();				// 每隔100ms喂一次狗
		
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
    }   
}

看门狗定时1s复位,

// IWDG_Config(IWDG_Prescaler_64 ,625);

void IWDG_Config(uint8_t prv ,uint16_t rlv)
{    
    // 使能 预分频寄存器PR和重装载寄存器RLR可写
    IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
    
    // 设置预分频器值
    IWDG_SetPrescaler( prv );
    
    // 设置重装载寄存器值
    IWDG_SetReload( rlv );
    
    // 把重装载寄存器的值放到计数器中
    IWDG_ReloadCounter();

  // 使能 IWDG
    IWDG_Enable();    
}

// 喂狗
void IWDG_Feed(void)
{
    // 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
    // 当计数器的值减到0的时候会产生系统复位
    IWDG_ReloadCounter();
}

发现总是在按键的时候,看门狗异常复位。原因:按键中断函数中有延时操作且时间超过了1s,导致看门狗溢出复位。

解决:

      将看门狗溢出定时延长。

      IWDG_Config(IWDG_Prescaler_64 ,6250);

你可能感兴趣的:(独立看门狗,stm32,单片机)