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

TouchGFX 环境下高效绘制圆环的一种方法

[复制链接]
STMCU小助手 发布时间:2022-8-7 18:15
1. 概述
0 J& Y5 L* D+ M1 R! U通常情况下,MCU 是资源比较受限的处理器。对于 STM32G0 系列的 MCU 而言,RAM 和 Flash 都比较小,比如 STM32G070RBT6,这颗 MCU 主频最高 64MHz,Flash Size 为 128K Bytes,SRAM 也只有 36K Bytes,实现普通的应用,这些资源是足够的。如果客户的应用需要支持图形界面,使用 TouchGFX 图形框架绘制相对复杂的界面的时候,; o% ~8 ~$ w6 ^- }( I0 k0 Q6 [
就会存在资源不够的现象。
9 ^! i+ a' ~& f* v  @8 D& ~( u本文记录了 一种折中的方案,使用这种方案,解决了客户使用 TouchGFX 进行图形界面的时候出现资源不足的问题。, Z( ^" m$ \1 E
9 Z* y- i: i, x/ \+ [. Q* i
2. 问题描述
; E6 Q( t. H1 o* r" T* W& T0 i. L0 S客户在开发方案的时候,硬件部分主控选用了 STM32G070RBT6,显示屏为 MCU 接口, 480*320 的分辨率,16bit 色深,MCU 与显示屏选用了一组 GPIO 连接,使用 GPIO模拟 MCU 8080 接口协议。
5 v1 v/ [+ G" _+ n2 H6 e软件上,客户采用了 TouchGFX 图形框架,在客户的应用中,包含了多个 Screen 界面,其中有一个 Screen 界面包含了两个图标,五个文本框以及两个圆圈。如图 1 所示。0 s" q7 h6 t- m" H
7 w: O/ r' r0 D8 [
_WEXSD0P%OK(N1F2J})U@YW.png 8 ?7 H1 U) u! Z

- \0 R1 Q% g2 `TouchGFX 支持一个 FrameBuffer,多个 FrameBuffer 以及部分 FrameBuffer 显示模式,由于显示屏的分辨率为 480*320,所以一个完整 FrameBuffer 需要的 RAM 大小为480*320*2=300K 字节,而 STM32G070RBT6 的 SRAM 只有 36K,所以在本案例中,无法使用一个或者多个 FrameBuffer 的显示模式,只能使用部分 FrameBuffer 的显示模式。使用部分 FrameBuffer 的显示模式,可以节省显示 Ram,但是效率是会降低的。
7 X+ n, M9 b- f4 `而 STM32G070RBT6 的主频最高只有 64MHz,RAM 不够,CPU 还跑得不够快,这两个原因导致当使用 TouchGFX 在绘制圆圈这种图形时,会发现肉眼可见的慢,用户体验不好。对于这种需要消耗性能的静态图形,如果性能不够,TouchGFX 推荐使用图片来替换绘制图形以提高性能。; @& E1 \8 e8 Y) i1 }0 a3 y4 H
! H, d* _! ]+ w! X5 J
* q8 v5 A3 I2 P" l
2XFGY6K0W8K~L)HA88VW6.png / _/ `4 `  L+ @5 O1 F; o- _

( ]* V- p* a6 y# y

, N8 B/ c# G% p  P7 [* m1 [0 ~虽然图片代替图形能够提高性能,但是使用图片需要更多的 Flash 存储空间,客户选用的 MCU STM32G070RBT6 的 Flash Size 只有 128KB,用户界面上的圆的半径为120,这意味着最少需要一张 240*240*2=112K 字节的图片,显然 128K 的 Flash 空间是不够的。
/ ]  d0 Y1 ~) Y) X3 `* W1 H结合上述分析,需要找到一个方法,既不用占用太多的 Flash 空间,又不用消耗太多的 MCU 性能来实现圆形的绘制。. W4 c0 @) {/ Q. ]4 D" t
: e; M2 _* |! g+ o" k0 K
3. 问题解决
  D3 o/ M6 J, k) V7 D4 e图 3 用的图片分辨率为 320*250,图片中的圆环半径为 120,如果在 TouchGFX 中,直接使用 Image 控件,导入这张图片作为背景,是个比较简单的做法。但是这样就需要320*250*2 的 Flash 存储空间,已超出了 MCU 的 Flash 空间。
/ `( D0 [  y7 U; H! S" U6 R- E9 t# P) u8 g. V0 Z+ s1 T+ r

; D) |" ?$ v' e3 l图3. 圆环背景图片7 V- `, t  i% X$ y' `
3X%DZ53PF{W84T%5SGMRK0Y.png 5 {" N# f2 W- J; F

4 d3 X2 n" \, I2 b8 A6 m+ a" \4 O0 U分析这张图片,有效的像素点只有圆环部分,其他像素都是白色的,也就是说,程序在绘制图片的时候,只需要画圆环部分有效的像素即可,而圆环有效的像素点只占了很少的一部分空间。
' V3 O) h9 V) M, r- H7 J" F  k根据这个分析,只需要把图片的有效像素点和对应的坐标提取出来,生成一个数组,在应用程序里,根据这个数组存储的坐标和有效像素点,把相应的点写入 LCD 的显示Buffer 中,即可完成绘制圆环的工作。
+ U: E1 D9 z+ ~再进一步分析,圆环是一个对称的图案,所以只需要取 1/4 个圆环的有效像素点即可,其他 3/4 圆环通过坐标镜像就可以得到。
- M) Q  ^! T! q. }
) U1 S6 o- @1 w9 `2 D1 \' a C03O{VEXZ10LNGOH%FM9}QX.png   X. f" v( Y: B$ T' ?

- t% |; N7 G, @! Q# O8 |' k# k通过这种操作,最终占用 320*250*2 字节大小的图片只需要几 K 的数组即可存储下来。
+ [2 _$ c  y& Q3 H- Y下面是具体的实现步骤。
+ t7 v0 Z  Q; \( ^6 m1)把 1/4 圆环图片导入到 TouchGFXDesigner,TouchGFXDesinger 能够直接把PNG 图片转换成位图数组。
" x1 T# R5 Y" D+ X+ u  L% ]2)用 Python 编写一个脚本,把上一步得到的位图数组中有效的像素点以及对应的坐标提取出来,生成一个 1/4 圆环的数组。
' w( C' C# n& o: h3)在程序中,根据这个数组定义的坐标和像素点,调用 LCD 驱动程序,把有效的像素点写入 LCD 对应的坐标位置。4 R0 |- n7 e) L+ u) o
4)最终看到的效果是,画圆的效率提高了,同时 Flash 空间足够了,完美解决了客户的问题。
2 q+ ?2 l2 x1 S3 @7 o7 V$ ?4 Q6 @9 R( w6 j* N

( u  L5 [$ }1 J4 o1 H4. 小结2 {" r7 B# ~5 T% f1 O, m) q- b  e7 D8 N& i
本文在实际客户问题的基础上,提供了一种高效绘制圆环的方案,虽然有点繁琐,但也不失为一种有效解决客户问题的方法。
# v0 H* V% M( n/ Y9 H% O% X  }" s& z8 _- Y, v  M# }" G
( o/ D# v0 W( f. }! \

0 y' \* Q) c6 q完整版请查看:附件
3 S7 C: `6 P1 s$ O% M3 }+ D& }
( q+ [. Z; @( G6 t- b1 J. n7 K1 f3 c7 ]

LAT1095_TouchGFX下高效绘制圆环的一种方法_v1.0.pdf

下载

384.78 KB, 下载次数: 1

赞 收藏 评论0 发布时间:2022-8-7 18:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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