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

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

[复制链接]
STMCU-管管 发布时间:2021-12-28 10:20
1 图形应用和低功耗
$ w2 Y' Q& v- S2 T2 V  j
; ]0 e. m. M3 i: \- o/ `3 m5 @
随着智能设备的普及,越来越多的设备会用到图形界面,而在STM32 MCU上使用TouchGFX,使得图形设计变得非常简单。其中智能手表、智能手环等产品对功耗要求比较高,这就需要在图形应用同时,结合芯片的低功耗模式来优化能耗。$ H0 u/ M. Q% ]( }

" l$ |4 U; c1 Y. H5 f

0 n$ M& B) |' }/ _$ z! u在图形应用中使用低功耗,一般分为两种场景,一种是在关闭屏幕时,MCU进入STOP模式,能极大的降低MCU功耗;另一种是在屏幕亮着的状态,MCU进入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文将在STM32L4R9芯片上,结合TouchGFX和LPSLEEP来介绍如何在亮屏状态下实现MCU低功耗。
5 n9 a  @$ V; n: o5 ^* U6 l- U* u( R( }* K; T$ {5 C3 `5 T; N4 w
2 低功耗实现原理介绍

2 e8 w9 [8 `* f
# t" i: n! J( T! ]
在使用TouchGFX做图形应用时,会使用到FreeRTOS操作系统,使用SysTick定时产生1ms的中断来作为系统tick。在所有应用任务空闲时,系统会调度Idle任务。此时我们能让MCU进入低功耗,从而达到降低MCU功耗的目的。" d$ c! }/ ?+ v  I

" l, b. F! z- M1 d, H# o/ L% h- S
8 G0 l) S( J( r& `- E7 r
2.1  Tickless Idle
6 d, Q& n- {5 C: }! s# H

/ l8 Z8 o; ]8 {% T* xFreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通过配置configUSE_TICKLESS_IDLE为不同的值来配置FreeRTOS是否在Idle任务里进入低功耗,默认为0表示不进入低功耗。
+ p+ J  A/ y+ g0 [& x, h  k" U$ ~" u8 l
. X3 \9 i0 }, T7 ~; X  q" ^
本文中将配置为2,自定义Idle任务中低功耗实现。
' l2 _0 F6 n0 k+ D9 Z! l6 Q. c' {# u* W5 r( }) M" `7 O

( U; k$ S. V  ?$ C6 W+ a1 `Table 1 Tickless Idle 配置
' z/ M2 C( s* f+ \2 K! C( J# B+ l9 M' B8 z, W/ R: R- }$ M0 ]
FreeRTOS中进入低功耗具体是由vPortSuppressTicksAndSleep函数实现。配置configUSE_TICKLESS_IDLE 为 2 时,还需要重写 vPortSetupTimerInterrupt 函数。
- _  a; ?6 j) @5 b& j+ a
5 Y- U0 }# c4 P/ z
2.2 TouchGFX渲染与LPSLEEP限制

1 H+ m. |/ C8 H0 }

! ?# r9 g( R( S根据参考手册描述,在进入LPSLEEP时要先切换到LPRUN模式,系统时钟要降低到2MHz,因此在进入、退出LPSLEEP时会有时钟的切换过程。7 {- ]: v) w+ b. b9 U

: f) ^; u% B( @) A# g9 `- @& h; {5 L在屏幕亮着的状态时,用户可能随时触摸屏幕,或者系统信息可能更新,因此屏幕显示的内容可能随时变化,如果此时MCU进入LPSLEEP状态,会导致系统响应不及时。另外,在屏幕内容更新时,L4R9通过DSI向屏幕更新显示数据,此过程由硬件完成,在此过程中,软件也有可能会进入LPSLEEP,这样系统时钟发生变化,会导致DSI更新显示数据异常,产生屏幕显示花屏的问题。4 Z+ a0 G6 l6 z* P. J5 _
& g& I- J6 W* i
为了避免以上问题,在进入LPSLEEP前会检查当前状态,如果用户未操作屏幕,TouchGFX已经完成渲染,DSI刷新过程也完成,则允许系统进入LPSLEEP状态。这样既保证了系统正常工作,又达到了降低功耗的目的。
0 @3 H; S3 L, x, e9 L: c; S% B  [' L% {5 d& F' G" R# l2 s& v! F
3 实现过程

7 X6 s# z& [: R, E- X

! c/ D2 j. j: Z: }- ?重写vPortSetupTimerInterrupt函数,主要是设置与休眠时间补偿相关的变量,初始化systick寄存器:
4 `/ b( g/ |. Q7 \
14.png
Figure 1

$ I5 s0 H. U/ F$ s: \重写vPortSuppressTicksAndSleep函数。在进入LPSLEEP前,会停止systick,在休眠完成后,需要补偿系统tick值,示例中使用LPTIM计时来补偿系统tick值。在进入LPSLEEP前先进行状态检查,只要有以下情况,都不进入低功耗模式:6 ~4 h! |. }4 k  J% v
1 z4 y% j" x6 D9 N. s0 {! _
a)    触摸事件产生:nosleep_flg
1 I$ ]0 ^' r6 r1 e5 w2 e; qb)    DMA2D busy状态:isDMAbusy_a()
. I: E! S( [8 y, Q( Y  Jc)    DSI refreshing状态:displayRefreshing* \' b& S: B9 Y1 v# }2 Z( r! Q
d)    渲染完成,请求DSI 刷新:refreshRequested
) a- O7 @! c% d9 L$ R8 Y
15.png
Figure 2

$ @8 a# J. m5 l9 N& \3 Z# n0 e$ n
5 ?3 a# ^9 u: u$ J
TouchGFX渲染过程包括两部分,CPU渲染和DMA2D渲染。在CPU渲染过程中,TouchGFX任务处于执行状态,系统不会主动调度Idle任务。而在DMA2D渲染过TouchGFX会让出CPU,此时可能会切换到Idle任务执行,因此需要对DMA2D是否正在渲染进行判断。对DMA2D是否在渲染的判断如下:
0 `9 S! Q; x( J3 y' O! W: x# v, d
16.png
Figure 3
1 @8 q  R- a9 z% F" J8 _
小结
在TouchGFX图形应用中,在屏幕亮着的情况下如果需要优化功耗,可考虑结合FreeRTOS tickless模式,使用MCU的低功耗模式达到节能省电的目的。
1 H. @! J2 `% E5 v% Q" {" t" L4 n1 i8 j7 M* h' g
收藏 1 评论0 发布时间:2021-12-28 10:20

举报

0个回答

所属标签

相似技术帖

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