關(guān)于stm32單片機低功耗的實現(xiàn)和喚醒_第1頁
關(guān)于stm32單片機低功耗的實現(xiàn)和喚醒_第2頁
關(guān)于stm32單片機低功耗的實現(xiàn)和喚醒_第3頁
關(guān)于stm32單片機低功耗的實現(xiàn)和喚醒_第4頁
關(guān)于stm32單片機低功耗的實現(xiàn)和喚醒_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第第頁關(guān)于stm32單片機低功耗的實現(xiàn)和喚醒最近做的項目中要求低功耗,在單片機完成了手頭上的工作之后,就進入低功耗模式,項目的需求是單片機進入低功耗模式的時候系統(tǒng)時鐘從HSE切到HSI,但是在未進入低功耗模式之前引腳是什么狀態(tài),進入低功耗模式之后也不應(yīng)該改變。可以通過RTC定時喚醒,或者接收到串口數(shù)據(jù)就喚醒,處理完數(shù)據(jù)后再進入stop模式。查詢了一些資料之后,發(fā)現(xiàn)stop模式最符合項目需求。下面講述一下什么是低功耗:

一、stm32支持三種低功耗模式,可以在低功耗,短啟動,多種喚醒模式下尋找平衡。

1、SleepMode睡眠模式,只有CPU停止運行,所有的外設(shè)處于工作狀態(tài)并且可以在發(fā)生中斷/事件時喚醒CPU。

2、StopMode停機模式,保持SRAM和寄存器內(nèi)容不丟失,達到最低的電能消耗。停止所有內(nèi)部1.8V部分的供電,PLL、HSI的RC振蕩器和HSE晶體振蕩器被關(guān)閉,調(diào)壓器可以被置于普通模式或低功耗模式??梢酝ㄟ^任一EXTI從停機模式中喚醒,EXTI信號可以是16個外部I/O口之一、PVD的輸出、RTC鬧鐘或USB的喚醒信號。

3、StandbyMode待機模式。最低的電能消耗。內(nèi)部1.8V部分的供電被切斷;PLL、HSI的RC振蕩器和HSE晶體振蕩器關(guān)閉;SRAM和寄存器的內(nèi)容將消失,但后備寄存器的內(nèi)容仍然保留,待機電路仍工作。從待機模式退出的條件是:NRST上的外部復(fù)位信號、IWDG復(fù)位、WKUP引腳上的一個上升邊沿或RTC的鬧鐘到時。

二、低功耗模式基于HAL庫的常用API

2.1睡眠模式SleepMode

__HAL_RCC_PWR_CLK_ENABLE();//電源管理使能

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);//進入睡眠模式

2.2停機模式StopMode

__HAL_RCC_PWR_CLK_ENABLE();//電源管理使能

HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);//進入停機模式

2.3待機模式StandbyMode

__HAL_RCC_PWR_CLK_ENABLE();//電源管理使能

PWR_Check_Standby();//檢查是否是待機模式

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除喚醒標(biāo)志

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);//清除待機標(biāo)志

__HAL_PWR_GET_FLAG(PWR_FLAG_SB);//獲得待機模式標(biāo)志

HAL_PWR_EnterSTANDBYMode();//進入待機模式

以上相關(guān)描述參考/u010058695/article/details/100008613

三、Stop模式中遇到的一些問題及解決方法

1、沒有配置好喚醒機制,導(dǎo)致進入stop模式后沒能喚醒,導(dǎo)致無法識別到st-link,無法重新燒錄程序。即使重新上電也不能識別到st-link。

我在這個問題上栽了跟頭,因為單片機重新上電后依然不能識別到st-link,所以以為是單片機壞了,重新?lián)Q了單片機再燒錄同樣的程序,結(jié)果問題還是一樣,我開始意識到問題不是那么簡單,上網(wǎng)找了一下資料,才知道是進入stop模式后不能喚醒,具體的做法有幾種:

①可以將單片機的NRST引腳引出來,外接復(fù)位鍵。(關(guān)于引腳查看可用ST官方軟件STM32cubeMX,很方便)如圖:把NRST引出來通過一個按鍵連接到GND,當(dāng)進入STOP模式不能燒錄程序的時候只需要在按下按鍵后,點擊keil的

,然后松手即可。

②通過ISP的方式下載程序,必須將boot0接高電平,boot1(PB2)接低電平,然后必須斷電后重啟,此時單片機會進入ISP模式,就可以通過串口1(一般單片機都是只有串口1才可下載程序)再用flymcu等軟件燒入hex文件就可以了。

關(guān)于boot0和boot1,在每個stm32單片機都會有這兩個引腳,這兩個引腳在復(fù)位時的電平狀態(tài)決定了芯片在復(fù)位后從哪個區(qū)域開始執(zhí)行程序。

boot1=xboot0=0從用戶閃存啟動,這是正常的工作模式。

boot1=0boot0=1從系統(tǒng)存儲器啟動(進入ISP模式)。

boot1=1boot0=1從內(nèi)置SRAM啟動,這種模式可以用于調(diào)試。

如此一來,單片機無法進入正常的工作模式,就無法進行休眠,就可以通過ISP來下載程序。

③使用STlink燒寫程序,STlink至少要接4根線(SWDIO、SWCLK、GND、SW-RST),一般的下載程序只需要前三根就可以了,但是以防出現(xiàn)休眠無法喚醒的情況,這時有復(fù)位鍵就可以將SWDIO和SWCLK重置,如果板子設(shè)計沒有與SW-RST相對應(yīng)的,此時需要把單片機上的NRST引出來接到SW-RST上。下載程序之前boot0接高電平,boot1不用管(也需要斷電后重啟)。

下載配置這里按如下配置,RESET那里HWRESET和SYSRESETREQ任選一個。

配置好之后load一個空程序即可,不要再燒一個休眠的程序了,之后就可以正常燒程序了。

以上解決方法參考/geekjin/article/details/79232405,總結(jié)就是復(fù)位NRST這個引腳是最簡單的方法,以后做項目還是要提醒硬件工程師把這個引腳引出來。

2、項目需要單片機在進入stop模式后過5秒鐘就喚醒,實際上RTC鬧鐘中斷也是掛在EXTI中斷上的。我是用CubeMX配置的RTC,但是一直沒有喚醒,后面終于找到問題所在了:

紅色框框里的前三個應(yīng)該配置為Enable,第四個應(yīng)該配置為Disable,前三個是鬧鐘屏蔽星期,鬧鐘屏蔽小時,鬧鐘屏蔽分鐘,如果不是這樣配置的話,只能等到時間達到了設(shè)定好的某天某時某分某秒才能發(fā)生中斷,那么只能一周喚醒一次了。如果是這樣設(shè)置的話,就是一分鐘喚醒一次,那么怎么才能5秒鐘喚醒一次呢?我的做法是每次進入stop模式前就調(diào)用一次MX_RTC_Init()函數(shù)一次,因為我的時間是設(shè)置為x年x月x日星期xx時x分0秒,所以相當(dāng)于每次進入stop模式前初始化一次RTC,5秒鐘后就會發(fā)生鬧鐘中斷。這種辦法可能是比較笨的方法,但是好歹實現(xiàn)了這個功能哈哈

3、為了方便調(diào)試,我還配置了LED,每隔200ms閃爍一次,但是我發(fā)現(xiàn)從stop模式喚醒后燈的閃爍明顯變得很慢,而且串口數(shù)據(jù)的接收和發(fā)送也不能完成,這是為什么呢?

原來進入stop模式后系統(tǒng)時鐘默認(rèn)切換到內(nèi)部8M時鐘,所以頻率就會變慢了

我的解決方法是重新配置系統(tǒng)時鐘:/***************************************函數(shù)名稱:voidSYSCLKConfig_STOP(void)*函數(shù)功能:選擇HSE作為時鐘源*函數(shù)形參:無*函數(shù)返回值:無****************************************/voidSYSCLKConfig_STOP(void){__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY)==RESET){}/*使能PLL*/__HAL_RCC_PLL_ENABLE();/*等待PLL準(zhǔn)備就緒*/while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)==RESET){}/*選擇PLL作為系統(tǒng)時鐘源*/__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);/*等待PLL被選擇為系統(tǒng)時鐘源*/while(__HAL_RCC_GET_SYSCLK_SOURCE()!=0x08){}}

4、接收到串口數(shù)據(jù)后怎么喚醒stop模式?

其實RTC鬧鐘中斷喚醒stop模式也是因為鬧鐘事件是連接著外部中斷線的,但是串口接收中斷并不能喚醒stop模式啊,怎么辦?

解決方法有兩種,一種是在RX引腳上接上光耦連接到其他IO口上,把該IO口配置為外部中斷,但是這種方案比較麻煩,所以可以采取第二種方案,在進入stop模式之前把RX引腳配置為外部中斷模式,這樣的話,RX引腳上有電平變化的時候就會發(fā)生外部中斷,在服務(wù)函數(shù)中記得把RX引腳再配置為復(fù)用為UART的接收引腳。并且重新配置系統(tǒng)時鐘,選擇HSE為時鐘源。這樣就可以實現(xiàn)喚醒并接收數(shù)據(jù)了。但是因為第一次接收到串口數(shù)據(jù)的時候只能喚醒stop模式,并不能接收到數(shù)據(jù),所以應(yīng)該跟發(fā)送方約定好,一幀數(shù)據(jù)要發(fā)送兩次。而且中間要有一定間隔,我的間隔是500ms。這樣確

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論