本帖最后由 mzy2364 于 2022-6-13 22:16 编辑
lvgl 是一个免费的开放源代码图形库, 它提供创建嵌入式 GUI 所需的一切, 它具有易于使用的图形元素, 精美的视觉效果和低内存占用。强大的构建块按钮, 图表,列表, 滑块, 图像等, 带有动画, 抗锯齿, 不透明度, 平滑滚动的高级图形, 各种输入设备的触摸板, 鼠标, 键盘, 编码器等, 多显示器支持, 即同时使用更多的 TFT 和单色显示器, 支持 UTF-8 编码的多语言, 完全可定制的图形元素。独立于任何微控制器或显示器使用的硬件, 可扩展以使用较少的内存(80kB 闪存, 12 kB RAM) , 支持操作系统, 外部存储器和 GPU, 但不是必需的, 即使使用单帧缓冲区操作, 也具有高级图形效果。用 C 语言编写, 以实现最大的兼容性(与 C ++兼容) , 模拟器可在没有嵌入式硬件的 PC 上启动嵌入式 GUI 设计, 快速 GUI 设计的教程, 示例, 主题, 在线和离线文档, 在 MIT 许可下免费和开源。因为项目需要用到一个显示屏展示运行信息,所以采用KF32A152单片机加SPI屏实现一个GUI界面,屏幕是中景园的1.54寸240*240的屏。
KF32A152单片机标称频率是120M,实际上可以跑到96MHz,再网上就会出问题,SPI的时钟来自系统主频的四分频,然后SPI内部最低还要二分频一次,所以SPI时钟最大是12MHz,不算快,但是刷屏240*240的屏还是可以实现,具体效果也还不错。
lvgl目前已经更新到8.3版本,尝试过将8.3版本移植到KF32A152上面,但是不现实,在移植的过程中发现kf-gcc里面的标准库不支持snprintf等函数,所以移植一个lvgl 5的版本,实测可行。
移植重点:
需要使用SPI的DMA模式来刷屏,配合lvgl的双缓冲刷屏模式。
SPI支持8位和16位,在向屏幕写命令的时候,要使用SPI的8位模式,在写数据的时候,可以使用16位模式,这样刷屏效率会更高。
lvgl需要选择双缓冲机制,这样才能有更好的刷屏体验,具体思路就是定义两个n行大的buf,比如240*240的屏,一行就是240*2字节的大小,当需要刷屏的时候,先刷写到RAM的buf1,然后向屏幕发送写数据命令,然后利用DMA将数据刷到显示屏,DMA采用中断模式,这时候不占用CPU时间,CPU再将数据刷写到buf2,当DMA产生中断后通知lvgl,lvgl再将buf2的数据通过DMA刷写到屏幕,如此循环,实现了刷屏过程中cpu可以渲染的目的。
初始化的DMA的时候,不配置存储器地址和数据大小,也不开启DMA,配置下其他参数和SPI_TX的地址即可。
在初始化SPI的时候,newStruct_SPI.m_BaudRate = 0;这样可以获得最快的SPI速度。
KF32A152_LVGL.zip
(4.24 MB)
关键代码在spi.c lv_port_disp_template.c
|