搭建emWin的Windows仿真环境
emWin的Windows仿真版本是免费的,大家可以直接在Segger官网下载, 下载链接:https://www.segger.com/downloads/emwin/
下载得到压缩包的文件名为:SeggerEval_WIN32_MSVC_MinGW_GUI_V548.zip, 它是emWin 的V5.48版本,本教程中我们就以这个版本为例子讲解。
解压该压缩包,其文件内容说明见图 emWin仿真版本文件 。
emWin仿真版本的工程在Windows上是使用Visual c++作为编译器的, 而现在Visual c++编译器一般都集成到Visual Studio开发环境中了, 而且由于VC6.0实在是太老太丑,笔者无法忍受, 所以在本教程中野火使用VS 2019 社区版 (Microsoft visualstudio community 2019)作为开发环境进行, 请读者自行安装VS 2019 社区版开发环境。
4.2. 使用VS 2019 社区版仿真emWin
接下来我们介绍一下用VS 2019 社区版仿真emWin的步骤。
1.解压文件。解压emWin仿真版本压缩包,注意解压后的文件路径不要出现中文,否则在编译时会出错的;
2.打开仿真工程。安装了VS 2019 社区版集成环境后,打开emWin仿真版本的目录,找到“SimulationTrial.sln”文件,双击打开, 打开后会弹出一个对话框提示VC++版本的问题,直接选择“确定”即可,见图 emWin仿真版本的文件
3.配置仿真工程属性。成功打开工程后,右键单击SimulationTrial项目,在弹出的选项中选择属性,见图 配置emWin仿真工程属性 ;
4.在弹出的工程属性页面中,展开链接器选项,进入输入设置;
5.在其中的附加依赖项中添加:legacy_stdio_definitions.lib,注意添加分号;
6.在忽略所有默认库中填:否;
7.在忽略特定默认库中添加:LIBC.lib;LIBCMTD.lib,具体见图 配置工程链接器输入属性 ;
8.接下来转到链接器选项中的高级设置,修改映像具有安全异常处理程序的值为:否,具体见图 配置仿真工程链接器高级设置 。
9.开始编译工程。工程属性修改完成后,可以直接按快捷键“F5”,或者点击编译器中的“本地Windows调试器”按钮, 编译并运行工程。接下来就开始了编译过程,正常的话都会编译通过,然后弹出一个emWin仿真运行的界面,见图 运行仿真 。
按照我们以上的步骤,默认编译的是emWin官方的演示例程,它向我们展示了使用emWin库制作出来的GUI效果, 跟嵌入式平台相比,受液晶屏及CPU运行速度的影响,一般其效果会好一些,读者可亲自品味一下。部分仿真效果图见图 emWin演示例程仿真效果图 。
4.3. emWin仿真文件概览
现在我们来看看emWin仿真工程里的文件,它主要包含了Application、Config、GUI、 Simulation目录及一些外部依赖项文件,见图 emWin仿真工程文件介绍 。
从V5.38版本开始,emWin仿真工程的文件内容和结构出现了较大变化,下面我们就来介绍一下该工程下的各类文件。
Application文件夹
Application文件夹是默认演示例程的应用文件包。在上一个小节中,我们编译的文件都是在这个Application目录下的, 它包含了一个官方演示例程的应用文件,展开Application目录后,可以到这些文件命名都很规范,文件内容一目了然。 读者如果看到很炫酷的示例,可以到这里找找它的源代码来学习(综合演示例程学习难度较大,适合有一定emWin基础的用户)。 emWin仿真工程附带了8个官方演示例程,除了默认启动的例程以外, 其余的演示例程路径位于:\Sample\Application中, Application文件列表见图 Application目录下的文件 。
Config文件夹
Config文件夹是显示配置文件包。在Config文件夹下,有GUIConf.c、GUIConf.h、LCDConfig.c、LCDConfig.h及SIMConfig.c文件, 其中前三个文件在实际的嵌入式平台是非常重要的,它们分别起到了分配存储空间、裁剪emWin功能模块和LCD底层驱动实现。 而LCDConfig.h文件没有内容,SIMConfig.c文件是VS 2019 社区版仿真环境需求的一些特定设置,在此我们不作探讨。 关于GUIConf.c、GUIConf.h与LCDConfig.c文件的内容见 代码清单:仿真-1 、代码清单:仿真-2 和 代码清单:仿真-3 。
#include "GUI.h"
/*********************************************************************
*
* Defines
*
**********************************************************************
*/
//
// Define the available number of bytes available for the GUI
//
#define GUI_NUMBYTES 0x280000
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUI_X_Config
*
* Purpose:
* Called during the initialization process in order to set up the
* available memory for the GUI.
*/
void GUI_X_Config(void)
{
//
// 32 bit aligned memory area
//
static U32 aMemory[GUI_NUMBYTES / 4];
//
// Assign memory to emWin
//
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
}
/*************************** End of file ****************************/
GUIConf.c文件主要包含了一个GUI_X_Config函数,在这个函数中向系统申请了一个大小为2.5MB(0x280000) 的静态空间aMemory, 接着调用emWin的库函数GUI_ALLOC_AssignMemory把这个空间分配给emWin。所以emWin的库函数使用的存储空间都是aMemory中分配的。 在嵌入式平台上,我们需要根据其限制控制分配给emWin库的aMemory大小,修改宏GUI_NUMBYTES即可。 根据我们的测试,STemWin的演示例程在野火STM32开发板平台上使用43KB即可正常运行。
#ifndef GUICONF_H
#define GUICONF_H
/*********************************************************************
*
* Multi layer/display support
*/
#