江科大學(xué)習(xí)筆記 _17.低功耗
一、修改主頻
????看一下STM32標(biāo)準(zhǔn)庫提供的system_stm32f10x.h和system_stm32f10x.c兩個(gè)文件
它們提供了?SystemInit()和SystemCoreClockUpdate()兩個(gè)可供外部調(diào)用的函數(shù)和
提供了一個(gè)SystemCoreClock可供外部調(diào)用的變量。
SystemInit():用來配置時(shí)鐘樹
SystemCoreClock:表示主頻頻率的值
SystemCoreClockUpdate():根據(jù)當(dāng)前時(shí)鐘樹的配置,更新SystemCoreClock,也就是更新主頻頻率的值。
????看一下SystemInit()函數(shù):

SystemInit()中 ,在各種恢復(fù)默認(rèn)配置之后,調(diào)用了如下函數(shù):

追進(jìn)去看:
根據(jù)不同的宏定義,執(zhí)行不同的配置函數(shù)
所以 只要對(duì)?宏定義 進(jìn)行 注釋或解除注釋,就能修改主頻

繼續(xù)追進(jìn)去看:





最后,如果設(shè)置HSE失敗,那么就會(huì)使用HSI作為時(shí)鐘(8M),
用戶可以在HSE設(shè)置失敗里添加一些調(diào)試代碼,失敗的原因可以找找外部晶振問題。
以上就是SystemInit()函數(shù)進(jìn)行的操作。
查看系統(tǒng)主頻:這里使用了江科大的OLED顯示工程
顯示是72M,正確
在查看SystemInit()函數(shù)中說過,對(duì)宏定義進(jìn)行注釋或解除注釋,就能修改主頻

把system_stm32f10x.h和system_stm32f10x.c兩個(gè)文件的只讀屬性去掉,修改注釋。

顯示是36M,修改完成。
修改主頻后,涉及時(shí)間的計(jì)算都需要修改,所以謹(jǐn)慎修改主頻。
二、睡眠模式

睡眠模式:CPU關(guān),外設(shè)繼續(xù)運(yùn)行;可以產(chǎn)生中斷
這里使用睡眠模式來省電,在之前的串口發(fā)送接收工程上進(jìn)行代碼修改添加:
追進(jìn)去看:

在while()循環(huán)最后添加?????__WFI();????睡眠模式就完成了。
三、停止模式
查看標(biāo)準(zhǔn)庫pwr頭文件????stm32f1.x_pwr.h
這里使用江科大的紅外計(jì)次工程

使用了PWR_EnterSTOPMode()函數(shù),追進(jìn)去查看:

第一個(gè)參數(shù)是:低功耗還是停止模式
第二個(gè)參數(shù)是:喚醒是中斷還是事件
開啟PWR時(shí)鐘:
開啟停止模式,中斷觸發(fā):

退出停止模式之后,會(huì)默認(rèn)使用HSI時(shí)鐘,導(dǎo)致程序運(yùn)行變慢,
要恢復(fù)HSE時(shí)鐘,只需要再調(diào)用一次SystemInit(),在最后加上
四、待機(jī)模式
這里使用江科大的RTC實(shí)時(shí)時(shí)鐘工程,設(shè)置一個(gè)鬧鐘,在鬧鐘時(shí)間到達(dá)后從待機(jī)模式喚醒。
修改如下:

1.設(shè)定一個(gè)10s的鬧鐘

到設(shè)定時(shí)間后,鬧鐘標(biāo)志位置一,
使用RTC_GetFlagStatus(RTC_FLAG_ALR)函數(shù)查看?鬧鐘標(biāo)志位
代碼如下:
當(dāng)CNT等于ALR時(shí),ALRF標(biāo)志位置一。
2.添加待機(jī)功能
需要開啟pwr時(shí)鐘
在stm32f1.x_pwr.h? 頭文件中:

整體代碼如下:

每次鬧鐘時(shí)間到達(dá)后程序運(yùn)行一次,之后進(jìn)入待機(jī)模式。