STM32Lx在低功耗下使用软件看门狗

2023-11-05

看门狗对于防止程序跑死是很关键的,很多时候我们的产品需要进入低功耗,而且唤醒间隔也比较长,此时如果看门狗启动了,那么就会导致处在低功耗的MCU发生复位。解决这个问题的方法有两种:

一种是增加看门狗的喂狗时间间隔,保证此间隔大于MCU唤醒间隔,这对于那种几个小时唤醒一次的应用,很多看门狗是不支持这么长的喂狗间隔的。第二种是MCU进入低功耗之后停止看门狗计时,唤醒之后重新开始。第二种方案就能很好的解决上述痛点,STM32系列很多单片机的看门狗就具备这个功能,拿STM32L476VET6这型号的单片机举例,此单片机的FLASH选项字节中的选项寄存器(FLASH_OPTR)里面有一位是用来设置在停止模式下是否冻结独立看门狗计数器的,还有一位是用来设置在待机模式下冻结独立看门狗计数器的(看下图红框内容)。因此只要将此位清零即可实现在停止模式或者待机模式下暂停看门狗的功能。

下面是我的测试程序:

/*
 * 函数名称: Watchdog_Init
 * 函数说明: 软件看门狗初始化(喂狗间隔10s)
 * 输入参数: 无
 * 返回参数: 无
 */
void Watchdog_Init(void)
{
  /* 配置用户选项字节:在停止模式下冻结独立看门狗计数器 */
  FLASH_OBProgramInitTypeDef obprogram_init;
  /* 读取用户选项字节 */
  HAL_FLASHEx_OBGetConfig(&obprogram_init);
  /* 判断FLASH_OPTR寄存器的IWDG_STOP位是否置位(不判断也行) */
  if(obprogram_init.USERConfig & FLASH_OPTR_IWDG_STOP)
  {
    /* 置位则清零IWDG_STOP位 */
    obprogram_init.OptionType=OPTIONBYTE_USER;
    obprogram_init.USERType=OB_USER_IWDG_STOP;
    obprogram_init.USERConfig=OB_IWDG_STOP_FREEZE;  
    /* 以下流程是根据手册上提供的 */
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&obprogram_init);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
    /* OBL_LAUNCH:选项字节重载位,用来生效上述更改(如果OPTLOCK为0,将此位置1,则会导致复位,如果 OPTLOCK为1,则此位无法写入,MCU复位后此位默认置1) */
    HAL_FLASH_OB_Launch();
  }

  /* 看门狗时钟源:LSI,大小为32KHz */  
  LL_IWDG_Enable(IWDG);
  LL_IWDG_EnableWriteAccess(IWDG);
  LL_IWDG_SetPrescaler(IWDG, LL_IWDG_PRESCALER_128); /* 分频后的计数频率为250HZ */
  LL_IWDG_SetReloadCounter(IWDG, 2500); /* 10s */
  while (LL_IWDG_IsReady(IWDG) != 1)
  {
  }
  /* 设置窗口计数值,设为0xFFF关闭此功能 */
  LL_IWDG_SetWindow(IWDG, 4095);
  LL_IWDG_ReloadCounter(IWDG);  
}

/*
 * 函数名称: Enter_DeepSleep
 * 函数说明: 进入停止模式
 * 输入参数: 无
 * 返回参数: 无
 */
void Enter_DeepSleep(void)
{
  /* Clear all exti interrupt flag */
  NVIC_DisableIRQ(SysTick_IRQn);	
  EXTI->PR1 = 0x007DFFFF;
  EXTI->PR2 = 0x00000078;
  LL_RTC_ClearFlag_WUT(RTC);   

  /* Set STOP2 mode when CPU enters deepsleep */
  LL_PWR_SetPowerMode(LL_PWR_MODE_STOP2);

  /* Set SLEEPDEEP bit of Cortex System Control Register */
  LL_LPM_EnableDeepSleep();  

  /* Request Wait For Interrupt */
  __WFI();  
  
  /* Reset SLEEPDEEP bit of Cortex System Control Register */
  SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
  
  LL_RCC_HSE_Enable();

  /* Wait till HSE is ready */
  while(LL_RCC_HSE_IsReady() != 1)
  {
    
  }
  LL_RCC_PLL_Enable();
  /* Wait till PLL is ready */
  while(LL_RCC_PLL_IsReady() != 1)
  {
    
  }
  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
  /* Wait till System clock is ready */
  while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
  {
  
  }
  LL_Init1msTick(32000000);
  LL_SetSystemCoreClock(32000000);  
  NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), SYSTICK_PRIORITY, 0));
  NVIC_EnableIRQ(SysTick_IRQn);	
  LL_SYSTICK_EnableIT();  		
}

经测试在低功耗下确实不会因为看门狗超时而出现不正常的复位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32Lx在低功耗下使用软件看门狗 的相关文章

  • pycharm界面怎么自动换行

    pycharm界面怎么自动换行 第一步我们单击桌面上的pycharm图标 第二步找到文件下的设置属性 单击按下就成功开启编辑窗口使用自动换行 还有一个在代码显示界面旁边点击右键 代码框就实现了代码自动换行的
  • 小程序WXML语法

    一 WXML模块语法 数据绑定 1 数据绑定的基本原则 1 在data中定义数据 2 在WXML中使用数据 2 在data中定义页面的数据 在页面对应的 js文件中 把数据定义到data对象中即可 Page data 字符串类型的数据 in
  • Android The number of method references in a .dex file cannot exceed 64K.

    编译项目时报错 The number of method references in a dex file cannot exceed 64K 查阅得知 在Android系统中 一个App的所有代码都在一个Dex文件里面 Dex是一个类似J

随机推荐

  • 如何成为嵌入式软件工程师_成为高效软件工程师的三个关键

    如何成为嵌入式软件工程师 In this one on one episode of the Versioning Show David and Tim look at what it means to be a productive so
  • 微众银行区块链2021年度回顾

    2021年 数字经济不断深化 并有望担当起更为重要的历史使命 同时 十四五 规划纲要明确区块链作为七大数字经济重点产业之一 为数字产业化提供有力技术支撑 助推数字经济转型升级 这一年 微众银行继续坚守联盟链技术路线 以安全可控的开源技术推动
  • odoo(搭建部署资源、教程)

    本地部署odoo16 odoo https www odoo com documentation 14 0 zh CN administration install install html mac os https alanhou org
  • Ubuntu18.04没有WiFi怎么解决(图文详解)

    博主一个月前 2021 6 1 在安装Ubuntu后出现了没有WiFi的问题 参考了很多教程 才成功解决这个问题 中间做了很多无用功 所以在此总结几位大佬的方法 希望对大家有帮助 少走弯路 1 问题描述 登录Ubuntu系统后 在WiFi设
  • mlxtend库:打造自己的机器学习工具箱

    mlxtend库 打造自己的机器学习工具箱 你是否曾经为缺少一个方便 易用的机器学习工具而感到烦恼 mlxtend库或许可以满足你的需求 mlxtend是一个基于Python的开源项目 它提供了许多用于数据预处理 特征选择 分类 聚类等机器
  • Mybatis整合Spring源码分析

    一 整合配置 POM
  • 备份Intellij IDEA配置的两种方式

    转载 https my oschina net vright blog 1558342 这个技巧老早就知道 而且 本就是官方支持的 真正实现 全新安装 开箱即用 这里以Windows系统为例 方式一 通过将配置导出为Jar包的形式 实现备份
  • CPU调度策略&linux 0.11的schedule实现--OS

    CPU调度策略 如何设计调度算法 这个算法应满足 尽快结束任务 周转时间 从任务进入到任务结束 短 用户操作尽快响应 相应时间 从操作发生到响应 短 系统内耗时间少 吞吐量 完成的任务量 总原则 系统专注于任务执行 又能合理调配任务 两种基
  • matlab时域频域信号特征提取资料整合

    1 前言 最近在做一个项目 需要将声纳信号中的特征都提取出来进行分析 资料查到头秃终于整合出来了些东西 记录一下 由于不是专业人员 如果发现任何错误请不要大意的附在评论区 我会及时修改 谢谢 2 思路 思路这段引用自知乎大佬aresmiki
  • 未能加载项目文件。缺少根元素。

    问题 项目无法加载或者无法打开 方法 删除项目的 Debug 和 Release 目录 或者删除 user 配置软件
  • 使用和生成库

    使用和生成库 基本概念 库有动态与静态两种 动态通常用 so为后缀 静态用 a为后缀 例如 libhello so libhello a 为了在同一系统中使用不同版本的库 可以在库文件名后加上版本号为后缀 例如 libhello so 1
  • 【Leetcode】145. 二叉树的后序遍历

    题目描述 给定一个二叉树 返回它的 后序 遍历 题解 递归法 执行用时 0 ms 在所有 Java 提交中击败了100 00 的用户 内存消耗 36 8 MB 在所有 Java 提交中击败了29 78 的用户 Definition for
  • 【深度学习】迁移学习

    什么是迁移学习 迁移学习 Transfer Learning 是一种机器学习方法 就是把为任务 A 开发的模型作为初始点 重新使用在为任务 B 开发模型的过程中 迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务 虽然大多数机器学
  • 服务器当然选算力强大、换“芯”成本低的

    有一句净水器的广告语人们耳熟能详 选净水器 当然选净化效果好 换芯成本低的 随着各行各业对算力需求的不断高涨 服务器的更新换代速度也越来越快 而除了常规的换 芯 以外 服务器系统在整体设计上如何更好地满足算力多样化 管理智能化 运营安全性和
  • 分享一个数据产品的PRD

    作者 LineLian 微信 firstbodytm 随着年龄的增长会越来越重视道 重视产品成功的系统原因 重视产品的团体环境 重视还原用户的真实因子 对于术比如用啥工具 写那些文档怎么写 交互方式是多么的酷炫 界面设计的是多么的棒 流程设
  • upstream模块(开发)

    http tengine taobao org book chapter 5 html upstream模块 100 nginx模块一般被分成三大类 handler filter和upstream 前面的章节中 读者已经了解了handler
  • 使用gdb调试多进程及多线程程序

    多进程调试 首先来了解下会可能会用到的调试命令 1 默认设置下 在调试多进程程序时GDB只会调试主进程 但是如果设置follow fork mode的话 就可调试多个进程 set follow fork mode parent child
  • 直角坐标系中点的旋转【点绕点旋转】

    前言 本文整理在平面直角系中 坐标系旋转 某点绕着坐标系旋转 坐标点A 绕着点B旋转 求旋转后的点坐标 看了网上好的文章 发现部分有误或不完整 这里简单总结一下 一 点绕坐标系旋转 坐标系不变 某点 绕坐标系 原点 旋转 角度 求旋转后点的
  • GET和POST的区别,java模拟postman发post请求

    目录 一 先说一下get和post 1 看一下人畜无害的w3schools怎么说 2 问一下文心你言哥 轻轻松松给你一个标准答案 3 卧槽 懂了 好像又没懂 二 让我们扒下GET和POST的外衣 坦诚相见吧 三 我们的大BOSS还等着出场呢
  • STM32Lx在低功耗下使用软件看门狗

    看门狗对于防止程序跑死是很关键的 很多时候我们的产品需要进入低功耗 而且唤醒间隔也比较长 此时如果看门狗启动了 那么就会导致处在低功耗的MCU发生复位 解决这个问题的方法有两种 一种是增加看门狗的喂狗时间间隔 保证此间隔大于MCU唤醒间隔