lvgl简介 LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。 特点:强大的构建模组按钮、图表、列表、滑块、图像等先进的图形动画、反锯齿、半透明、平滑滚动多样的输入设备触摸板、鼠标、键盘、编码器等多显示器支持支持同时使用多个TFT或单色显示器多语言支持UTF8格式文字编码完全自定义图形元素硬件无关可用于任意微控制器或显示器可裁剪用于小内存(80KBFLASH,12KBRAM)操作操作系统、外部存储以及GPU支持但非必须单帧缓存即可实现先进的图形效果C语言编写以最大化兼容(C兼容)模拟器无需嵌入式硬件就可以在电脑上开始GUI设计教程、示例、主题从而快速GUI设计文档在线及离线免费开源基于MIT协议 运行的硬件要求: lvgl资料 LVGL的资料很丰富,下面列出一些常用的资料链接:1、lvgl英文官网: https:lvgl。io2、lvgl中文网: https:littlevgl。cn(还在建设中)3、lvgl源码: https:github。comlvgllvgl4、lvgl基于Visualsudio的PC模拟器: https:github。comlvgllvsimvisualstudio5、正点原子lvgl教程资料: http:www。openedv。comdocsbookvideoszdyzshipin4freelittleVGL。html6、基于荔枝派Nano开发板的lvgl教程: http:nano。lichee。proapplicationlittlevgl。html7、基于野牛开发板的lvgl6。0例程: https:gitee。commzy2364LittlevGLDemo8、lvgl在线体验例程(可在浏览器体验): https:lvgl。iodemos9、lvgl官网教程: https:docs。lvgl。iolatestenhtmlindex。html10、lvgl官方DEMO: https:github。comlvgllvexampleslvgl移植到STM32 1、下载源码 源码链接中下载一份源码,lvgl已经更新迭代了很多个版本,这里我们选择目前最新的7。10。1版本来移植: 注意:不同版本之间可能有很大的不同,所以看本篇教程移植的的小伙伴尽量使用与本文相同的版本。 下载得到: 2、准备stm32工程 下面我基于普中的stm32f103开发板来移植,首先准备一个lcd显示的例程,并更名为lvgltest: 3、新建GUI文件夹 在工程目录下新建一个GUI文件夹,GUI文件夹下新建两个子文件夹: 把刚才下载的lvgl7。10。1里的所有内容复制到lvgl文件夹中,lvglapp文件夹暂时留空。 4、移植文件更名 下面,我们把GUIlvglexamplesporting下的文件进行一个更名操作(其实不更名也可以,为了文件名看起来规范一些我们进行一个更名): 这是移植相关的几个文件,其中:lvportdisp:显示相关。 lvportindev:输入相关。 lvportfs:文件系统相关。 5、配置文件更名 把GUIlvgl下的lvconftemplate。h文件复制到GUI文件夹下并更名为lvconf。h: 6、keil工程配置 (1)导入文件 打开keil工程,在工程下新建三个组,并导入文件: 导入完成后得到: 这里的lvglporting中我们暂时只导入lvportdisp。c文件,这是显示相关的移植文件。本篇笔记先把显示打通,其它两个文件后续有机会再弄。 (2)包含头文件路径 下面包含头文件路径: (3)修改堆栈大小 因为官方说明文档中推荐我们堆、栈大小设置为8k: 所以这里我们就按推荐进行设置: (4)设置C99模式 lvgl需要编译器支持C99或更新的标准: C99模式可进行如下设置: (5)使能lvconf。h的条件编译 进行上面的设置后我们首先进行编译,会报很多个错误: 这是因为需要lvconf。h里的一些东西,打开lvconf。h里的条件编译即可: 再次编译,编译通过: (6)lvgl配置 我们可以对lvgl进行一些定制配置,这些配置内容在lvconf。h文件中,下面进行一些关键配置:显示器宽度:defineLVHORRESMAX(240)显示器高度:defineLVVERRESMAX(480)色彩深度:defineLVCOLORDEPTH16DPI:defineLVDPI100提供给lvgl的空间:defineLVMEMSIZE(32U1024U) 其中调整LVDPI可以调整各控件间的紧凑,可根据实际情况进行更改;LVMEMSIZE为lvgl可用空间,资源允许的情况下可以稍微设大些,这个设置过小的话,在跑一些稍微复杂的demo时界面就会刷不出来。 这里只是列出了几个常用的配置,lvconf。h还有很多的配置,可根据实际情况进行配置。 (7)填充、修改lvportdisp。c lvportdisp。c里面的内容主要有: 我们需要重点关注lvportdispinit显示接口初始化函数与dispflush屏幕刷新两个函数。 其中,lvportdispinit函数里主要要选择一种写缓存的方式及设置显示分辨。我们选择第一种写缓存的方式,修改后的函数如:微信公众号:嵌入式大杂烩voidlvportdispinit(void){Initializeyourdisplaydispinit();CreateabufferfordrawingLVGLrequiresabufferwhereitinternallydrawsthewidgets。Laterthisbufferwillpassedyourdisplaydriversflushcbtocopyitscontenttoyourdisplay。Thebufferhastobegreaterthan1displayrowTherearethreebufferingconfigurations:1。CreateONEbufferwithsomerows:LVGLwilldrawthedisplayscontenthereandwritesittoyourdisplay2。CreateTWObufferwithsomerows:LVGLwilldrawthedisplayscontenttoabufferandwritesityourdisplay。YoushoulduseDMAtowritethebufferscontenttothedisplay。ItwillenableLVGLtodrawthenextpartofthescreentotheotherbufferwhilethedataisbeingsentformthefirstbuffer。Itmakesrenderingandflushingparallel。3。CreateTWOscreensizedbuffer:Similarto2)butthebufferhavetobescreensized。WhenLVGLisreadyitwillgivethewholeframetodisplay。Thiswayyouonlyneedtochangetheframebuffersaddressinsteadofcopyingthepixels。Examplefor1)staticlvdispbuftdrawbufdsc1;staticlvcolortdrawbuf1〔LVHORRESMAX10〕;Abufferfor10rowslvdispbufinit(drawbufdsc1,drawbuf1,NULL,LVHORRESMAX10);InitializethedisplaybufferExamplefor2)staticlvdispbuftdrawbufdsc2;staticlvcolortdrawbuf21〔LVHORRESMAX10〕;Abufferfor10rowsstaticlvcolortdrawbuf21〔LVHORRESMAX10〕;Anotherbufferfor10rowslvdispbufinit(drawbufdsc2,drawbuf21,drawbuf21,LVHORRESMAX10);InitializethedisplaybufferExamplefor3)staticlvdispbuftdrawbufdsc3;staticlvcolortdrawbuf31〔LVHORRESMAXLVVERRESMAX〕;Ascreensizedbufferstaticlvcolortdrawbuf31〔LVHORRESMAXLVVERRESMAX〕;Anotherscreensizedbufferlvdispbufinit(drawbufdsc3,drawbuf31,drawbuf32,LVHORRESMAXLVVERRESMAX);InitializethedisplaybufferRegisterthedisplayinLVGLlvdispdrvtdispdrv;Descriptorofadisplaydriverlvdispdrvinit(dispdrv);BasicinitializationSetupthefunctionstoaccesstoyourdisplaySettheresolutionofthedisplaydispdrv。horres240;dispdrv。verres400;Usedtocopythebufferscontenttothedisplaydispdrv。flushcbdispflush;Setadisplaybufferdispdrv。bufferdrawbufdsc1;ifLVUSEGPUOptionallyaddfunctionstoaccesstheGPU。(Onlyinbufferedmode,LVVDBSIZE!0)Blendtwocolorarrayusingopacitydispdrv。gpublendcbgpublend;Fillamemoryarraywithacolordispdrv。gpufillcbgpufill;endifFinallyregisterthedriverlvdispdrvregister(dispdrv);} dispflush需要调用底层lcd操作接口,这里修改为: 这里我们调用一个写像素点的函数,也可以直接调用一个显示的填充方形函数。 最后,需要在头文件中声明lvportdispinit函数: (8)配置一个定时器为lvgl提供心跳 lvgl需要一个心跳节拍,可以使用系统滴答定时器,也可以使用其它定时器。我们这里的配置如下:TIM4Init(999,71);1ms进入一次中断,为lvgl提供心跳微信公众号:嵌入式大杂烩voidTIM4IRQHandler(void){if(TIMGetITStatus(TIM4,TIMITUpdate)){lvtickinc(1);}TIMClearITPendingBit(TIM4,TIMITUpdate);} (9)测试官方demo 下面开始进行测试,至此我们的GUIlvglapp文件夹里还没有任何内容,我们下载官方提供的demo来进行测试,同样地,下载官方demo: 官方给我们提供了很多demo: 复制lvexamples7。10。1整个文件夹至GUIlvglapp文件夹下并更名为lvexamples: 把GUIlvglapplvexamples下的lvexconftemplate。h复制到GUI文件夹下并更名为lvexconf。h,这是demo的配置文件: 想跑哪个demo就配置相关宏。 下面我们跑一个lvdemowidgets的demo进行演示: 主函数: 运行测试: 至此,lvgl显示移植成功。要想演示其它综合demo或控件例子也同上面一样导入源文件、包含头文件、打开demo宏开关等步骤进行演示。 本工程可私信回复关键词:LittlevGL移植,进行获取。猜你喜欢: 长文花了两天时间整理了STM32中的一些C语言知识点 STM32如何收发float类型数据? STM32串口IAP分享 嵌入式必备之Git的使用 1024G嵌入式资源大放送!包括但不限于CC、单片机、Linux等。私信回复1024,即可免费获取!