emWin
5.22 (uCGUI) 图形用户接口移植实例——STM32
作者:Ach
日期:2013年12月29日
联系方式:ox000008@163.com
1. 概要
移植图形用户接口的好处是不言而喻的。本文图文并茂地介绍了一个emWin 5.22(uCGUI)的移植实例。文章具体分为emWin简介,硬件平台简介,开发环境及项目简介,移植过程以及总结几个部分。
2. emWin简介
emWin是一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于GUI的设计。这里借用STemWin的一幅图来说明emWin的作用和结构。它通过LCD及GUI的配置来驱动底层硬件,而应用程序又是通过调用emWin来实现各种GUI。5.22版的emWin带有许多常用的显示控制器的驱动(在参考手册Display Driver一章中有详细介绍),因此为我们移植带来了诸多方便。emWin的更详细的内容可参照它的参考手册。
图1. emWin在项目中的结构
3. 硬件平台简介
笔者使用的是一块以STM32F103VET6为核心的ARM开发板,没有外部的SRAM及Flash。显示屏为2.8”
320*240的彩色液晶屏,屏的驱动芯片为ILI9341(emWin 5.22带有它的驱动)。屏与CPU的连接方式为该ARM核心所特有的FSMC_SRAM方式,访问LCD内容时操作就如同读写SRAM一样方便。
如果你想使用其它硬件平台来移植emWin,本文亦有一定的参考价值。希望本文能助你成功移植emWin。
图2. 硬件平台
4. 开发环境简介
笔者所使用的开发软件为MDK-ARM
4.70。项目模板使用的是STemWin库中的(可从ST官方下载)。
图3. 项目截图
如图,项目下面有3个文件夹,其中Appli存放的是应用层的程序,第二个文件夹就如文件名,存放了emWin5.22所有部件,第三个文件夹存放了一些STM32及其它的库。具体见附件。
5. 移植过程
有了MDK-ARM以及STemWin库,整个移植过程应该比较简单。STemWin中有4个文件夹,第一个可以不用看了,Libraries中包含所有需要的库(其中包含emWin5.22),Project中存放工程文件,Utilities中是一些应用文件。为了保持代码及工程结构的格式统一,我们尽量套用原有的格式。下面开始一步步的移植工作。
5.1 项目配置
打开Project文件夹,看到众多STM32的开发板文件夹。如果你有相应的板子,就不用修改直接用。我使用的是STM32F103核心的板子,因此我选了STM3210E-EVAL为模板,取名TEST(自取)。打开该文件夹,里面有2个文件夹,分别为RTOS和Standalone,RTOS是带操作系统的。我们打开Standalone,其中有6个文件夹,分别为Config、Demo、EWARM、MDK-ARM、TrueSTUDIO及User,具体的不一一介绍了。打开MDK-ARM,我们要的工程文件就在其中了。
打开工程,先点击如图左边红圈处编译一下,工程应该是没有错误的。然后根据你所使用的硬件开发环境点击右边红圈处配置一下项目。
点击Device标签设置器件,我应该选STM32F103VE。
点击Output标签,勾选左边红圈处,编译后会输出HEX文件,当然你也可以改一下右边红圈内的名字。
点击Debug标签,设置调试信息,选择你的调试工具即可,不详细介绍了。
点击Utilities标签,我的设置如图。
为了可以直接在项目中向开发板烧录程序,我们点Settings设置一下,我的设置如下图,其中添加了如图的片上Flash编程算法。
点击OK设置完毕。
5.2 程序修改
准备工作已经完成,接着要根据模板进行修改了。看一下Appli中的main主程序,如下。先看“BSP_Init();”,这是开发板的初始化程序,我们先把它注释掉,然后在后面加上下面的语句,因为需要用到CRC模块。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
接着我们修改LCD和GUI配置文件。
先是LCDConf_stm3210e_eval.c,修改显示屏大小,我的不用改了。
#define XSIZE_PHYS
240
#define YSIZE_PHYS
320
修改接口寄存器地址,我的如下。这里说明一下,我的是用FSMC_SRAM接口的,和官方开发板类似。如果你用得是其它接口,在emWin参考手册Display drivers -> CPU / Display controller interface中有对硬件接口的详细叙述,它吧接口分为直接和间接两种,我们用的嵌入式系统一般是间接的接口。查找是否有我们所使用的显示芯片的驱动,然后参考手册进行相应的操作。我使用的ILI9341驱动在GUIDRV_FLEXCOLOR中有。
// COG interface register addr.
//
#define LCD_BASE ((uint32_t)(0x60000000 |
0x00000000))
#define LCD_REG_ADDRESS (*(volatile U16*)LCD_BASE)
#define LCD_DATA_ADDRESS (*(volatile U16*)(LCD_BASE + 0x20000))
Local functions那一段我就不用改了。Public
functions中有两个接口函数LCD_X_Config和LCD_X_DisplayDriver。
LCD_X_Config,驱动为GUIDRV_FLEXCOLOR,颜色为16位GUICC_565转换方式。
pDevice
= GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
Set controller and operation mode,将一些显示驱动用的函数传递给PortAPI。再通过函数GUIDRV_FlexColor_SetFunc进行设置,查看参考手册GUIDRV_FlexColor段,ILI9341 驱动在GUIDRV_FLEXCOLOR_F66709中,接口形式为GUIDRV_FLEXCOLOR_M16C0B16。
PortAPI.pfWrite16_A0
= LcdWriteReg;
PortAPI.pfWrite16_A1
= LcdWriteData;
PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
PortAPI.pfReadM16_A1
= LcdReadDataMultiple;
GUIDRV_FlexColor_SetFunc(pDevice,&ortAPI,GUIDRV_FLEXCOLOR_F66709,GUIDRV_FLEXCOLOR_M16C0B16);
最后一个函数LCD_X_DisplayDriver,把“STM3210E_LCD_Init();”改成你的初始化程序即可,当然,在前面要把需要的头文件包含进去。至此,我们把LCD配置改完了。
GUIConf_stm3210e_eval.c,程序主要是为GUI分配可以的内存。对于这里,我只能理解给它分配足够大的内存可以让现实更流畅。由于我板上的内存有限,总共64KB,后面GUIDEMO还要用内存,所以分配16KB给它。
// Define the available number of bytes available for
the GUI
//
#define GUI_NUMBYTES
(1024) * 16 // x KByte
接着,修改Appli中的GUIDEMO.h文件,看Configuration of
modules to be used段,配置我们要运行的模块。我们先试前面3个模块,其它都关掉(设为0)。内存小的话不要开太多了,否则内存不够用。
至此,程序已经基本修改完毕,重新编译程序,修改错误之处直至编译通过,下载程序到开发板。
演示画面已经显示,但是,画面为什么停在那里呢?我们再回来看main中的“BSP_Init();”函数。它里面包含了一个非常重要的东西,我们在函数名上点击右键,选择“Go To Definition Of ‘BSP_Init’”查看该函数的定义。
其中包含了“SysTick_Config(SystemCoreClock
/ 1000);”,即对SysTick的配置,它就像人的心跳一样,是系统运行的钟摆。它被配置为1ms产生一个中断。
在stm32xxx.it中,有一个“SysTick_Handler”中断处理函数,“OS_TimeMS
++;”即实现了emWin的运行。我们把不需要的都注释掉,然后编译工程,下载到开发板。至此,emWin已经能够在目标板上运行。
6. 总结
移植emWin只是一个开始,还有更多的奥秘等待我们去探索,相信只要我们能够努力,一定能开发出漂亮的界面。
注:文中的项目较大,如有需要,邮me!同时欢迎交流指正。
完成时间2013年12月30日
Ach#
代码链接:
http://yun.baidu.com/s/1hqeaJ2k
若链接失效,邮箱联系。
补充内容 (2016-11-23 13:38):
程序链接
链接:http://pan.baidu.com/s/1geRMeXX 密码:zers
补充内容 (2016-11-23 13:40):
对于没有及时回复的深感抱歉,很久没来论坛,有急事可以发我邮箱,一般几天会看一下,,,
支持论坛 +++ |