你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

工程师笔记 | TouchGFX图形应用在亮屏时的低功耗实现

[复制链接]
STMCU-管管 发布时间:2021-12-28 10:20
1 图形应用和低功耗
, b1 X1 H% b' k% X: U2 x* W
7 z  O; U" }- O+ x. u; I/ @- ?
随着智能设备的普及,越来越多的设备会用到图形界面,而在STM32 MCU上使用TouchGFX,使得图形设计变得非常简单。其中智能手表、智能手环等产品对功耗要求比较高,这就需要在图形应用同时,结合芯片的低功耗模式来优化能耗。
/ V7 u% Y5 M$ u; u+ x" }. \
, m) K! n! b1 d0 N* ^4 ]2 p

+ M- h! f1 [% h0 ~" w% S在图形应用中使用低功耗,一般分为两种场景,一种是在关闭屏幕时,MCU进入STOP模式,能极大的降低MCU功耗;另一种是在屏幕亮着的状态,MCU进入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文将在STM32L4R9芯片上,结合TouchGFX和LPSLEEP来介绍如何在亮屏状态下实现MCU低功耗。
& d  B+ L* ?6 O: e2 f7 z  y3 H1 x1 M/ N  P. _3 O' T  @# y
2 低功耗实现原理介绍

# E! E' [+ c6 I- \

! p- d7 h# Z+ U' {) \在使用TouchGFX做图形应用时,会使用到FreeRTOS操作系统,使用SysTick定时产生1ms的中断来作为系统tick。在所有应用任务空闲时,系统会调度Idle任务。此时我们能让MCU进入低功耗,从而达到降低MCU功耗的目的。
7 w, h2 b  V3 u# y. j. r" i/ _+ o! }2 s

' K6 z" b: H' d- E; A  H7 I1 [& J
2.1  Tickless Idle

6 a& a% h; s3 s
6 I  F2 d7 E, K+ a0 [* a( r, {* V
FreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通过配置configUSE_TICKLESS_IDLE为不同的值来配置FreeRTOS是否在Idle任务里进入低功耗,默认为0表示不进入低功耗。
: g/ |% Y2 p( `+ K
6 v0 k6 P& I/ N* d8 w

: O0 c: w9 ~/ |; i' I本文中将配置为2,自定义Idle任务中低功耗实现。  v/ C5 g& ~  A3 u) a; h

# |/ l6 r0 e& `5 E# y! M) E
  R/ Q4 {" y( f' z1 a/ Z/ [
Table 1 Tickless Idle 配置
. u% i4 _3 ~- F+ S( t* L& r3 g, o: J" l9 S
FreeRTOS中进入低功耗具体是由vPortSuppressTicksAndSleep函数实现。配置configUSE_TICKLESS_IDLE 为 2 时,还需要重写 vPortSetupTimerInterrupt 函数。
* r- Z5 T$ e0 v
# Y6 E% ?( a# S; }
2.2 TouchGFX渲染与LPSLEEP限制
; R. i9 L+ J. k: |- S9 Q
) w/ x. m1 i" c. l% X: f+ [
根据参考手册描述,在进入LPSLEEP时要先切换到LPRUN模式,系统时钟要降低到2MHz,因此在进入、退出LPSLEEP时会有时钟的切换过程。5 ^1 }7 \' c6 `5 c$ i. `6 |% t
7 ]; e, \6 F! T% K
在屏幕亮着的状态时,用户可能随时触摸屏幕,或者系统信息可能更新,因此屏幕显示的内容可能随时变化,如果此时MCU进入LPSLEEP状态,会导致系统响应不及时。另外,在屏幕内容更新时,L4R9通过DSI向屏幕更新显示数据,此过程由硬件完成,在此过程中,软件也有可能会进入LPSLEEP,这样系统时钟发生变化,会导致DSI更新显示数据异常,产生屏幕显示花屏的问题。9 @* B, x- g+ L, e( `

, T' m/ f1 b/ Q为了避免以上问题,在进入LPSLEEP前会检查当前状态,如果用户未操作屏幕,TouchGFX已经完成渲染,DSI刷新过程也完成,则允许系统进入LPSLEEP状态。这样既保证了系统正常工作,又达到了降低功耗的目的。1 L% C  q/ R9 K9 z, H; ]  C

" A/ I! X/ X" u
3 实现过程
1 y. X3 ?/ H/ u4 t8 e& e
$ ^3 s  q5 ~) ]2 u* `4 e
重写vPortSetupTimerInterrupt函数,主要是设置与休眠时间补偿相关的变量,初始化systick寄存器:; r" h; b# j+ ~& P  b
14.png
Figure 1
$ d0 S) A* A6 |! M6 G; k" H
重写vPortSuppressTicksAndSleep函数。在进入LPSLEEP前,会停止systick,在休眠完成后,需要补偿系统tick值,示例中使用LPTIM计时来补偿系统tick值。在进入LPSLEEP前先进行状态检查,只要有以下情况,都不进入低功耗模式:
. a% L  _: X& ~2 }- \0 l3 d; T( }1 }7 d* N
a)    触摸事件产生:nosleep_flg& r) {8 F5 k) d- C/ `  @9 @
b)    DMA2D busy状态:isDMAbusy_a()
2 x3 z- A, g; Wc)    DSI refreshing状态:displayRefreshing
- @. ]: L% y* [: vd)    渲染完成,请求DSI 刷新:refreshRequested
; R, G: V, w$ F2 \
15.png
Figure 2

' w' C' U9 c' b6 C0 q7 T% `
3 Z! L$ j, S: L9 p4 S, H
TouchGFX渲染过程包括两部分,CPU渲染和DMA2D渲染。在CPU渲染过程中,TouchGFX任务处于执行状态,系统不会主动调度Idle任务。而在DMA2D渲染过TouchGFX会让出CPU,此时可能会切换到Idle任务执行,因此需要对DMA2D是否正在渲染进行判断。对DMA2D是否在渲染的判断如下:
) e: g4 z" U# G3 U# K8 o% |
16.png
Figure 3

. h. s  R, |% j3 _+ `3 ~3 b
小结
在TouchGFX图形应用中,在屏幕亮着的情况下如果需要优化功耗,可考虑结合FreeRTOS tickless模式,使用MCU的低功耗模式达到节能省电的目的。
( h  S& a; C! k, l
# e$ v1 t( T  U9 |. T7 k& a& {
收藏 1 评论0 发布时间:2021-12-28 10:20

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版