關(guān)鍵詞:
TouchGFX, Low Power
1 圖形應(yīng)用和低功耗
隨著智能設(shè)備的普及,越來越多的設(shè)備會(huì)用到圖形界面,而在STM32 MCU上使用TouchGFX,使得圖形設(shè)計(jì)變得非常簡單。其中智能手表、智能手環(huán)等產(chǎn)品對(duì)功耗要求比較高,這就需要在圖形應(yīng)用同時(shí),結(jié)合芯片的低功耗模式來優(yōu)化能耗。
在圖形應(yīng)用中使用低功耗,一般分為兩種場(chǎng)景,一種是在關(guān)閉屏幕時(shí),MCU進(jìn)入STOP模式,能極大的降低MCU功耗;另一種是在屏幕亮著的狀態(tài),MCU進(jìn)入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文將在STM32L4R9芯片上,結(jié)合TouchGFX和LPSLEEP來介紹如何在亮屏狀態(tài)下實(shí)現(xiàn)MCU低功耗。
2 低功耗實(shí)現(xiàn)原理介紹
在使用TouchGFX做圖形應(yīng)用時(shí),會(huì)使用到FreeRTOS操作系統(tǒng),使用SysTick定時(shí)產(chǎn)生1ms的中斷來作為系統(tǒng)tick。在所有應(yīng)用任務(wù)空閑時(shí),系統(tǒng)會(huì)調(diào)度Idle任務(wù)。此時(shí)我們能讓MCU進(jìn)入低功耗,從而達(dá)到降低MCU功耗的目的。
2.1 ?Tickless Idle
FreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通過配置configUSE_TICKLESS_IDLE為不同的值來配置FreeRTOS是否在Idle任務(wù)里進(jìn)入低功耗,默認(rèn)為0表示不進(jìn)入低功耗。
本文中將配置為2,自定義Idle任務(wù)中低功耗實(shí)現(xiàn)。
Table 1 Tickless Idle 配置
FreeRTOS中進(jìn)入低功耗具體是由vPortSuppressTicksAndSleep函數(shù)實(shí)現(xiàn)。配置configUSE_TICKLESS_IDLE 為 2 時(shí),還需要重寫 vPortSetupTimerInterrupt 函數(shù)。
2.2 TouchGFX渲染與LPSLEEP限制
根據(jù)參考手冊(cè)描述,在進(jìn)入LPSLEEP時(shí)要先切換到LPRUN模式,系統(tǒng)時(shí)鐘要降低到2MHz,因此在進(jìn)入、退出LPSLEEP時(shí)會(huì)有時(shí)鐘的切換過程。
在屏幕亮著的狀態(tài)時(shí),用戶可能隨時(shí)觸摸屏幕,或者系統(tǒng)信息可能更新,因此屏幕顯示的內(nèi)容可能隨時(shí)變化,如果此時(shí)MCU進(jìn)入LPSLEEP狀態(tài),會(huì)導(dǎo)致系統(tǒng)響應(yīng)不及時(shí)。另外,在屏幕內(nèi)容更新時(shí),L4R9通過DSI向屏幕更新顯示數(shù)據(jù),此過程由硬件完成,在此過程中,軟件也有可能會(huì)進(jìn)入LPSLEEP,這樣系統(tǒng)時(shí)鐘發(fā)生變化,會(huì)導(dǎo)致DSI更新顯示數(shù)據(jù)異常,產(chǎn)生屏幕顯示花屏的問題。
為了避免以上問題,在進(jìn)入LPSLEEP前會(huì)檢查當(dāng)前狀態(tài),如果用戶未操作屏幕,TouchGFX已經(jīng)完成渲染,DSI刷新過程也完成,則允許系統(tǒng)進(jìn)入LPSLEEP狀態(tài)。這樣既保證了系統(tǒng)正常工作,又達(dá)到了降低功耗的目的。
3 實(shí)現(xiàn)過程
重寫vPortSetupTimerInterrupt函數(shù),主要是設(shè)置與休眠時(shí)間補(bǔ)償相關(guān)的變量,初始化systick寄存器:

Figure 1
重寫vPortSuppressTicksAndSleep函數(shù)。在進(jìn)入LPSLEEP前,會(huì)停止systick,在休眠完成后,需要補(bǔ)償系統(tǒng)tick值,示例中使用LPTIM計(jì)時(shí)來補(bǔ)償系統(tǒng)tick值。在進(jìn)入LPSLEEP前先進(jìn)行狀態(tài)檢查,只要有以下情況,都不進(jìn)入低功耗模式:
a)??? 觸摸事件產(chǎn)生:nosleep_flg
b)??? DMA2D busy狀態(tài):isDMAbusy_a()
c)??? DSI refreshing狀態(tài):displayRefreshing
d)??? 渲染完成,請(qǐng)求DSI 刷新:refreshRequested

Figure 2
TouchGFX渲染過程包括兩部分,CPU渲染和DMA2D渲染。在CPU渲染過程中,TouchGFX任務(wù)處于執(zhí)行狀態(tài),系統(tǒng)不會(huì)主動(dòng)調(diào)度Idle任務(wù)。而在DMA2D渲染過TouchGFX會(huì)讓出CPU,此時(shí)可能會(huì)切換到Idle任務(wù)執(zhí)行,因此需要對(duì)DMA2D是否正在渲染進(jìn)行判斷。對(duì)DMA2D是否在渲染的判斷如下:

Figure 3
小結(jié)
在TouchGFX圖形應(yīng)用中,在屏幕亮著的情況下如果需要優(yōu)化功耗,可考慮結(jié)合FreeRTOS tickless模式,使用MCU的低功耗模式達(dá)到節(jié)能省電的目的。
? ? ? ? ? ? ? ??
? THE END
▽點(diǎn)擊“閱讀原文”,可下載原文檔