|
最近调试项目,发现一个很怪异的问题,配置代码如下:
uint8_t flag_IWDG_STOP,flag_IWDG_STDBY;
flag_IWDG_STOP=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP)!=0;
flag_IWDG_STDBY=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STDBY)!=0;
if(flag_IWDG_STOP!=0||flag_IWDG_STDBY!=0)
{
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);
CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STDBY);
SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
HAL_FLASH_OB_Launch();
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();//
}
/* USER CODE END IWDG_Init 1 */
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Window = 5000;
hiwdg.Init.Reload = 5000;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
前面红色部分设置在睡眠时冻结看门狗,防止休眠时超时。
下面配置看门狗这里有一个问题,5000是不对的,RELOAD值只有12位,最大4095,因此5000低12位其实是904,,32分频,超时超时时间是904ms,实际测试超时在903-910之间,这个是正常的。
但是在外部供电偶尔波动一下再恢复后,看门狗超时复位变成580ms了,配置并没有变(实际测试值580ms复位重启,),重启后复位时间一直会变成580ms,重新刷程序,
jlink复位都没有用,只有把整板断电再上电才会再次恢复到904ms复位重启。
|
|