简 介
hpm6700/6400系列 mcu来自上海先楫半导体科技有限公司的高性能实时risc-v微控制器,为工业自动化及边缘计算应用提供了极大的算力、高效的控制能力及丰富的多媒体功能。hpm6700/6400自带的显示控制系统,包括lcd控制器及2d图形加速单元,性能也非常强悍,可以轻松驱动1366x768高分辨率的lcd屏,且可达到60fps的高刷新帧率。
本文主要介绍了 hpm6700/6400 的显示控制系统,包括lcd控制器和2d图形加速单元,并使用lvgl图形库开发的应用示例,方便开发者快速开发。
lcd 控制器 (lcdc)
hpm6700/6400系列 的图形显示接口 lcdc 支持连接多种不同种类,不同分辨率的 lcd(tft) 显示屏。lcdc 支持 24 位并行数据线,支持时钟信号 pclk,支持 hsync 和 vsync 同步信号。lcdc 可以作为总线主设备读取片上和片外的存储器的图像数据,并发送到外部显示屏上。lcdc 的特性如下:
支持多达 24 位 rgb 显示接口;
内置 dma,作为总线主设备读取显存数据;
支持可配置的分辨率显示屏,刷新率可达 1366x768, 60 fps;
支持多种数据格式输入 argb8888,rgb565,yuv422/ycbcr422,y8,1bpp,2bpp,4bpp 和 8bpp;
支持多达8 个图层 alpha blending(混合叠加),其中 2 个主图层支持逐行 yuv422/ycbcr422;
支持最大 pixclk 为 85mhz 。
lcdc 功能框图
2d 图形加速单元 (pdma)
本产品支持 1 个 2d 图形加速单元 pdma。pdma 支持处理逐行图像数据,支持按像素处理多种尺寸,多种颜色格式的图形;
支持同时取2个图层的数据,每个图层独立启用控制;
支持图像格式转换,包括argb8888,rgb565,yuv422h1p 图像转换;
支持图像0°/90°/180°/270°旋转;
支持水平、垂直的翻转;
支持图像缩放,x/y拉伸、压缩;
支持图像截图。
pdma功能框图
lvgl 应用开发
1. lvgl 介绍
lvgl(轻巧而多功能的图形库)是一个免费的开放源代码图形库,它提供创建具有易于使用的图形元素,精美的视觉效果和低内存占用的嵌入式gui所需的一切。
主要特性:
功能强大的构建块,例如按钮,图表,列表,滑块,图像等;
带有动画,抗锯齿,不透明,平滑滚动的高级图形各种输入设备,例如触摸板,鼠标,键盘,编码器等;
支持utf-8编码的多语言;
多显示器支持,如tft,单色显示器;
完全可定制的图形元素;
独立于任何微控制器或显示器使用的硬件;
可扩展以使用很少的内存(64 kb闪存,16 kb ram)进行操作;
操作系统,支持外部存储器和gpu,但不是必需的;
单帧缓冲区操作,即使具有高级图形效果;
用c语言编写,以实现最大的兼容性(与c ++兼容);
模拟器可在没有嵌入式硬件的pc上进行嵌入式gui设计。
可移植到micropython;
可快速上手的教程、示例、主题;
丰富的文档教程;
在mit许可下免费和开源。
2. lvgl移植适配
官方已经移植和适配好了lvgl,代码结构如下:
▸./lvgl 库本身
▸./lv_drivers 显示和输入设备驱动程序
▸./lv_examples 示例和演示
▸lvgl官方网站 (https://docs.lvgl.io)
▸lvgl官方博客站点(https://blog.lvgl.io)
▸sim在线模拟器网站(https://sim.lvgl.io)
▸lv_sim_... 适用于各种ide和平台的模拟器项目
▸lv_port_... 移植到其他开发板
▸lv_binding_... 绑定到其他语言
▸lv _… 移植到其他平台
其中,lvgl,lv_examples和lv_drivers是最受维护、关注的核心存储库。
lv_drivers显示接口:
要设置显示,必须初始化 lv_disp_draw_buf_t 和 lv_disp_drv_t 变量。
lv_disp_draw_buf_t 保存显示缓冲区信息的结构体
lv_disp_drv_t hal要注册的显示驱动程序、与显示交互并处理与图形相关的结构体、回调函数。
显示缓冲器:
关于缓冲区大小,有 3 种情况:
(1)一个缓冲区:lvgl将屏幕的内保存到缓冲区中并将其发送到显示器。缓冲区可以小于屏幕。在这种情况下,较大的区域将被重画成多个部分。如果只有很小的区域发生变化(例如按下按钮),则只会刷新该部分的区域。
(2)两个非屏幕大小的缓冲区: 具有两个缓冲区的 lvgl 可以将其中一个作为显示缓冲区,而另一缓冲区的内容发送到后台显示。应该使用 dma 或其他硬件将数据传输到显示器,以让cpu同时绘图。这样,渲染和刷新并行处理。与 一个缓冲区 的情况类似,如果缓冲区小于要刷新的区域,lvgl将按块绘制显示内容
(3)两个屏幕大小的缓冲区: 与两个非屏幕大小的缓冲区相反,lvgl将始终提供整个屏幕的内容,而不仅仅是块。这样,驱动程序可以简单地将帧缓冲区的地址更改为从 lvgl 接收的缓冲区。因此,当mcu具有 lcd/tft 接口且帧缓冲区只是 ram 中的一个位置时,这种方法的效果很好。
显示驱动器:
一旦缓冲区初始化准备就绪,就需要初始化显示驱动程序。
lv_disp_drv_t的初始化,需要使用 lv_disp_drv_init(&disp_drv) 进行初始化。最后,要为 lvgl 注册显示设备,需要调用lv_disp_drv_register(&disp_drv)。
在最简单的情况下,仅需要设置 lv_disp_drv_t 的以下两个字段:
▸draw_buf 指向已初始化的 lv_disp_buf_t 变量的指针。
▸flush_cb 回调函数,用于将缓冲区的内容复制到显示的特定区域。刷新准备就绪后,需要调用lv_disp_flush_ready()。lvgl可能会以多个块呈现屏幕,因此多次调用flush_cb。使用 lv_disp_flush_is_last() 可以查看哪块是最后渲染的。
其中,有一些可选的数据字段:
▸hor_res 显示器的水平分辨率。(默认为 lv_conf.h 中的 lv_hor_res_max )
▸ver_res 显示器的垂直分辨率。(默认为 lv_conf.h 中的 lv_ver_res_max )
▸color_chroma_key 色彩键控支持透明色。(默认为 lv_conf.h 中的 lv_color_transp )
▸user_data 驱动程序的自定义用户数据。可以在 lv_conf.h 中修改其类型。
▸anti-aliasing 使用抗锯齿(anti-aliasing)(边缘平滑)。缺省情况下默认为 lv_conf.h 中的 lv_antialias 。
▸rotated 如果 1 交换 hor_res 和 ver_res 。两种情况下 lvgl 的绘制方向相同(从上到下的线条),因此还需要重新配置驱动程序以更改显示器的填充方向。
▸screen_transp 如果为 1 ,则屏幕可以具有透明或不透明的样式。需要在 lv_conf.h 中启用 lv_color_screen_transp 。
要使用gpu,可以使用以下回调:
▸gpu_fill_cb 用颜色填充内存中的区域。
▸gpu_blend_cb 使用不透明度混合两个内存缓冲区。
▸gpu_wait_cb 如果在 gpu 仍在运行 lvgl 的情况下返回了任何 gpu 函数,则在需要确保gpu渲染就绪时将使用此函数。
其他一些可选的回调,使单色、灰度或其他非标准rgb显示一起使用时更轻松、优化:
▸rounder_cb 四舍五入要重绘的区域的坐标。例如。2x2像素可以转换为2x8。如果显示控制器只能刷新特定高度或宽度的区域(对于单色显示器,通常为8 px高),则可以使用它。
▸set_px_cb 编写显示缓冲区的自定义函数。如果显示器具有特殊的颜色格式,则可用于更紧凑地存储像素。(例如1位单色,2位灰度等)。这样,lv_disp_buf_t中使用的缓冲区可以较小,以仅保留给定区域大小所需的位数。set_px_cb不能与两个屏幕大小的缓冲区一起显示缓冲区配置。
▸monitor_cb 回调函数告诉在多少时间内刷新了多少像素。
▸clean_dcache_cb 清除与显示相关的所有缓存的回调
lv_drivers显示接口:
要设置输入设备,必须初始化 lv_indev_drv_t 变量,类型 (indev_drv.type)可以是:
▸lv_indev_type_pointer 触摸板或鼠标
▸lv_indev_type_keypad 键盘或小键盘
▸lv_indev_type_encoder 带有左,右,推动选项的编码器
▸lv_indev_type_button 外部按钮按下屏幕
3. 应用开发
lvgl图形库功能控件有很多,这里不在详细介绍,详细api介绍查阅lvgl官网。
lvgl主要控件功能有:
使用 lvgl 图形库之前,我们还必须初始化 lvgl 以及相关其他组件。初始化的顺序为:
▸调用 lv_init() 初始化 lvgl 库;
▸初始化驱动程序;
▸在 lvgl 中注册显示和输入设备驱动程序;
▸在中断中每隔 x毫秒 调用 lv_tick_inc(x) 用以告知 lvgl 经过的时间;
▸每隔 x毫秒 定期调用 lv_task_handler() 用以处理与 lvgl 相关的任务。
squareline_studio设计器:
(1)创建项目
(2)控件布局设计
(3)代码生成
(4)代码适配工程
(5)添加事件响应代码
运行效果:
性能测试:
fps帧率:每秒钟lcd图形刷新的帧数;
lvgl会通过内部的tick,定时去刷屏幕;
10即1000ms/10ms=100fps;
这个宏定义限定了lvgl刷屏帧率的上限,设定满帧100帧;
使用全尺寸双buffer。
实测结果:
总 结
本文介绍了 hpm6700/6400 lcd 控制器和2d图形加速单元模块,同时介绍了 lvgl 图形界面库功能及移植适配要点,并基于 lvgl 图形界面库开发驱动点亮lcd屏的应用示例。根据实测结果,lcd 帧率可达到60fps。官方 hpm-sdk 已将lvgl图形库移植适配完成,也提供了基于 lvgl 的demo示例,用户可以非常便捷的使用hpm6700/6400 sdk 来完成lcd相关的应用开发。
华为畅享10Plus评测 践行实用主义真全面屏普及者
海康机器人推潜伏机器人等协作展示方案
华为荣耀9最新消息:理性分析荣耀9面对小米6竞争力几何?参数、体验、价格、外观全面对比
一个悲伤的故事,苹果关闭了iOS10.3.1 以下的验证
T0345 I/Q AMPS/CDMA 1900~1750 MHz/849~824 MHz双频三模发射器
惊艳就在眼前!来感受先楫MCU八图层高清显示
为显示器提供更亮图像的OLED技术
华为董事长胡厚崑表示华为从未发生过任何严重的网络安全问题
教你怎么延长电池寿命
卫星互联网的优势是什么,它或将颠覆5G技术
基于CW32单片机的公交站人流检测系统设计
画面处理轻而易举,T2751Q显示器做你的生产力工具!
在i.MX RT的FreeRTOS MCUXpresso工程中添加runtime
迪龙采用DSP控制器打造高性能数字式电动汽车DCDC电源
说到机海战术,如今运用的最成熟的非华为莫属
什么是均衡控制技术呢?为什么能提高动力电池的续航能力呢?
继电器的介绍和在使用时应该注意的六点详细资料概述
关于GPS接收机灵敏度的分析
什么是瓦斯保护_有哪些优缺点
嵌入式应用中的USB主设备功能