概述
越來越多的芯片設計人員將ARM Cortex-M0和Cortex-M0+處理器用在多種超低功耗(ULP)微控制器和片上系統(tǒng)產品中。這里詳細的介紹如何利用這些特性,以及在設計自己的低功耗應用時應注意什么。
那么軟件開發(fā)人員需要理解的一個關鍵問題是,低功耗特性是和具體設備相關的。開發(fā)板人員需要參考微控制器供應商的應用筆記和例子,才能了解到可用的低功耗特性。
進入休眠模式
Cortex-M0和Cortex-M0+處理器默認支持一個休眠模式和一個嘗試休眠模式,不過需要注意的是,微控制器供應商可以利用設備相關的可編程寄存器定義其他的休眠模式。在處理器內部,休眠模式和深度休眠模式的選擇由系統(tǒng)控制寄存器中的SLEEPDEEP位決定。
如果用的是符合CMSIS的設備驅動庫,系統(tǒng)控制寄存器可以通過“SCB->SCR”來訪問。例如,要使能深度休眠模式,可以使用下面的語句
SCB-> |= SCB_SCR_SLEEPDEEP_Ms; //使能深度休眠特性
系統(tǒng)控制寄存器只支持字大小的傳輸。
微控制器的普通休眠模式和深度休眠模式的實際區(qū)別取決于芯片系統(tǒng)設計,例如,普通休眠中一些時鐘信號可能會被關掉,而深度休眠則可能會降低存儲器塊的電壓且可能會關掉系統(tǒng)中的其他部件。
在選擇了休眠模式后,可以利用WFE(等待事件)或WFI(等待中斷)指令來進入休眠模式,為了提高可移植性,建議在執(zhí)行WFI/WFE指令前加上一個DSB(數據同步屏障)指令(對于其他高性能處理器,進入休眠前可能還會有未完成的存儲傳輸)。
多數情況下,微控制器供應商的設備驅動庫中包含了進入低功耗模式的函數,并且已經為對應的微控制器做了一定的處理。利用這些函數可以使微控制器得到最高等級的功耗優(yōu)化。
但是,如果開發(fā)的C代碼要具有在多個Cortex-M微控制器間的可移植性,可以使用下面的CMSIS函數來直接訪問WFE和WFI指令:
指令 | CMSIS函數 |
---|---|
WFE | __WFE(); |
WFI | __WFI(): |
如果未使用符合CMSIS的設備驅動,可以使用C編譯器提供的內在函數或者內聯匯編來生成WFE和WFI指令。此時,軟件代碼和工具鍵相關,且可移植性不高。例如KeilMDK-ARM和ARM-DS-5提供了如下面的內在函數(和CMSIS版本不同,它們是小寫格式的)。
指令 | KeilMDK-ARM或ARM-DS-5的內在函數 |
---|---|
WFE | __wfe(); |
WFI | __wfi(): |
從架構的角度來看,DSB指令要在WFE和WFI前執(zhí)行,這樣可以確保完成的數據存儲指令(如緩沖寫)在進入休眠前結束。然而,對于現有的Cortex-M0和Cortext-M0+處理器,不使用DSB也不會引起什么問題。
由于WFE可由各種事件喚醒,其中包括過去發(fā)生的事件,且一般用于空循環(huán)。例如
while(processing_required()==0)
{
__DSB(); //推薦使用存儲器屏障以提高可移植性
__WFE();
}
匯編編程環(huán)境用戶可以直接在匯編代碼中使用WFE和WFI指令。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19259瀏覽量
229649 -
低功耗
+關注
關注
10文章
2396瀏覽量
103670 -
Cortex-M0
+關注
關注
4文章
124瀏覽量
38672
發(fā)布評論請先 登錄
相關推薦
評論