[其他ST产品] STM32休眠时关闭看门狗计数的简单解决方案

[复制链接]
1427|4
 楼主| 回复就哭哭 发表于 2023-1-31 20:38 | 显示全部楼层 |阅读模式
测试平台
本文采用STM32L476进行测试,休眠模式为STOP,看门狗为独立看门狗IWDG。
其余STM32芯片可参考本贴进行测试。

问题的提出
在此之前对这个问题的解决方法主要有三种:
(1)采用调试模式关闭内核的功能来关闭看门狗计数;
(2)休眠时采用时钟唤醒来喂狗后继续休眠;
(3)用基于系统时钟的窗口看门狗WWDG
第一种方法对STM32L476无效;第二种方案太折腾了,影响RTC使用且费电;第三种方案喂狗间隔太短。

评论

———————————————— 版权声明:本文为CSDN博主「jubitl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jubitl/article/details/99698616  发表于 2023-1-31 20:38
 楼主| 回复就哭哭 发表于 2023-1-31 20:38 | 显示全部楼层
问题的解决

官方数据手册中说明了可以在STOP休眠状态关闭IDWG
因此,只需要修改FLASH_OPTR寄存器的对应位既可以实现休眠免喂狗的功能。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1Yml0bA==,size_16,color_FFFFFF,t_70.jpg


 楼主| 回复就哭哭 发表于 2023-1-31 20:39 | 显示全部楼层
 楼主| 回复就哭哭 发表于 2023-1-31 20:40 | 显示全部楼层
源代码
源代码参考了STM32L4XX_HAL_FLASH_EX.C这个库文件,也感谢朱老师NBIOT学习群管理员给予的有益的建议。
  1.         uint8_t flag_IWDG;
  2.         flag_IWDG=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP)!=0;//设置旗标,避免反复加载flash导致重启
  3.         if(flag_IWDG!=0)
  4.         {
  5.                 HAL_FLASH_Unlock();
  6.                 HAL_FLASH_OB_Unlock();//解锁FLASH

  7.                 CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);//修改看门狗参数为:休眠时看门狗停止计数
  8.             /* Set OPTSTRT Bit */
  9.                     SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);//以下3句不可缺少,否则无法修改FLASH->OPTR
  10.             /* Wait for last operation to be completed */
  11.                     FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
  12.                     /* If the option byte program operation is completed, disable the OPTSTRT Bit */
  13.             CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
  14.                 HAL_FLASH_OB_Launch();//加载flash,会导致重启
  15.         }
  16.         HAL_FLASH_OB_Lock();
  17.         HAL_FLASH_Lock();//修改完后关闭flash,已经上锁再执行一遍问题不大
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

436

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部