μC/GUI是一种专为嵌入式应用设计的通用图形接口软件。本文详细介绍了μC/GUI的结构框架和基于STM32平台的μC/OS-II上的μC/GUI移植过程,并在此基础上进行图形界面设计;阐述了μC/GUI的窗口管理机制,提出了实现μC/GUI中文小型字库的两种方法并采用存储设备解决了图形显示的闪烁问题。
嵌入式系统的图形用户界面,要求具有占用资源少、性能高、可靠性高、可移植、可配置等特点,μC/GUI就是这样一种专门为嵌入式应用设计的图形用户界面软件。μC/GUI可应用于多任务环境中,同时使用实时 *** 作系统与μC/GUI,既可以发挥优先级的实时性,又能实现良好的人机界面。本文使用Cortex-M3内核的STM32平台,介绍了基于STM32平台的μC/OS-II上的μC/GUI移植过程,并在此基础上开发了基于μC/GUI的图形用户界面。
1 μC/GUI结构框架
1.1 μC/GUI的文件组织
μC/GUI软件采用模块化组织架构,其中较为重要的文件目录是配置文件目录Config和GUI库文件目录。考虑到未来升级方便,建议保持μC/GUI原有的目录结构,这样升级到新版本时只要覆盖原文件目录即可,而不会改变整个工程的文件路径。
μC/GUI是一个源代码开放的图形系统,它提供了丰富的资源,包括二维绘图库,多字体、可扩充的字符集,UnICode,位图显示,多级RGB颜色管理及灰度处理调整机制,动画优化显示,具有Windows风格的对话框和预定义控件(按钮、编辑框、列表框、进度条、单选复选框、滑动条等);同时,支持键盘、鼠标、触摸屏等输入设备和双LCD的输出,提供占用极少RAM的窗口管理体系。各个子目录的路径及功能支持如表1所列。
1.2 μC/GUI的层次结构
μC/GUI内核提供多种图形显示功能,用户程序通过API函数接口调用μC/GUI函数库中的各个功能函数,然后各个功能函数通过调用硬件驱动实现图形界面显示。
一个典型的包含有μC/GUI的软件系统可以理解为一个层次结构,详细的μC/GUI软件体系的层次结构如图1所示。
2 基于STM32平台的μC/GUI移植
2.1 STM32F103系列单片机和移植平台简介
硬件开发平台的核心是ST公司的STM32F103系列单片机,实时 *** 作系统选择移植性较强的μC/OS-II。STM32F103系列单片机最高主频为72 MHz;片内多达51 2 KB的Flash并可以直接运行程序,片内还有64 KB的RAM;拥有众多的定时器、中断源和外设,内部集成了一个高速外部存储器接口FSMC总线,可以很方便地控制液晶显示模块。目标平台的液晶模块采用320×240分辨率,通过FSMC总线接口连接STM32F103单片机,并在系统的内存区开辟一块内存作为液晶显示的后台缓存。
2.2 μC/OS-II上的μC/GUI移植
μC/GUI的移植内容主要分成4部分:μC/GUI配置文件的参数修改,LCD驱动程序的编写,LCD触摸屏驱动程序编写,以及与μC/OS-II *** 作系统相关接口部分的修改。
2.2.1 μC/GUI配置文件的参数修改
主要是根据系统的实际情况对GUI/Config目录下3个配置文件的参数进行修改,设计采用的LCD选用320×240的液晶显示模块,LCD控制器采用ili9320。
①LCDConf.h文件主要定义LCD控制器和显示屏尺寸及可选择的功能。修改如下:
2.2.2 LCD驱动程序的编写
LCD的驱动程序在GUI/LCDDriver目录下,在本次移植中编写的ili9320.c驱动文件主要定义了GUI与LCD的硬件接口函数,包括画点、线、矩形、多边形、位图等二维图形的函数等等。μC/GUI所有的系统函数都是通过调用这些硬件接口来实现其功能的,而这些接口函数又可以通过调用画点函数来实现,可以认为几乎所有的μC/GUI显示功能都是通过最终调用画点函数来实现的。所以笔者的LCD驱动程序重点在画点函数的编写。代码如下:
2.2.3 LCD触摸屏驱动程序的编写
STM32F103通过SPI总线与触摸屏芯片相连,通常的方法是采用轮询的方法获取触摸屏的触点动作,这种方法不仅实时性差而且浪费单片机的执行周期。采用触摸屏的触点动作通过外部中断进行检测,在中断服务程序中获取触点的位置坐标,并通过调用函数GUI TOUCHStoreSta te(xScreen,yScreen),将触点坐标保存并通知μC/GUI。由于触摸屏和LCD的大小不一定完全相等,坐标原点的位置也可能不同,为了实现对应,需要进行A/D转换,实现数值到逻辑坐标的转换。
2.2.4 *** 作系统相关接口部分的修改
μC/OS-II *** 作系统下使用μC/GUI需要提供一些内核接口函数来实现任务间同步。有了这些内核接口函数,就可以使μC/GUI运行于μC /OS-II系统上,通过任务调度来实现各个任务之间的协调工作,接口函数实现如下:
至此,μC/GUI的移植就基本上完成了,需要编写测试用例,如果显示效果不理想,再对移植的GUI进行底层配置优化和改进。
3 μC/GUI的图形界面设计
μC/GUI是具有类似Windows窗口风格的图形系统,以其窗口作为内存管理的基本单元,采用消息传递机制和回调函数机制。μC/GUI提供给窗口和窗口控件回调机制的背后,是一个事件驱动标志(即消息)。回调函数的过程也是消息传递的过程。
3. 1 μC/GUI的窗口管理机制
μC/GUI的窗口管理器用于管理LCD屏幕上图形显示的区域(即窗口),使其重叠、嵌套和并列。使用μC/GUI窗口管理时,任何能显示在显示终端上的内容都包含在一个窗口中,这个窗口是LCD屏幕上的一个给用户画图或者显示目标的区域。窗口的创建、显示以及删除都离不开消息传递和回调函数机制。
在μC/GUI中定义了数十种用于各类基本 *** 作的消息宏,对每个窗口的 *** 作都是通过向其对应的回调函数传送消息参数来完成的。回调函数是由用户定义的,当特定事件发生时,指示图形系统调用特定的函数。当窗口的内容发生改变时,它们用来自动重绘窗口。具体 *** 作是通过一个指向函数的指针从窗口结构体数据项中得到回调函数的首地址,并将消息作为参数调用该函数来完成的,回调函数在接收到消息后进行相应处理。
回调函数的基本作用是实现窗口刷新。一个简单的自动更新窗口的回调函数如下:
3.2 μC/GUI实现中文小型字库的两种解决方法
μC/GUI带有多种常用的ASCII字体,也支持UNICODE字符显示,考虑到嵌入式系统内存资源有限,没有装入汉字库,可以根据系统的实际需要建立一个小型汉字库,以解决汉字的显示问题。在μC/GUI下笔者提出两种实现中文小型字库的解决方法。
(1)在μC/GUI的字库结构体中建立一种新的字体
μC/GUI的文字显示是通过查找字模的方式实现的。字库中的每个文字都有其对应的字模,所有的字模都是由GUI FONT和GUI FONT PORT这两个结构体来管理的。从汉字库中选取必需的汉字组成字库,并将汉字对应的不连续汉字机内码映射到一个连续区域。此时需要建立一个GUI_FONT_PROP结构来管理所有的汉字。例如,要实现“设置”这2个字,具体的伪代码如下:
(2)直接建立汉字库,通过LCD驱动直接显示汉字
该方法通过将汉字的机内码和汉字点阵组合成一个汉字字模结构体,然后选取所必需的汉字,按照汉字字模结构体的方式存放在汉字库数组中,然后通过调用一个“汉字搜索函数”来搜索这个汉字库数组的机内码即可确定相应的汉字,并把汉字对应的点阵通过LCD驱动直接
进行显示。
上述的两种方法都能在嵌入式的图形界面中实现中文显示,方法二为通过LCD驱动直接显示汉字,适合在窗体中显示汉字,而不能在控件上直接显示汉字。虽然可以用叠加的方法(即先画一个控件,然后再在上面显示汉字),但是这样处理很不方便。方法一是在μC/GUI的字库中建立了一种新的字体,因此在控件上显示汉字时直接调用μC/GUI函数即可,不会出现上述问题,因此笔者推荐使用方法一实现μC/GUI的中文小型字库。
3.3 采用存储设备解决图形显示的闪烁问题
采用存储设备可以有效地防止显示屏在对有对象重叠的绘图 *** 作时的闪烁现象。没有使用存储设备时,绘图 *** 作直接写屏,屏幕在绘图 *** 作执行时更新,当不同的更新在执行时会产生闪烁。如果这样的 *** 作使用一个存储设备的话,那么所有的 *** 作在存储设备内执行,具有无闪烁的优点。μC/GUI的存储设备是一个可选的软件项目,为了优化软件的性能,提高图形的显示效果,需要采用存储设备技术。μC/GUI中存储设备的使用一般流程为建立存储设备、激活、执行绘图 *** 作将结果拷贝到显示屏显示,最后将创建的存储设备删除。
4 结论
为了验证移植丁作成功与否,需要建立一个多任务测试用例,这个用例由3个任务构成:Main Task、GUITask、APP_Task。其中:Main_ Task任务用于设置背景窗口的回调函数和建立另外两个任务;APP_Task任务用于建立一个窗口并设置其相关的属性;GUI_Task任务用于视窗管理和多级图形画面的切换。将测试用例烧写进目标板,目标板采用神舟III号STM32开发板,液晶屏为320×240像素的TFT型液晶屏幕。图2为测试用例在目标板上的运行结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)