stm32 低功耗下使用看门狗(不喂狗)

在项目中需要低功耗处理,而使用看门狗可以保证程序不会跑死。但使用看门狗有一个问题,打开看门狗以后关闭不了,必须一直喂狗进行操作,那有啥好的办法呢?狗是必须养的,养这条狗花费了我半天时间,在此记录。

 

我能想到的有两种方案:

一、 使用独立看门狗,在低功耗下唤醒进行喂狗操作后继续休眠。

该方法可以通过增大看门狗的时钟分频,最大256分频,即可达到最大限度的喂狗时间,如果按照40K的时钟来算,(1 / (40K / 256)) * 4096 = 26.2144S, 在二十多秒起来喂狗在功耗方面可以接受,这种方法比较简单,不过二十多秒需唤醒一次。

 

二、利用复位关闭看门狗,在低功耗下不进行喂狗操作

使用的前提是需要判断复位的状态或者将软件复位标志写入flash中。

将软件复位标志写入flash

参考链接:http://www.eeworld.com.cn/mcu/2019/ic-news041243839.html,很好的说明了整个流程。

重点记录使用复位状态关闭看门狗。在stm32中,使用RCC的CSR寄存器根据状态位可以判断出复位原因。我在项目中判断了三种状态:上电/掉电态,看门狗复位态,软件复位态。下图流程图可以看出软件每次重启都读取复位标志位,由于业务需求,需要在首次开机时写入一些参数,根据业务需求开关机判断可有可无。 看门狗复位态指没有正常喂狗引起的复位,而软件复位态是我们通过代码手动软件复位的,因此是看门狗复位还是软件复位就可以区分。区分出来后,我们需要做相应处理,如果是看门狗复位态,说明程序跑死了,该让他正常初始化的初始化,养狗的养狗,最重要的是在业务代码完成后进入低功耗前,我们需要进行一步手动复位操作,这个操作用来判断我们是否想进入低功耗,我在程序中的做法是:在进入低功耗前进行软件复位,复位后判别出是软件复位标志,直接goto到低功耗处理函数。在这个goto的过程中没有进行开启看门狗操作,系统复位过,狗就这样子被我们关闭了,成功进入低功耗。

低功耗唤醒时再次开启看门狗,进入低功耗前手动软件复位,手动复位标志位判断出来后不进行喂狗,直接跳到低功耗处理函数,就能一直跑着。

PS:语言组织能力不强,在此放置一张流程图供参考,以便翻阅。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章