请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU-管管 发布时间:2021-12-28 10:20
1 图形应用和低功耗
. G" U6 J' h& T' V& z8 g

# f+ R6 P( }! \! E随着智能设备的普及,越来越多的设备会用到图形界面,而在STM32 MCU上使用TouchGFX,使得图形设计变得非常简单。其中智能手表、智能手环等产品对功耗要求比较高,这就需要在图形应用同时,结合芯片的低功耗模式来优化能耗。
+ c& N7 ]9 k9 v
0 O$ J# ^! H: w% z0 R

7 {# l0 @/ e! o, P) S7 k! ^+ N在图形应用中使用低功耗,一般分为两种场景,一种是在关闭屏幕时,MCU进入STOP模式,能极大的降低MCU功耗;另一种是在屏幕亮着的状态,MCU进入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文将在STM32L4R9芯片上,结合TouchGFX和LPSLEEP来介绍如何在亮屏状态下实现MCU低功耗。
+ _  @* ]/ |! k/ {/ ]% E& I( C7 Y) g5 I& Q- h' {# E, l7 U6 b
2 低功耗实现原理介绍

, j" N+ x6 s# z" t9 l( f
% c0 {/ u& c7 M/ C& O7 J
在使用TouchGFX做图形应用时,会使用到FreeRTOS操作系统,使用SysTick定时产生1ms的中断来作为系统tick。在所有应用任务空闲时,系统会调度Idle任务。此时我们能让MCU进入低功耗,从而达到降低MCU功耗的目的。3 n  T0 B% _( `1 x& B3 z6 U

( R1 \- {5 Q( y1 N& @, }3 x

+ m/ W, \- D! m
2.1  Tickless Idle

4 Q0 ?. R1 |. m  m

$ T  P$ O9 H" b# A( PFreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通过配置configUSE_TICKLESS_IDLE为不同的值来配置FreeRTOS是否在Idle任务里进入低功耗,默认为0表示不进入低功耗。
1 Z3 {% i, _* Y6 c3 x! E  d4 @1 N; c4 ]& T0 g! p. W) o

, W6 e' r4 L. Z* T! O本文中将配置为2,自定义Idle任务中低功耗实现。+ j& S) _0 }( x2 q4 |+ _
1 J( V- j- A- k; @

. _8 L# R1 t2 U$ YTable 1 Tickless Idle 配置
8 W- U' ^7 ^$ c; C0 P( C3 w. `5 r/ I  b
/ j* y8 Z, @4 N* g5 XFreeRTOS中进入低功耗具体是由vPortSuppressTicksAndSleep函数实现。配置configUSE_TICKLESS_IDLE 为 2 时,还需要重写 vPortSetupTimerInterrupt 函数。
* W- x5 T4 h% n* E) \% `  F5 w. e" b5 L0 E
2.2 TouchGFX渲染与LPSLEEP限制
  J3 C7 W# s5 o* I8 j" q
4 m$ a9 B: C0 B, [
根据参考手册描述,在进入LPSLEEP时要先切换到LPRUN模式,系统时钟要降低到2MHz,因此在进入、退出LPSLEEP时会有时钟的切换过程。
6 `' O/ l1 l% H1 \5 }
  i* P4 b: e& j0 t* X& \% p% v在屏幕亮着的状态时,用户可能随时触摸屏幕,或者系统信息可能更新,因此屏幕显示的内容可能随时变化,如果此时MCU进入LPSLEEP状态,会导致系统响应不及时。另外,在屏幕内容更新时,L4R9通过DSI向屏幕更新显示数据,此过程由硬件完成,在此过程中,软件也有可能会进入LPSLEEP,这样系统时钟发生变化,会导致DSI更新显示数据异常,产生屏幕显示花屏的问题。
7 Z% b0 j0 J7 d3 P: `+ P' `3 R  p2 r
为了避免以上问题,在进入LPSLEEP前会检查当前状态,如果用户未操作屏幕,TouchGFX已经完成渲染,DSI刷新过程也完成,则允许系统进入LPSLEEP状态。这样既保证了系统正常工作,又达到了降低功耗的目的。
# ~: Q7 a' C1 {% g5 L* }0 Q5 K: }: s2 ^: T
3 实现过程

, p- [/ b6 J- N/ |8 z. L

, P4 v0 X- y- Q3 e5 U重写vPortSetupTimerInterrupt函数,主要是设置与休眠时间补偿相关的变量,初始化systick寄存器:& |9 P' b2 @6 s3 y- ^
14.png
Figure 1
/ Q1 T( `. @5 |8 b7 H* G9 T
重写vPortSuppressTicksAndSleep函数。在进入LPSLEEP前,会停止systick,在休眠完成后,需要补偿系统tick值,示例中使用LPTIM计时来补偿系统tick值。在进入LPSLEEP前先进行状态检查,只要有以下情况,都不进入低功耗模式:& [$ h! n: z# o8 u$ l
6 z: n1 V) x/ i3 [$ w! {# w
a)    触摸事件产生:nosleep_flg
: q* K, `: q/ ^9 _0 T$ nb)    DMA2D busy状态:isDMAbusy_a()
3 {7 N$ N# ]& |# u, @! }c)    DSI refreshing状态:displayRefreshing: n- q+ {3 B5 I
d)    渲染完成,请求DSI 刷新:refreshRequested
1 b0 c3 d, ?5 }
15.png
Figure 2
! u" w) H0 Z# `5 _. ~6 m1 K, Q
# V( N+ k7 x; ^7 M: _1 n7 U
TouchGFX渲染过程包括两部分,CPU渲染和DMA2D渲染。在CPU渲染过程中,TouchGFX任务处于执行状态,系统不会主动调度Idle任务。而在DMA2D渲染过TouchGFX会让出CPU,此时可能会切换到Idle任务执行,因此需要对DMA2D是否正在渲染进行判断。对DMA2D是否在渲染的判断如下:. |* w5 d8 v( `* m% \6 }' u6 u; W
16.png
Figure 3

2 W( X/ [4 Q* n* ~
小结
在TouchGFX图形应用中,在屏幕亮着的情况下如果需要优化功耗,可考虑结合FreeRTOS tickless模式,使用MCU的低功耗模式达到节能省电的目的。 3 v: i4 Q+ {4 x8 \' h* Q
/ t# A7 U5 |3 ~0 k' r" {- e( k3 b
收藏 1 评论0 发布时间:2021-12-28 10:20

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版