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

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

[复制链接]
STMCU-管管 发布时间:2021-12-28 10:20
1 图形应用和低功耗
0 R1 {- f' D1 v6 l7 Z% X0 t/ B$ E
3 i8 o  B3 N3 Y5 ?- v2 u
随着智能设备的普及,越来越多的设备会用到图形界面,而在STM32 MCU上使用TouchGFX,使得图形设计变得非常简单。其中智能手表、智能手环等产品对功耗要求比较高,这就需要在图形应用同时,结合芯片的低功耗模式来优化能耗。$ \4 `2 Z; z9 {! u& |8 ]( H7 l

2 f* s) {  ~6 e5 r: {) P2 l5 n1 p
" [, D# Y! p. c- T$ ], ]
在图形应用中使用低功耗,一般分为两种场景,一种是在关闭屏幕时,MCU进入STOP模式,能极大的降低MCU功耗;另一种是在屏幕亮着的状态,MCU进入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文将在STM32L4R9芯片上,结合TouchGFX和LPSLEEP来介绍如何在亮屏状态下实现MCU低功耗。
' g$ H2 h- [* T% v. L/ e% M  `. P. A# _! b- A. i
2 低功耗实现原理介绍

2 q; Y& W$ ]2 U

1 [. h: e2 u4 ~4 x3 @& E% i: M* L在使用TouchGFX做图形应用时,会使用到FreeRTOS操作系统,使用SysTick定时产生1ms的中断来作为系统tick。在所有应用任务空闲时,系统会调度Idle任务。此时我们能让MCU进入低功耗,从而达到降低MCU功耗的目的。6 V2 p  |+ h0 ~# c- y
; ~) ?: H" X- X

5 R; C6 T9 s, ?& b* h
2.1  Tickless Idle

) K; P7 ]3 C# e! N4 j! R/ B2 F
% z( h2 _. N  o% [' ^
FreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通过配置configUSE_TICKLESS_IDLE为不同的值来配置FreeRTOS是否在Idle任务里进入低功耗,默认为0表示不进入低功耗。
9 g. J# R8 y; ^3 l8 W+ h- N' f
: O& d: t. U0 B1 V" B

- Q. B% V, c( V2 \( f本文中将配置为2,自定义Idle任务中低功耗实现。; O8 O, b; h% b4 s9 D, `
4 ?( V$ A* s4 g0 |% O% B* p
' a0 C% i9 U- _  E2 P4 @0 ], M
Table 1 Tickless Idle 配置% [2 G( T' n% e% `6 E% O
& l  T1 B* M3 R+ w
FreeRTOS中进入低功耗具体是由vPortSuppressTicksAndSleep函数实现。配置configUSE_TICKLESS_IDLE 为 2 时,还需要重写 vPortSetupTimerInterrupt 函数。6 {  n6 L' q2 E9 d: x- g1 @2 N
: B) d% \& h. [  O& y
2.2 TouchGFX渲染与LPSLEEP限制
  f4 @7 q) i. D( F

) `/ N0 O0 T" A( p5 m' v4 E) ?根据参考手册描述,在进入LPSLEEP时要先切换到LPRUN模式,系统时钟要降低到2MHz,因此在进入、退出LPSLEEP时会有时钟的切换过程。1 N, y) M# N& G& G+ b- l8 ^

$ F  B, B/ h' ?9 {) a/ K在屏幕亮着的状态时,用户可能随时触摸屏幕,或者系统信息可能更新,因此屏幕显示的内容可能随时变化,如果此时MCU进入LPSLEEP状态,会导致系统响应不及时。另外,在屏幕内容更新时,L4R9通过DSI向屏幕更新显示数据,此过程由硬件完成,在此过程中,软件也有可能会进入LPSLEEP,这样系统时钟发生变化,会导致DSI更新显示数据异常,产生屏幕显示花屏的问题。
  e9 b. u$ j3 A5 Q& H, p" b. q# R1 f5 y4 k9 Y6 \
为了避免以上问题,在进入LPSLEEP前会检查当前状态,如果用户未操作屏幕,TouchGFX已经完成渲染,DSI刷新过程也完成,则允许系统进入LPSLEEP状态。这样既保证了系统正常工作,又达到了降低功耗的目的。. i7 M& o& h- O2 |

7 v6 O. z( |: |# H8 h; D/ h
3 实现过程
" s7 E( b5 b" g% B
3 ]8 @0 e0 C& v# T! I# ~
重写vPortSetupTimerInterrupt函数,主要是设置与休眠时间补偿相关的变量,初始化systick寄存器:
! X' x% t: `, k! B0 E. k
14.png
Figure 1

) t4 e, }5 {3 J  {1 ~% d1 w. L重写vPortSuppressTicksAndSleep函数。在进入LPSLEEP前,会停止systick,在休眠完成后,需要补偿系统tick值,示例中使用LPTIM计时来补偿系统tick值。在进入LPSLEEP前先进行状态检查,只要有以下情况,都不进入低功耗模式:
2 J/ X! T& I. M& ~  h- L$ d2 z7 J' j( X1 R8 p  I1 k: R) n
a)    触摸事件产生:nosleep_flg
) d' J! G1 X; ^b)    DMA2D busy状态:isDMAbusy_a()% j% s- O1 g8 o) V' _- j
c)    DSI refreshing状态:displayRefreshing, o" |$ Y! Q9 L( K) g/ }# |% x$ U
d)    渲染完成,请求DSI 刷新:refreshRequested
7 S0 I. O3 a! o. y- |/ {
15.png
Figure 2
, [4 ^: Y# B( q$ ^9 R/ D1 f
7 Q& B2 C7 R. H/ Z5 G4 t
TouchGFX渲染过程包括两部分,CPU渲染和DMA2D渲染。在CPU渲染过程中,TouchGFX任务处于执行状态,系统不会主动调度Idle任务。而在DMA2D渲染过TouchGFX会让出CPU,此时可能会切换到Idle任务执行,因此需要对DMA2D是否正在渲染进行判断。对DMA2D是否在渲染的判断如下:
5 W! y" t" ?9 G8 |6 P, s
16.png
Figure 3

' y9 \7 o6 b8 @0 g  A- l
小结
在TouchGFX图形应用中,在屏幕亮着的情况下如果需要优化功耗,可考虑结合FreeRTOS tickless模式,使用MCU的低功耗模式达到节能省电的目的。 5 E* M- z, z# r
7 i; w( s8 n- c
赞 收藏 1 评论0 发布时间:2021-12-28 10:20

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版