|
1 图形应用和低功耗 随着智能设备的普及,越来越多的设备会用到图形界面,而在STM32 MCU上使用TouchGFX,使得图形设计变得非常简单。其中智能手表、智能手环等产品对功耗要求比较高,这就需要在图形应用同时,结合芯片的低功耗模式来优化能耗。 在图形应用中使用低功耗,一般分为两种场景,一种是在关闭屏幕时,MCU进入STOP模式,能极大的降低MCU功耗;另一种是在屏幕亮着的状态,MCU进入SLEEP模式,也能降低MCU功耗。而在STM32L4+芯片上,LPSLEEP模式相比SLEEP模式功耗更低,本文将在STM32L4R9芯片上,结合TouchGFX和LPSLEEP来介绍如何在亮屏状态下实现MCU低功耗。 2 低功耗实现原理介绍 ; x; A1 B- Q* ]" I( f8 d1 O) ^1 U: m% E, M# r7 O' j 在使用TouchGFX做图形应用时,会使用到FreeRTOS操作系统,使用SysTick定时产生1ms的中断来作为系统tick。在所有应用任务空闲时,系统会调度Idle任务。此时我们能让MCU进入低功耗,从而达到降低MCU功耗的目的。! x4 E& o9 \6 h* V ; E# c3 Y1 u4 l* R/ d2 o% n) M 3 ~9 ^/ X# U/ G% {5 g3 a1 K 2.1 Tickless Idle FreeRTOS提供了Tickless Idle配置,在FreeRTOSConfig.h文件中,通过配置configUSE_TICKLESS_IDLE为不同的值来配置FreeRTOS是否在Idle任务里进入低功耗,默认为0表示不进入低功耗。 4 {' Y- [ ~- I0 ?* D8 g 本文中将配置为2,自定义Idle任务中低功耗实现。 0 S, ]2 E5 y1 C' w1 o- T$ Y Table 1 Tickless Idle 配置# j3 t1 X+ p: f: S( O1 m 4 R1 o# E ], p7 w FreeRTOS中进入低功耗具体是由vPortSuppressTicksAndSleep函数实现。配置configUSE_TICKLESS_IDLE 为 2 时,还需要重写 vPortSetupTimerInterrupt 函数。 2.2 TouchGFX渲染与LPSLEEP限制 + d% e. _9 A9 l5 a0 l' g6 V. z根据参考手册描述,在进入LPSLEEP时要先切换到LPRUN模式,系统时钟要降低到2MHz,因此在进入、退出LPSLEEP时会有时钟的切换过程。 7 R+ S t. t. }& w 在屏幕亮着的状态时,用户可能随时触摸屏幕,或者系统信息可能更新,因此屏幕显示的内容可能随时变化,如果此时MCU进入LPSLEEP状态,会导致系统响应不及时。另外,在屏幕内容更新时,L4R9通过DSI向屏幕更新显示数据,此过程由硬件完成,在此过程中,软件也有可能会进入LPSLEEP,这样系统时钟发生变化,会导致DSI更新显示数据异常,产生屏幕显示花屏的问题。 ' \ S, H! z* u1 M* K8 j 为了避免以上问题,在进入LPSLEEP前会检查当前状态,如果用户未操作屏幕,TouchGFX已经完成渲染,DSI刷新过程也完成,则允许系统进入LPSLEEP状态。这样既保证了系统正常工作,又达到了降低功耗的目的。) M9 @( G1 h7 t! A0 P2 B- @3 {: S , N) K( X4 U0 U 3 实现过程 - B4 e# M8 K: L6 Q0 A 重写vPortSetupTimerInterrupt函数,主要是设置与休眠时间补偿相关的变量,初始化systick寄存器:
Figure 1 ! l5 q: Z! w9 c* j$ ]重写vPortSuppressTicksAndSleep函数。在进入LPSLEEP前,会停止systick,在休眠完成后,需要补偿系统tick值,示例中使用LPTIM计时来补偿系统tick值。在进入LPSLEEP前先进行状态检查,只要有以下情况,都不进入低功耗模式:- E* [3 t- L' U% B9 b; u a) 触摸事件产生:nosleep_flg b) DMA2D busy状态:isDMAbusy_a() c) DSI refreshing状态:displayRefreshing# f H* P L' k6 w3 K/ b% X) a( k' x% R d) 渲染完成,请求DSI 刷新:refreshRequested
Figure 2 5 K' j, [0 j$ t3 f# I. _4 K. I N3 T3 ]( |2 H, i2 P TouchGFX渲染过程包括两部分,CPU渲染和DMA2D渲染。在CPU渲染过程中,TouchGFX任务处于执行状态,系统不会主动调度Idle任务。而在DMA2D渲染过TouchGFX会让出CPU,此时可能会切换到Idle任务执行,因此需要对DMA2D是否正在渲染进行判断。对DMA2D是否在渲染的判断如下:
Figure 3 , _: ^( _3 M, |小结 在TouchGFX图形应用中,在屏幕亮着的情况下如果需要优化功耗,可考虑结合FreeRTOS tickless模式,使用MCU的低功耗模式达到节能省电的目的。 8 J* A5 {6 s; ~* m7 h2 C: s5 b |
直播:低成本打造高体验:STM32 GUI 图形方案直播来袭,带你解锁嵌入式界面开发新思路
STM32F769I-DISCO开发板GUI学习内容(二)_课前硬件基础
【STM32L562E-DK】健康手环基础界面开发(一)—— 准备工作
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
【圣诞专享活动】使用TouchGFX做GUI显示:圣诞快乐&Merry Christmas!
STM32F103移植LittlevGUI代码
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
STM32F3DISCOVERY + UCGUI3.90A的移植(源码+视频)
STM32MP135F-DK开发板评测-Linux系统下基于gtk的计算器应用
微信公众号
手机版