前言
瑞佑科技RA8889ML3N是一款功能强大的彩色液晶显示控制器,内置128Mb SDRAM, 支持1366x2048高分辨率液晶显示屏,单片机MCU端支持8080/6800 8/16-bit接口,以及¾线SPI 或IIC接口。 RA8889支持多图层应用、画几何图形引擎、2D图形加速引擎(BTE)、画中画(PIP 实现弹窗利器)、支持BMP、JPEG格式图片显示,并内置了视频解码功能。
如何将RA8889强大的显示控制功能移植到emWin平台,以求做出流畅、炫酷的UI操作界面,接下来就说明我们如何将RA8889的应用驱动移植到emWin GUI Library里,实现在emWin平台上使用RA8889内置的液晶显示控制功能。
以下范例是基于使用瑞福科技的RA8889 EV Board开发板,使用STM32F103VET6 MCU,和使用Keil MDK 编译。
详细步骤如下:
一、 获得 emWin Graphic Library
1. 安装 Keil MDK,在 C:Keil_v5ARMSeggeremWin 路径下获得 emWin library
2. 在 C:Keil_v5ARMSeggeremWinDoc 获得 emWin User&Reference Guide
3. 与瑞佑科技的深圳分公司(深圳瑞福科技-Q2851189731)联络,以获得最新版的RA8889_API_Demo_Vxx范例。
二、开始移植
RA8889_API_emwin546_stm32f103_8080IF 范例是由 RA8889_API_Demo_Vxx 加入emWin Library 产生的,以下修改说明请参考范例程序项目。
1. 首先新增 3 个文件夹 emwin_config, emwin_inc, emwin_lib
1) 在 C:Keil_v5ARMSeggeremWinSampleConfig,复制 GUIConf.c 、GUIConf.h 、 LCDConf.c 、 LCDConf.h 4 个文件到emwin_config 文件夹内。
(2) 在 C:Keil_v5ARMSeggeremWinSampleDisplayDriver,复制GUIDRV_Template.c 文件到 emwin_config 文件夹内。
(3) 在 C:Keil_v5ARMSeggeremWinSampleGUI_X,复制 GUI_X.c 文件到emwin_config 文件夹内。
(4) 在 C:Keil_v5ARMSeggeremWinInclude,复制所有的.h 文件到 emwin_inc 文件夹内。
(5) 在 C:Keil_v5ARMSeggeremWinLib,复制 GUI_CM3.lib 文件到 emwin_lib 文件夹内。 (由于我们的 STM32F103 是 CM3核心,所以选用 CM3)。
(6) 在 C:Keil_v5ARMSeggeremWinSampleApplicationGUIDemo 内,复制全部的文件夹到 emwin_demo 文件夹内。
2. 打开 Keil 项目,在 Manage Project Items 内建立 emwin_config 、 emwin_lib 、emwin_demo 3 个 Groups 并加入文件,如下图。
在 Option for Target 里面的 Include Paths 新增 3 个 include paths 如下图。
3. 以上设定完后,我们编译时应该会产生以下错误:
Error: L6218E: Undefined symbol GUI_X_GetTaskId (referred from gui_task.o).
Error: L6218E: Undefined symbol GUI_X_InitOS (referred from gui_task.o).
Error: L6218E: Undefined symbol GUI_X_Lock (referred from gui_task.o).
Error: L6218E: Undefined symbol GUI_X_Unlock (referred from gui_task.o).
由于本范例没使用 OS 操作系统,所以我们先忽略这个问题,为了让编译可以正常进行,我们在 GUI_X.c 内加入这几个函数,如下图。
4. emWin GUI 时基源
emWin GUI 需要一个时基源并须1ms递增,即OS_TimeMS变数在GUI_X.c文件内声明,MCU必须先提供一个1ms的timer tick,通常在Cortex-M由SysTick的设定由SysTick_Handler{}中断函数去递增变量来实现,而本文范例采用MCU TIMER中断来提供1ms的tick,在stm32f10x_it.c内TIM3_IRQHandler()中断函数实现tick递增。
5 分配内存给emWin系统
在GUIConf.c文件内设定,内存大小会影响效能,须根据MCU的内存大小去配置。
6. GUIDRV_Template.c修改
使用GUIDRV_Template.c 作为新增一个GUI设备的驱动文件,emWin实现屏幕的驱动主要在于写一个点与读一个点,我们必须修改static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, LCD_PIXELINDEX PixelIndex)与static LCD_PIXELINDEX_GetPixelIndex(GUI_DEVICE * pDevice, int x, int y)两个主要函数,如下图。
引入的 putPixel()与 getPixel()函数来自 RA8889_API.h,在这个范例选用 16bit RGB565 或24bit RGB888 数据格式,参考 UserDef.h 选用如下设定:
支持 16bit RGB565 (使用 emWin GUICC_M565)
#define Parallel_8080
#define MCU_16bit_ColorDepth_16bpp
支持 24bit RGB888 (使用 emWin GUICC_M888)
#define Parallel_8080
#define MCU_16bit_ColorDepth_24bpp_Mode_2
另外为了优化填充效率, 在 GUIDRV_Template.c 文件新增定义 Add2D_Optimize, 使用 RA8889 内建 2D 绘图加速功能并增加到_FillRect()、 _DrawHLine()、 _DrawVLine()函数内, 如下图:
7. 修改LCDconf.c 如下图:
上述设定完成后,在 main.c 加入以下内容,开始运行 GUIDEMO。
运行效果图如下:
三、在emWin平台上移植RA8889显示控制功能的优势
1)显示效果优化
利用RA8889内建DRAM与BTE功能取代emWin Memory Device功能,可实现刷新显示时不闪屏,具体如何应用,可与瑞福科技联系-Q2851189731;
2) 多缓存应用
利用RA8889内建的128Mbit DRAM ,分配内存给emWin在RA8889的显存上操作,即可实现:缓存1用于液晶屏的显示(即显示区)、缓存2 用于emWin的读写操作内存、另外可分配缓存3、缓存4…等等,比如缓存3可用于显示挂在RA8889上的Flash的图片,当需要显示时,即可用BTE的复制粘贴到显示区显示,比如缓存4用作视频的缓存纽带,可完美实现emWin窗口+视频播放的显示搭配效果;以上实现具体原理,以及代码例程,可与瑞福科技联系Q2851189731技术交流。
总结:在emWin平台上配合使用瑞佑科技的液晶显示控制器芯片RA8889ML3N,即使低端的MCU,也可驱动高分辨率(1366*2048)液晶显示屏, 可做出流畅、炫酷的UI操作界面。
全部0条评论
快来发表一下你的评论吧 !