STM32休眠时关闭看门狗计数的简单解决方案

2019-11-12来源: eefocus关键字:STM32  休眠  看门狗  计数

测试平台


本文采用STM32L476进行测试,休眠模式为STOP,看门狗为独立看门狗IWDG。

其余STM32芯片可参考本贴进行测试。


问题的提出


在此之前对这个问题的解决方法主要有三种:

(1)采用调试模式关闭内核的功能来关闭看门狗计数;

(2)休眠时采用时钟唤醒来喂狗后继续休眠;

(3)用基于系统时钟的窗口看门狗WWDG

第一种方法对STM32L476无效;第二种方案太折腾了,影响RTC使用且费电;第三种方案喂狗间隔太短。


问题的解决


官方数据手册中说明了可以在STOP休眠状态关闭IDWG

因此,只需要修改FLASH_OPTR寄存器的对应位既可以实现休眠免喂狗的功能。

在这里插入图片描述
在这里插入图片描述

源代码


源代码参考了STM32L4XX_HAL_FLASH_EX.C这个库文件,也感谢朱老师NBIOT学习群管理员给予的有益的建议。


uint8_t flag_IWDG;

flag_IWDG=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP)!=0;//设置旗标,避免反复加载flash导致重启

if(flag_IWDG!=0)

{

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,已经上锁再执行一遍问题不大

关键字:STM32  休眠  看门狗  计数 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479735.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 芯片 IWDG 关闭 停用 方法
下一篇:STM32开发笔记77: 内部看门狗长延时的产生

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

74LS164 for stm32 源码
:74LS164.c---------------------------------------------------------------------------------------------------------------------------------------------#include "stm32f10x.h"#include "stm32f10x_rcc.h"#include "stm32f10x_gpio.h"#include "74LS164.h"/* 延时模块82615468 sp-320-12 * */static void delay(u32 t){ u32 i; while(t--) for (i = 0; i < 1; i++);}void Ls164Init(void){ GPIO_InitTypeDef
发表于 2019-12-11
74LS164 for stm32 源码
STM32 SysTick定时器应用【worldsing笔记】
SysTick是CM内核独立的定时器,时钟可以用内核内部的,也可以用芯片厂家(ST)的时钟,参考《Cortex-M3权威指南》的第13章: 另外也可以考《STM32F10xxx Cortex-M3 programming manual.pdf》第4章CM3系统外设,从手册来看,ST应该只提供了内核外部时钟,而外部时钟又分成两种:HCLK/8 和 HCLK,  ST官方提供了库直接可以操作SYSTICK,但不同的版本使用起来有些区别: 在V2.0的版本中对SysTick的操作是使用的stm32f10x_systick.c和stm32f10x_systick.h void
发表于 2019-12-11
STM32 SysTick定时器应用【worldsing笔记】
Keil uCos 2.52 stm32 【worldsing笔记】
;    RevBit(LED_GPIO->ODR, 12)           /*LED 状态反转                              */ 2、stm32 Lib V3.5 
发表于 2019-12-11
stm32_CAN总线知识
一、CAN总线的特点:bxCAN主要特点● 支持CAN协议2.0A和2.0B主动模式● 波特率最高可达1兆位/秒● 支持时间触发通信功能发送● 3个发送邮箱● 发送报文的优先级特性可软件配置● 记录发送SOF时刻的时间戳接收● 3级深度的2个接收FIFO● 可变的过滤器组:─ 在互联型产品中,CAN1和CAN2分享28个过滤器组─ 其它STM32F103xx系列产品中有14个过滤器组● 标识符列表● FIFO溢出处理方式可配置● 记录接收SOF时刻的时间戳时间触发通信模式● 禁止自动重传模式● 16位自由运行定时器● 可在最后2个数据字节发送时间戳管理● 中断可屏蔽● 邮箱占用单独1块地址空间,便于提高软件效率双CAN● CAN1
发表于 2019-12-11
stm32_CAN总线知识
STM8L051F3_03_CLK应用
本文介绍STM8L的CLK相关知识。内容分为以下几部分:CLK简介系统时钟频率切换1、CLK简介STM8L051F3的时钟控制系统设计时非常稳定的,同时也很容易使用,它可以使得MUC在低消耗下获仍然保持优性能。用户可以通过管理分配到CPU&外设的时钟来达到降低功耗。STM8L051F3有一个安全无干扰的时钟切换机制允许用户切换系统时钟源,同时可以通过预分频器来控制系统时钟频率。时钟结构图如下:注:STM8L051F3的Peripheral Clock enable是13 bit,没有LCD外设STM8L051F3的系统时钟源有以下4种:16MHz内部高速(出厂已校准)RC时钟HSI1~16MHz外部高速振荡器时钟
发表于 2019-12-11
STM8L051F3_03_CLK应用
低功耗版STM8L051的一个诡异配置
为了做个低功耗项目,从最便宜的STM8S003切换到低功耗系列里较便宜的STM8L051;在STM8S003上调通了HALT休眠处理后,最低待机电流是67uA;用了STM8L051后,实测能到2uA;但是后来遇到个诡异的问题,TIMER4莫名其妙不动作,好像不计时了。开关中断,改初始化配置,都没用,很奇怪。最后发现,是init'初始化的时候,没有给TIMER4配置CLK时钟源,导致的,原来的代码并没有写TIM4,        CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_4);       
发表于 2019-12-11
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved