0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【教程】CW32L012移植SGL图形库

CW32生态社区 来源:CW32生态社区 2025-12-31 16:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Q1.SGL是什么?

SGL是一个轻量级的UI图形库,符合现代化审美设计,其设计思想来源于LVGL图形库,具有抗锯齿,圆角,边框等关键UI设置项,同时具有图层概念,不同控件有不同的层次,可设置透明度,控件同样有父子关系,子控件可继承部分父控件属性。代码采用面向对象的思想,文件结构清晰,非常适合应用于性能以及内存有限的单片机,控件有:圆角矩形、标签、开关、进度条、圆环、列表等。

SGL仓库地址:https://github.com/sgl-org/sgl

镜像仓库地址:https://gitee.com/sgl-org/sgl

Q2.有了LVGL图形库,SGL存在的意义是什么?

LVGL对内存和性能的占用仍然太大。当然,毫无疑问,LVGL是目前嵌入式领域使用率比较高的一个UI库(据官方搜索小米也在用),功能多,代码风格好,虽然也算轻量级UI库,但轻量级的程度仍然不够。对于内存小的单片机来说,运行LVGL压力非常大,那么我内存小,又想用类似LVGL的图形库有吗?有的兄弟,有的,就是我们介绍的主题SGL图形库。

Q3.SGL图形库到底解决了什么痛点?

目前LVGL图形库是好用,但是对单片机要求特别高,如果使用无UI框架的方式,性能以及内存占用确实小,但做出来的效果又特别差劲,做出来的产品够用,但缺乏竞争力。

(1)flash占用大:LVGL可以对功能进行裁剪,但由于其设计框架的原因,裁剪过后的代码对内存占用也十分大,SGL是高度可裁剪,裁剪过后的功能,一定不会被编译(直接或间接)。

(2)ram占用大:对于LVGL来说,每个控件对RAM的占用都是很大的,LVGL是为了功能的丰富,但SGL的定位是为了更加轻量级,因此,对于RAM的使用,作者严格地控制每一个字节的占用,尽可能保证功能的前提下做到最小占用。

(3)代码框架差:当不使用任何框架时,散装的代码,某宝卖家配套的代码,某SDN下载的测试代码,这类代码不考虑程序可读性,可维护性,功能可扩展性,用这种代码测试是可以,用于实际项目开发是灾难性的。SGL是完全没有这些问题的,源代码文件目录分类清晰,函数API风格统一,同样有配置文件,初始化简单,配套资料文档齐全。

Q4.为什么选择CW32L012跑SGL?

(1)主频高,96Mhz。

(2)SPI时钟可达48M。SPI时钟高,非常适合SPI屏的驱动,在同档位MCU中算比较优秀的。

(3)ram和flash大小合适(8K+64K)。SGL对于ram的要求是4K以上,flash是20k以上。

(4)性价比高。同样外设资源、封装、引脚数情况下,CW32L012算比较便宜的。

5.CW32L012移植SGL步骤

这里会教大家一遍流程,不会也没关系,有已经移植好的示例工程,示例工程名为“cw32l012_sgl_gui_demo”,这里可以大概了解一下有哪些步骤,需要关注哪些地方。

通过网盘分享的文件:cw32l012_sgl_gui_demo.rar链接: https://pan.baidu.com/s/1RGcQ9_l8iK40jNl335mX0g?pwd=CW32 提取码: CW32

b83999a7d853923f2a5e78e3350457af.jpg

▲CW32L012多功能开发板(已开源)

(1)从官网下载文件,https://github.com/sgl-org/sgl

文件夹内有很多类型的文件,我们只需要使用“source”文件夹

10633a30f604c35be3036c89b330cd14.png

(2)准备好已经调通屏幕显示的工程

需要至少有以下两个函数: 屏幕初始化,矩形填充函数

418d71115ec809e9ff7ca7f36d6819a0.png

(3)添加sgl源码

根据sgl对应的文件结构,在编译器中同样创建对应的文件目录并添加.c文件,.h文件包含即可

wKgZPGlLikaAd-nlAAA2JjKcHmE144.jpg

▲(keil中的工程目录结构)

wKgZO2lLikaAE6hMAAAdlGEp03Y938.jpg

▲Sgl 中的source 目录结构

2213b91a8f67914103f525298b94dc84.png

▲(头文件包含)

Tips: 实际只需要将source里的所有.c文件全部添加,这里分类是为了有良好的文件结构。包含头文件需要包含source目录和include目录。

(4)修改conf文件

配置文件名为“sgl_config.h”,一般只需要修改屏幕颜色深度,内存分配大小,其他的配置项可以参考下图,不明白的可以保持默认。

4fffa777d9d92a10c4e766b8561260eb.png

(5)初始化SGL

初始化是使用该库的关键,重点关注:屏幕分辨率,屏幕缓冲区大小,刷屏函数,debug串口输出函数等

wKgZO2lTYLyADEugAAA2UsTJ9X0781.jpg

4d572faa2ce5ed47c355ec8602915ee0.png

详细讲解:例如范例的配置,屏幕分辨率为320x240(宽320,高240),显示缓冲区“panel_buffer”为单行缓冲区(缓冲区大小都是屏幕宽度的倍数,最小1行即可,更大的缓冲区,渲染与刷新的速度会更加快,但考虑轻量级,单行缓冲区足够用),然后是刷屏函数,其实就是调用我们之前要求写的矩形区域填充函数,另外就是日志输出函数,该函数如果前期没有写好日志输出,不强制要求实现,“uart_put_string”可以为空函数,最后调用“sgl_init”即可完成初始化。

(6)SGL运行起来的必要调用

①初始化

②动画心跳

③SGL核心任务函数

wKgZPGlTYL2ADFQyAABcbmH4KIQ136.jpg

如上图,“user_sgl_init”实际就为SGL的初始化,它位于屏幕初始化之后,然后周期性调用任务函数“sgl_task_handle”。

557bbf4729e58305b536cf5fe592f5c6.png

如上图,“sgl_anim_tick_inc”就是动画的心跳,需要在一个标准的定时器中断中调用,如systick,此处的systick配置的是1ms,动画tick函数的入参自然就是1。

看到了这里,恭喜你,已经完成了SGL的移植啦!后面就是添加自己需要的控件和功能进行测试了。

(7).编写测试代码

初始化完成以后,即可添加一些控件来看看效果了,注意,创建控件的代码一定是写在初始化之后(初始化完了才能创建控件)。

5c1ab89604c1e3b8101603acd6f4d223.png

创建了一个圆角矩形,位置为0,0,大小为100x100,主题颜色为蓝色,圆角大小为20,透明度为127(满透明度为255),边框宽度为4,边框颜色为红色。

wKgZO2lTYL6ABZ8MAACKDAxufhA006.jpg

另外,我们再添加一个动画,动画的作用对象为创建的圆角矩形“rect2”,动画延时500ms,动画整个周期1500ms,动画化重复性设置-1代表一直重复,设置动画起始值0,动画结束值100,动画路径为一个函数“sgl_anim_path1”,动画算法采用“SGL_ANIM_PATH_LINEAR”,线性动画。

动画本质:动画实现的本质就是,起始设定值到结束设定值,在一段时间内的数值变化。如果设定值作用于坐标,其动画就变成控件的移动。

该demo的内存占用情况

wKgZPGlLikqATmARAAAy1Hz2ELA876.jpg

(8).最终效果

下图gif就是我们创建的一个圆角矩形加上动画的效果,循环x轴方向移动。

wKgZPGlU5A-ADdfEAHfr8Ax-Kyo552.jpg

效果2:下图的gif是另外一个复杂的测试demo,测试不同控件叠加渲染的能力,圆角矩形透明度设置的50%,可以透过圆角矩形看到底下的键盘。进度条和圆角矩形是同一个动画时基,都是1500ms,同步做动画。

wKgZO2lLikuAXQ4DAABItcan6vc126.jpg

(9).内存占用情况分析

这一部分来分析cw32l012移植sgl的内存占用情况

wKgZO2lU5HGAO0-hAADouqSobV4853.png

如上图,这是一份keil输出的map文件的截图(AC6编译,优化等级O1),图中包含了各部分部分的代码占用情况,cw32开头是官方的库文件,相比其他厂家的库来说,flash占用非常小。SGL开头是图形库,占用和你使用的控件有关,本demo只用了不到6k字节的flash空间(当然控件用的多了会占用比较多,但也不会超过32k,用LVGL是绝对不可能的事情)。

7.结语

好啦,看到这里就已经结束了,恭喜你又了解了一个GUI库,SGL是专门面向轻量级MCU开发的,它是一个长期的项目,会持续优化及更新。同时我们认为,好的代码一样是艺术品,开发这样的代码就是创造艺术品,使用这样的代码就是欣赏艺术品,人生不应得过且过,要有更高的追求。下面是一些题外话,有兴趣的读者可以继续看下去。

8.题外话

Q:这个效果也不行啊?为什么我感觉很卡?

目前的效果大家可能觉得很卡,其实主要是分配的资源问题,demo中缓冲区只用一行,320x2 = 640字节,要很流畅的话至少要10行的缓冲区,另外刷屏底层接口没有用DMA,也是慢的原因,再者,SGL核心任务调度每隔30ms调度一次,这也是不流畅的原因。

Q:为什么不把各项配置调到最好?

例如30ms调度周期降低到5ms,岂不是流畅的很?是的,的确,但是作为轻量级MCU,不应该这么做,因为你的性能有限不可能80%的性能都分配给图形库,要流畅缓冲区也可以加大,例如10行的缓冲区,光图形库RAM占用率可能就超过80%,其他的任务还跑不跑了?这里介绍的SGL库是有实际项目应用价值的,绝对不能是只能跑个demo的,停留在实验室的,博眼球的库,这样的库是没有意义的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移植
    +关注

    关注

    1

    文章

    417

    浏览量

    29578
  • 图形库
    +关注

    关注

    0

    文章

    22

    浏览量

    9244
  • CW32
    +关注

    关注

    1

    文章

    326

    浏览量

    1993
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32移植U8g2图形的方法 实现OLED图形显示

    本篇介绍了如何将U8g2图形移植到STM32中。
    的头像 发表于 06-07 08:29 1.4w次阅读
    STM32<b class='flag-5'>移植</b>U8g2<b class='flag-5'>图形</b><b class='flag-5'>库</b>的方法 实现OLED<b class='flag-5'>图形</b>显示

    移植RT-Thread nano到CW32L083

    移植RT-Thread Nano到CW32L083开发板上,并成功运行。
    的头像 发表于 07-03 09:04 2.4w次阅读
    <b class='flag-5'>移植</b>RT-Thread nano到<b class='flag-5'>CW32L</b>083

    【开源】WeGUI高效多色图形

    类似, 支持移植到各个平台, 支持OLED, 同时拓展支持了彩色屏。 本WeGUI已适配了武汉芯源CW32L012C8T6,DMA驱动后续会做增加。 WeGui内置高效SPI的TFT驱动, 不仅支持
    的头像 发表于 12-29 13:12 4241次阅读
    【开源】WeGUI高效多色<b class='flag-5'>图形</b><b class='flag-5'>库</b>

    FOC控制中如何利用芯片内部的运放设计电流采样电路?

    最近开发电机控制的项目,我开始使用最新的CW32L012做主控,CW32L012作为混合信号MCU,相比于传统MCU控制,集成度较高,性能当然也更好,加之又是48Pin的芯片,因此我开始做的关于CW32L012主控的电机驱动项目
    的头像 发表于 01-05 16:50 3046次阅读
    FOC控制中如何利用芯片内部的运放设计电流采样电路?

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    基于CW32L01x系列低功耗微控制器家族的全新成员:CW32L012系列产品。 CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件单元、扩展算术运算单元
    发表于 07-16 16:32

    **CW32L012****开发评估板的第一个程序**

    CW32L012****开发评估板的第一个程序 最近以15.99在CW32生态社区入手了这块CW32L012开发评估板,我迫不及待的烧录进电灯程序,看看这块板子是否是正常的,能否满足我后面的学习
    发表于 11-22 00:09

    CW32L012小型机器人控制评估板活动 四足机器人+智能小车 开箱评测

    :套件主控板在出厂时应该是已经下载过程序了的,也可以不用下载直接开玩体验。 1) 如果你之前没有安装CW32L012的DFP器件包,则要先官网下载CW32L012的SDK固件,具体安装参考上面链接里面
    发表于 11-24 23:44

    STemwin图形移植与运用

    前言:STemwin图形界面比较吃内存的,一般跑图形界面都需要配一块SRAM,M3系列官方推荐频率是72MHZ(当前也是可以超频的),界面不是非常复杂,刷新要求不是特别高的情况下,
    的头像 发表于 02-28 14:09 1.3w次阅读
    STemwin<b class='flag-5'>图形</b><b class='flag-5'>库</b><b class='flag-5'>移植</b>与运用

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件单元、扩展算术运算单元(EAU),可以提供部分数学函数、算术运算的硬件加速,特别适用于电机控制、电源、计量、信号处理等应用。
    的头像 发表于 07-16 16:34 1637次阅读
    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频<b class='flag-5'>CW32L012</b>新品发布!

    使用芯源CW32的CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块。引脚
    的头像 发表于 11-21 11:34 920次阅读
    使用芯源<b class='flag-5'>CW</b>32的<b class='flag-5'>CW32L012</b>开发评估板做了spi屏幕驱动

    CW32L012小机器人的电机控制

    线的大功率调速,电机的控制性能直接决定了系统的响应速度、运行精度、能耗效率与稳定性。这里分享CW32L012小机器人的正反转、调速的电机控制 电机的正反转 从配套的开发板资料介绍中可以知道,这是电机的驱动芯片RZ7899 从立创商城下载该芯片的数据
    的头像 发表于 11-21 13:18 2637次阅读
    <b class='flag-5'>CW32L012</b>小机器人的电机控制

    CW32L012与STM32F103的三角运算性能对比

    没有硬件浮点运算单元。 但在运算三角函数时,CW32L012支持CORDIC算法。 二、 三角运算性能具体分析 1:标准浮点运算(如 math.h 的 sinf, cosf) 这是最常用但也是最慢的方式。 STM32F103C8 :
    的头像 发表于 12-29 15:32 2619次阅读
    <b class='flag-5'>CW32L012</b>与STM32F103的三角运算性能对比

    CW32L012与STM32G431的CORDIC三角函数运算性能对比

    本文对比均为作者实测,结果仅供参考,可附代码供有意者评估~ STM32G431是STM32家族中较新的产品。CW32L012也是武汉芯源半导体最新推出的混合信号MCU,让我们深入分析基于各自芯片
    的头像 发表于 12-29 15:55 2928次阅读
    <b class='flag-5'>CW32L012</b>与STM32G431的CORDIC三角函数运算性能对比

    CW32L012电压电流表设计思路

    CW32L012C8T6 定位为 电机控制、电源管理、智能仪表、工业传感器 等领域的高性价比解决方案,尤其适合需要 高精度模拟信号处理 + 复杂数字控制 的混合信号系统, ARM
    的头像 发表于 03-31 21:32 693次阅读

    CW32L012的FOC电机驱动的运放电路设计解析

    CW32L012由于有两个内置运放,所以在设计FOC电机驱动时,可以考虑使用内置运放做单/双电阻的电流采样。 以下图B相为例,运放及外围电路构成同相放大电路,由于相电流存在正负方向,所以需要增加偏置
    的头像 发表于 04-28 15:00 535次阅读
    <b class='flag-5'>CW32L012</b>的FOC电机驱动的运放电路设计解析