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

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

[复制链接]
STMCU-管管 发布时间:2021-12-28 10:20
1 图形应用和低功耗

' t, D* _1 v5 f: v9 X
* L* R, j9 d" N+ Y* g$ K
随着智能设备的普及,越来越多的设备会用到图形界面,而在STM32 MCU上使用TouchGFX,使得图形设计变得非常简单。其中智能手表、智能手环等产品对功耗要求比较高,这就需要在图形应用同时,结合芯片的低功耗模式来优化能耗。
8 o4 i* Q5 h; s, T! D6 H" G& {  u2 t+ U6 |

( `0 d) i2 }! [5 P在图形应用中使用低功耗,一般分为两种场景,一种是在关闭屏幕时,MCU进入STOP模式,能极大的降低MCU功耗;另一种是在屏幕亮着的状态,MCU进入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文将在STM32L4R9芯片上,结合TouchGFX和LPSLEEP来介绍如何在亮屏状态下实现MCU低功耗。% ]9 r* t  d5 g. i& z+ D% ]

) O/ Y8 {& k0 @% E  p+ }
2 低功耗实现原理介绍

- L7 q+ k& o: D$ o$ p

& p! X- m3 S, x; C% ?: F在使用TouchGFX做图形应用时,会使用到FreeRTOS操作系统,使用SysTick定时产生1ms的中断来作为系统tick。在所有应用任务空闲时,系统会调度Idle任务。此时我们能让MCU进入低功耗,从而达到降低MCU功耗的目的。9 o7 t; H; i0 t. [3 V, U0 Q7 K

( p: K+ A! l/ H+ l& g* r1 Y

$ c) _: B0 E; }/ i1 W6 t
2.1  Tickless Idle

& d9 y5 g" X% t) O2 a7 [' |
' _7 u0 D" Z. u2 u  Z9 ~" i9 U
FreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通过配置configUSE_TICKLESS_IDLE为不同的值来配置FreeRTOS是否在Idle任务里进入低功耗,默认为0表示不进入低功耗。
; s; i3 J/ `, b3 {0 `9 N' L
* m; n- Z1 o! `7 s7 O' [
/ \. Z$ c6 o0 A+ u" j; V
本文中将配置为2,自定义Idle任务中低功耗实现。) g4 |4 \( ^! g
/ z+ \' D; M5 C# }9 r2 j
; B/ h8 j9 ]' o* y+ \! v
Table 1 Tickless Idle 配置
& f" X) T8 h. r  u3 {4 _# u+ N! A; m3 m$ @# E& J$ z9 {. ~
FreeRTOS中进入低功耗具体是由vPortSuppressTicksAndSleep函数实现。配置configUSE_TICKLESS_IDLE 为 2 时,还需要重写 vPortSetupTimerInterrupt 函数。
' N: ]% |/ L1 m9 p0 O
5 \3 G' n# t5 S$ H( q
2.2 TouchGFX渲染与LPSLEEP限制

. U/ r7 L3 d. V* e% |: ?- C  b

9 [+ g, p6 C2 B. x4 W6 Y$ d' i根据参考手册描述,在进入LPSLEEP时要先切换到LPRUN模式,系统时钟要降低到2MHz,因此在进入、退出LPSLEEP时会有时钟的切换过程。3 ]$ h7 |7 x  o+ |

0 e4 P( M& p1 Y9 M% e' i在屏幕亮着的状态时,用户可能随时触摸屏幕,或者系统信息可能更新,因此屏幕显示的内容可能随时变化,如果此时MCU进入LPSLEEP状态,会导致系统响应不及时。另外,在屏幕内容更新时,L4R9通过DSI向屏幕更新显示数据,此过程由硬件完成,在此过程中,软件也有可能会进入LPSLEEP,这样系统时钟发生变化,会导致DSI更新显示数据异常,产生屏幕显示花屏的问题。/ r" m6 t7 `- j! w1 \, Z: [

* B/ \! k: F9 b8 l: ~5 f% u为了避免以上问题,在进入LPSLEEP前会检查当前状态,如果用户未操作屏幕,TouchGFX已经完成渲染,DSI刷新过程也完成,则允许系统进入LPSLEEP状态。这样既保证了系统正常工作,又达到了降低功耗的目的。
& a) Z" A' S5 P1 j5 P' o9 d( D, Q0 Q
3 实现过程
. N# ^5 W5 _& o- Z, @  `" \
: [: `  K7 K& W( I6 K
重写vPortSetupTimerInterrupt函数,主要是设置与休眠时间补偿相关的变量,初始化systick寄存器:
+ C, z# Q2 _# Z6 M$ z- c
14.png
Figure 1
5 A) Z. n# Y4 L
重写vPortSuppressTicksAndSleep函数。在进入LPSLEEP前,会停止systick,在休眠完成后,需要补偿系统tick值,示例中使用LPTIM计时来补偿系统tick值。在进入LPSLEEP前先进行状态检查,只要有以下情况,都不进入低功耗模式:
  F7 x, k0 P+ M4 j2 k; A9 K# }) K1 z8 M3 a: b0 Y9 p5 G* Z
a)    触摸事件产生:nosleep_flg
7 \/ d% F' R1 n- f% j  \6 zb)    DMA2D busy状态:isDMAbusy_a()
) P# ]: Y8 p5 v+ k6 R; R, Cc)    DSI refreshing状态:displayRefreshing
; P3 z) q: i/ i' l' Yd)    渲染完成,请求DSI 刷新:refreshRequested
& M& u2 R/ f4 L3 Y1 J% q
15.png
Figure 2

) E$ {$ D& i& ?' i! A( ]+ ?; p
$ B2 }5 x$ }9 [9 c  Y
TouchGFX渲染过程包括两部分,CPU渲染和DMA2D渲染。在CPU渲染过程中,TouchGFX任务处于执行状态,系统不会主动调度Idle任务。而在DMA2D渲染过TouchGFX会让出CPU,此时可能会切换到Idle任务执行,因此需要对DMA2D是否正在渲染进行判断。对DMA2D是否在渲染的判断如下:. b3 O3 ~0 c! \2 ?  t
16.png
Figure 3
+ U, [! T2 N0 A' ^, M
小结
在TouchGFX图形应用中,在屏幕亮着的情况下如果需要优化功耗,可考虑结合FreeRTOS tickless模式,使用MCU的低功耗模式达到节能省电的目的。
7 B" X; \* i4 o  e5 g
5 @4 B& T- W9 Z" ^
收藏 1 评论0 发布时间:2021-12-28 10:20

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版