STM32L4 低功耗STOP模式关闭IWDG功能

时间:2024-03-26 07:33:59

1、先建立基于STM32L4的低功耗STOP的例程(可以休眠1分钟)

  SysTick->CTRL = 0x00;//关闭定时器
  SysTick->VAL = 0x00;//清空val,清空定时器
  /* Disable all used wakeup source */
  HAL_RTCEx_DeactivateWakeUpTimer(&hrtc); 
  HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, Sample_Interval*60, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);//秒
  /* Enter STOP 2 mode */
  HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

2、在低功耗STOP例程的基础上增加IWDG功能(周期可以设置4秒钟)

具体看门狗周期可以按照自己的系统进行设置

  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
  hiwdg.Init.Window = 4095;
  hiwdg.Init.Reload = 4000;
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)

//喂狗操作

 HAL_IWDG_Refresh(&hiwdg);

3、在进入休眠前设置STOP模式关闭IWDG

参照STM32L4 低功耗STOP模式关闭IWDG功能

STM32L4 低功耗STOP模式关闭IWDG功能 

 以下代码参考了https://blog.csdn.net/jubitl/article/details/99698616的博客,在此谢谢为大家带来方便的博主们。

只是修改了flag_IWDG变量类型。

uint32_t flag_IWDG;  

flag_IWDG=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);//设置旗标,避免反复加载flash导致重启
    if(flag_IWDG!=0)
    {
      printf("系统IWDG使能\r\n");
      
      HAL_FLASH_Unlock();
      HAL_FLASH_OB_Unlock();//解锁FLASH

      CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);//修改看门狗参数为:休眠时看门狗停止计数
      /* Set OPTSTRT Bit */
      SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);//以下3句不可缺少,否则无法修改FLASH->OPTR
      /* Wait for last operation to be completed */
      FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
       /* If the option byte program operation is completed, disable the OPTSTRT Bit */
      CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
      HAL_FLASH_OB_Launch();//加载flash,会导致重启
       
      HAL_FLASH_OB_Lock();
      HAL_FLASH_Lock();//修改完后关闭flash,已经上锁再执行一遍问题不大
    }
    else
    {
      printf("系统STOP模式IWDG未使能\r\n");
    }

4、系统重启后,STOP模式下IWDG功能即可关闭。

只要根据自己的功能以及代码执行逻辑进行喂狗操作即可。