STM32 低功耗模式STOP、STANDBY配合RTC應用實例

項目背景
目標:進入低功耗模式120s左右喚醒。
結果:完成低功耗驅動,完成RTC定時驅動,完成目標;
Tip:使用一個新的模塊時應主要參考官方文檔和官方例程,有問題再上網尋找思路;(本文使用的例程在最後 )
環境:STM32F205、 IAR6.7、J-Link
:因爲考慮到項目以後需要移植到 stm32F0系列上,而且 stm32F0系列沒有 backup SRAM,所以這部分驅動不使用 backup SRAM;

注意:看門狗是不能開啓的,否則會在sleep時watch dog重啓;
一、STOP模式 +RTC
STOP模式: 可以理解爲程序進入STOP模式後會暫停運行,直到中斷觸發退出STOP模式,程序會從剛剛停止的地方繼續運行;
代碼思路 :
1.進入低功耗模式之前,我們首先要關閉所有外設 ;
2.參考官方例程,對官方例程中的RTC 1s喚醒一次,修改裏面的時鐘配置,得到RTC 120s喚醒;
所以重點是時鐘配置:
時鐘選擇 LSE(外部時鐘),比LSI(內部時鐘)更爲精準;根據自己使用的晶振不同,有不同的頻率。我的時鐘源是 32.768kHz;
查看官方 STM32F205 參考手冊(RM0033) 22.3 章節可知,
RTC wakeup時鐘可以有各種 2,4,8,16分頻選擇,也可以自己配置分頻;
但是 wakeup的計數寄存器只有 0-0xFFFF,計算一下,如果是32.768kHz的16分頻,也就是
頻率 32.768kHz */16=2048Hz
那麼 即使計數寄存器走滿,也只有
0xFFFF/2048Hz=31秒
31秒
這麼短算什麼男人!
區區31秒不能滿足我們!
額,是不能滿足的120s定時喚醒的要求。不過沒關係,自己動手,豐衣足食。
那就只能自己配置分頻了,計算公式都在手冊上:

這裏寫圖片描述
上面的這個RTCCLK = 32.768kHz,PREDIV_S配置爲 07,PREDIV_A配置爲 07,
分頻結果時鐘是 512hz;
然後設置 RTC_WAKEUPCOUNTER(TIME * 512); 時鐘配置結束
3.打開RTC wakeup
4.進入 STOP mode,設置WFI
這時要注意,進入STOP模式可以理解爲程序會暫停,直到中斷觸發退出STOP模式,程序會從剛剛停止的地方繼續運行;
5.默默等待120s,good,RTC中斷觸發了;
6.關閉RTCwakeup,並且反初始化RTC相關(就是各種不使能);
7.恢復之前關閉的外設;(大功告成)

二、STANDBY模式 +RTC
STANDBY 模式是最極限的低功耗模式了,內部SRAM也會斷電,換句話說,進入STANDBY 模式再喚醒是和重啓一樣的,所有在SRAM中的參數都會丟失,程序從頭開始;
代碼思路和STOP模式基本一致,但是有個很大的坑在這裏面:
基本流程:程序正在運行->配置並且開啓RTC中斷->進入STANDBY 模式->RTC中斷->程序從頭開始運行
以爲這樣就行了?圖樣圖森破!忘記了之前開啓RTC中斷!這個中斷並沒有關!所以一定要在程序從頭開始運行的時候把RTC中斷關上。
很簡單,在開頭加上一點處理:
⑴使能時鐘 APB1Periph PWR
⑵允許配置RTC
⑶然後就是關關關 RTC 時鐘,RTCwakeup使能!中斷使能等等!!!

最後是源碼,要啥源碼?不就是 ST的官方例程嘛。(手動滑稽)

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