stm32l4低功耗模式与内部看门狗冲突问题解决

目录

前言

解决思路

解决方案

 作者有话

前言

        近期在做stm32低功耗项目的时候遇到了内部看门狗和低功耗模式(待机模式standy)冲突的问题,项目需求是mcu需要定时唤醒,时长可设,这个时候肯定想到的是rtc唤醒,因为在待机或者shutdown模式下只有rtc(好像还有低速计时器)可以实现计时功能,其它时钟均被关闭且上下文丢失,设置好休眠时间后发现,内部看门狗也会出发唤醒中断,然后重启mcu,而且在查阅了很多资料后发现,这个玩意儿只要初始化了就没办法关掉。好家伙,原来内部看门狗这么强大!

解决思路

        1、内部看门狗只要初始化就没办法关闭,那如果在初始化之前进入休眠是不是就不会触发看门狗超时?

        2、如果不能关闭,那为什么程序在debug调试窗口时,可以无限期的断点等待,而不会触发复位?是不是有其他方法可以关闭看门狗?

解决方案

        1、在休眠之前执行一段中转代码,这部分代码负责写一个标志位,同时复位mcu,然后在系统初始化时(看门狗初始化前)读出该标志,由此判断是否需要进入休眠,这样的话程序在看门狗初始化之前进入休眠,看门狗不起作用,完美规避了看门狗复位的问题;如果不需要进入休眠,则正常进入app程序,正常初始化看门狗、喂狗。

#define SLEEP_FLAG_ADDR 0x00000000

//中转代码,放在需要执行休眠时
void sleep_tmp(void)
{
    uint8_t flg = 1;
    flash_write(SLEEP_FLAG_ADDR ,&flg,1);
    nvic_sysreset(); //系统重启
}


//放在初始化,检测休眠标志位
void check_sleep_flag(void)
{
    uint8_t flg = 0;
    flash_read(SLEEP_FLAG_ADDR ,&flg,1);
    if(flg) 
    {
        flg = 0;
        flash_write(SLEEP_FLAG_ADDR ,&flg,1); //清标志
        entry_sleep(); //进入休眠
    }
}

该方案需要有eeprom或者flash配合,相关实现伪代码如上图,可根据需要自行修改。

        2、该方案也是查阅了很多资料后发现的,可以通过flash“选项字”寄存器冻结休眠模式(standy或者shutdown)下看门狗计数功能,在参考手册中也有相关提示(其实如果使用过dplink下载过程序的小伙伴应该发现过,flash选项字是可以配置的,其中就有这几项):

那么通过上边的描述,我们就可以关闭看门狗在休眠模式下的计数功能(不影响正常模式下看门狗工作),代码如下:

/* USER CODE BEGIN 0 */
void Config_Option_Bytes()
{
    FLASH_OBProgramInitTypeDef OptionsBytesStruct;
    HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
    //没有配置过就配置一次,有必要判断一下是否配置过,因为每次配置完都会导致重启,不能每次上电都无条件配置一次
    if ((OptionsBytesStruct.USERConfig & (FLASH_OPTR_IWDG_STANDY) != 0)
    {
    
        OptionsBytesStruct.OptionType = OPTIONBYTE_USER;
        OptionsBytesStruct.USERType = OB_USER_IWDG_STANDY;
        OptionsBytesStruct.USERConfig &= (~FLASH_OPTR_IWDG_STANDY); //STANDY模式下停止看门狗计数
        HAL_FLASH_Unlock();
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
        HAL_FLASH_OB_Unlock();
        if (HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
        {
          //NVIC_SystemReset();
        }
        HAL_FLASH_OB_Lock();
        HAL_FLASH_Lock();

        HAL_FLASH_OB_Launch(); //加载flash配置,修改过后会重启
        
    }
}
/* USER CODE END 0 */

 该函数放在系统初始化(可以放到看门狗初始化后边)第一次配置会重启,FLASH_OPTR寄存器的bit18使能后就不再重启了,上电观察发现看门狗在休眠模式下不起作用,完美!!!

 作者有话

        以上两种方案都已经实际验证且功能正常,小伙伴可以根据实际需求自行修改,如果有更好的处理方式,欢迎评论出来借鉴学习;如有不恰当的地方,也欢迎各位看官提出宝贵意见,拜拜

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: STM32L4系列微控制器是意法半导体公司推出的一类低功耗微控制器,适用于要求精确计时和低功耗操作的应用。 在STM32L4低功耗编程中,可以采用以下几种方式来实现低功耗操作: 1. 睡眠模式STM32L4微控制器提供多种睡眠模式,包括待机模式、停止模式和休眠模式等。通过进入适当的睡眠模式,可以降低处理器的功耗。 2. 时钟管理:合理地配置和管理系统时钟可以减少功耗。比如,可以通过选择适当的时钟源和调整时钟频率来降低功耗。 3. 优化代码执行:减少CPU的工作量可以降低功耗。可以通过优化代码结构、减少不必要的循环和延时等方式来实现。 4. 外设管理:关闭不必要的外设或者将其设置低功耗模式可以降低系统功耗。同时,可以尽可能地利用低功耗外设,如低功耗定时器、RTC等。 5. 电源管理:合理地设计供电电路,如使用合适的电源管理芯片和电池等,可以提高系统的功耗效率。 除了以上方法,还可以使用低功耗编程库和工具,如CubeMX和STM32L4低功耗固件库等,来辅助实现低功耗操作。这些工具提供了丰富的低功耗技术支持和示例代码,便于开发者快速开发和优化低功耗应用。 总之,STM32L4低功耗编程需要综合考虑系统设计、代码优化和外设管理等多个方面,并结合低功耗编程库和工具进行实践,以实现低功耗操作的目标。 ### 回答2: STM32L4是STMicroelectronics推出的一款低功耗微控制器系列,采用ARM Cortex-M4内核,适用于需要长时间运行并且对功耗要求较高的应用场景。下面是关于STM32L4低功耗编程的回答: STM32L4低功耗编程的关键在于充分利用微控制器自带的低功耗模式和功能。STM32L4系列提供了多种低功耗模式,包括休眠模式、停机模式和待机模式等。在编程过程中,我们可以通过设置相应的寄存器和配置位来使STM32L4进入低功耗模式。 首先,我们需要选择合适的低功耗模式。休眠模式是最低功耗模式,此时CPU和大部分外设都被关闭,只有一些必要的外设和时钟继续工作。停机模式则更进一步,甚至连内部时钟都被关闭,只有外部中断能够唤醒系统。待机模式是最高功耗的低功耗模式,此时最多只有RTC模块保持工作,其他都被关闭。 其次,我们要配置唤醒源。唤醒源可以是外部中断、定时器中断,甚至是传感器等外部信号。我们需要根据实际需求选择可靠的唤醒源,并配置对应的寄存器和中断。 另外,还可以采用优化的编程技巧来降低功耗。比如,使用低功耗外设代替高功耗外设,精确控制时钟频率和周期,以及使用适当的睡眠时间。 总之,低功耗编程是STM32L4系列的核心特性之一,可以帮助我们在需要长时间运行、对功耗要求较高的应用场景下节省能源。通过合理配置低功耗模式和唤醒源,以及优化编程技巧,我们可以实现更高效的低功耗应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈大本事er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值