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:語言組織能力不強,在此放置一張流程圖供參考,以便翻閱。

 

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