历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2018年02月05日 | 基于STM32平台的μC/OS-II上的μC/GUI移植过程

2018-02-05 来源:eefocus

    μ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所列。

a.JPG

    
1.2 μC/GUI的层次结构
    μC/GUI内核提供多种图形显示功能,用户程序通过API函数接口调用μC/GUI函数库中的各个功能函数,然后各个功能函数通过调用硬件驱动实现图形界面显示。

b.JPG

    
    一个典型的包含有μ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控制器和显示屏尺寸及可选择的功能。修改如下:
    
 d.JPG

2.2.2 LCD驱动程序的编写
    LCD的驱动程序在GUI/LCDDriver目录下,在本次移植中编写的ili9320.c驱动文件主要定义了GUI与LCD的硬件接口函数,包括画点、线、矩形、多边形、位图等二维图形的函数等等。μC/GUI所有的系统函数都是通过调用这些硬件接口来实现其功能的,而这些接口函数又可以通过调用画点函数来实现,可以认为几乎所有的μC/GUI显示功能都是通过最终调用画点函数来实现的。所以笔者的LCD驱动程序重点在画点函数的编写。代码如下:
    e.JPG
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系统上,通过任务调度来实现各个任务之间的协调工作,接口函数实现如下:
    f.JPG
    至此,μC/GUI的移植就基本上完成了,需要编写测试用例,如果显示效果不理想,再对移植的GUI进行底层配置优化和改进。

3 μC/GUI的图形界面设计
    μC/GUI是具有类似Windows窗口风格的图形系统,以其窗口作为内存管理的基本单元,采用消息传递机制和回调函数机制。μC/GUI提供给窗口和窗口控件回调机制的背后,是一个事件驱动标志(即消息)。回调函数的过程也是消息传递的过程。
3. 1 μC/GUI的窗口管理机制
    μC/GUI的窗口管理器用于管理LCD屏幕上图形显示的区域(即窗口),使其重叠、嵌套和并列。使用μC/GUI窗口管理时,任何能显示在显示终端上的内容都包含在一个窗口中,这个窗口是LCD屏幕上的一个给用户画图或者显示目标的区域。窗口的创建、显示以及删除都离不开消息传递和回调函数机制。
    在μC/GUI中定义了数十种用于各类基本操作的消息宏,对每个窗口的操作都是通过向其对应的回调函数传送消息参数来完成的。回调函数是由用户定义的,当特定事件发生时,指示图形系统调用特定的函数。当窗口的内容发生改变时,它们用来自动重绘窗口。具体操作是通过一个指向函数的指针从窗口结构体数据项中得到回调函数的首地址,并将消息作为参数调用该函数来完成的,回调函数在接收到消息后进行相应处理。
    回调函数的基本作用是实现窗口刷新。一个简单的自动更新窗口的回调函数如下:
    
   h.JPG
3.2 μC/GUI实现中文小型字库的两种解决方法
    μC/GUI带有多种常用的ASCII字体,也支持UNICODE字符显示,考虑到嵌入式系统内存资源有限,没有装入汉字库,可以根据系统的实际需要建立一个小型汉字库,以解决汉字的显示问题。在μC/GUI下笔者提出两种实现中文小型字库的解决方法。
    (1)在μC/GUI的字库结构体中建立一种新的字体
    μC/GUI的文字显示是通过查找字模的方式实现的。字库中的每个文字都有其对应的字模,所有的字模都是由GUI FONT和GUI FONT PORT这两个结构体来管理的。从汉字库中选取必需的汉字组成字库,并将汉字对应的不连续汉字机内码映射到一个连续区域。此时需要建立一个GUI_FONT_PROP结构来管理所有的汉字。例如,要实现“设置”这2个字,具体的伪代码如下:
    i.JPG
    (2)直接建立汉字库,通过LCD驱动直接显示汉字
    该方法通过将汉字的机内码和汉字点阵组合成一个汉字字模结构体,然后选取所必需的汉字,按照汉字字模结构体的方式存放在汉字库数组中,然后通过调用一个“汉字搜索函数”来搜索这个汉字库数组的机内码即可确定相应的汉字,并把汉字对应的点阵通过LCD驱动直接
进行显示。
   j.JPG
    上述的两种方法都能在嵌入式的图形界面中实现中文显示,方法二为通过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为测试用例在目标板上的运行结果。

k.JPG

    
    结果表明,能显示中文小型字库,对有对象重叠的绘图操作时无闪烁现象,基本达到预期的目标。


推荐阅读

史海拾趣

Excelitas公司的发展小趣事

随着技术的不断成熟和市场的扩大,Excelitas公司开始寻求全球扩张。公司先后在北美、欧洲和亚洲设立了研发中心和生产基地,以更好地服务全球客户。在全球扩张的过程中,Excelitas注重本土化战略,积极与当地企业合作,共同开拓市场。这一策略不仅帮助公司快速融入当地市场,还促进了公司业务的持续增长。

COILCRAFT公司的发展小趣事

为了更好地服务全球客户,COILCRAFT公司在北美、亚洲和欧洲等地建立了制造、分销和工程设施。这一全球布局使得公司能够快速地响应客户需求,提供高效的服务和运输。同时,COILCRAFT还拥有丰富的网络工具库和免费评估样品政策,这些措施简化了部件选择过程,提高了客户的满意度。

EM Devices Corporation公司的发展小趣事

EM Devices Corporation始终将产品质量放在首位。公司建立了一套严格的质量管理体系,对生产过程中的每一个环节都进行严格的监控和检测。同时,公司还不断引入先进的生产设备和工艺,提高产品的生产效率和质量。此外,公司还鼓励员工提出改进意见和建议,以便及时发现并解决问题。这种持续改进的精神使得EM Devices Corporation的产品在市场上始终保持着良好的口碑。

台湾凯励(Carli)公司的发展小趣事

作为一家有社会责任感的企业,凯励公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,凯励公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了凯励公司的社会责任感,也为其在电子行业树立了良好的形象。

CANDD公司的发展小趣事

随着市场竞争的加剧,CANDD公司意识到单打独斗已经无法满足市场的需求。于是,公司开始积极寻求与其他企业的合作机会。通过与知名电子品牌商的合作,CANDD公司成功将其技术应用于更广泛的产品领域,进一步扩大了市场份额。同时,公司还与其他技术提供商建立了战略联盟,共同研发新技术,实现了互利共赢。

智烽维(CDA)公司的发展小趣事

经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。

问答坊 | AI 解惑

网卡驱动安装后,网络连接里怎么没有

网卡驱动我用的DDK的例程,isdnwan,编译好后进行安装,可以看到驱动和网卡都安装了,但是在网络连接里怎么没有啊,不懂,求助…

查看全部问答>

急问各位专家,关于2440接128m内存的问题

我在论坛上搜索了很多关于2440接128m内存运行wince的帖子,然后动手做,结果遇到了一个很困惑的问题。我现在也是用2片MT48LC32M16A2,然后地址接25,26,然后boot 中的部分都各位贴出来的方式做了修改,结果发现,如果把b6_scan设为10bit的话,内存 ...…

查看全部问答>

菜鸟有个关于ADS建立工程的问题,高手指点啊!

以前使用ADS1.2时都是在原有的工程上添加自己的程序,这次自己建了一个工程,发现ARM竟然不会动,程序和以前的程序一样。可能是建工程的时候设置的问题导致不能运行。 哪个好心的大哥能否建立一个工程,每设置一步剪一个图片下来,并加以说明!急 ...…

查看全部问答>

嵌入式人才的发展方向,给从事嵌入式开发的同学指路(转)

     嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家 ...…

查看全部问答>

WinCE5.0下使用,.net下开发类似WindowXP中rasdial一样功能程序

请高手指教,做一个这样的东西要多少时间?…

查看全部问答>

IMTI英泰移动通信学院(哈尔滨)招聘IT职业培训师

IMTI哈尔滨招聘 下述培训师均须具备: 1、具有良好的沟通能力,学习态度,团队合作精神 2,具有优秀的口头及书面表达能力,能够进行宣讲 一、J2EE方向培训师 职位描述: 1、计算机等相关专业专科以上学历,3年以上软件开发经验; 2、精通 ...…

查看全部问答>

请问电话线接法??

请问二蕊的电话线如何接?线序怎样?四蕊的电话线如何接?线序怎样? 电话线头分哪些,最好有图片, 谢谢。 …

查看全部问答>

LM3S2110的板子怎样烧程序啊? 菜鸟先谢过各路大神!!T T

跟8962一起的ek套件, 10针can和20针debug 但没有usb借口 怎么办?…

查看全部问答>

对功放比较熟的朋友看下这个图··

能解析一下这个图吗,画圈部分的管子的作用我不是很明白···问了很多人了都无法完美解释…

查看全部问答>

TMS570LS0432 原理图库

TMS570LS0432 原理图库 环境:99SE …

查看全部问答>