今天折腾了一下STEMWIN,做个简单的小试验。
STEMWIN是一个GUI界面,有自己一套完整的窗口部件,有自己的消息循环处理,说老实说,刚开始看到STEMWIN的演示程序的时候,我想起了WIN95。其实EMWIN的消息机制几乎和早期的WINDOWS完全一致,只不过简化了许多,哈哈。按理说,熟悉WIN32程序设计的人来使用这个STEMWIN,应该是毫无阻碍。
ST为EVAL系列板提供了完整的DEMO,其它的就对不起了。好在新版的HAL固件库为F7-DISCO也提供了一个DEMO,虽然只是一个可怜的HELLO WORLD程序,好歹也是一个DEMO啊! 得,就研究这个DEMO入手吧。
STEMWIN和其它的三方固件稍微有点区别,直接以LIB的形式提供给用户,如果要从源码编译,自己去下载源码吧。
既然是LIB的形式,开放给用户的就有限了,实际上STEMWIN已经做好了,你只要提供LCD的接口给它就行了
这里就是我们可以配置、修改的地方。一个一个来说
GUIConf.x 用来给STEMWIN分配内存空间
GUIDRV_Template.x 用来加入自己的读写像素点函数
LCDConf_FlexColor_Template.x LCDConf_Lin_Template.x 对应非线性及线性LCD配置函数,在F7-DISCO中,由于内置LTDC,经配置后的VRAM就是一个线性空间,所以就在这里配置自己的LCD低层操作就行了。
SIMC.x 用来配置模拟器的
在F7-DISCO上,将GUIConf.x和 LCDConf_Lin_Template.x 复制到用户工程里面,对它们进行修改。
在我的工程里面,将 LCDConf_Lin_Template.x 均修改成为LCDConf.x文件。
下面先看修改后的GUIConf.c文件
这里没有什么特别的,就是分配一块空间给STEMWIN用,注意这个值不可太大,也不可太小,我就分了100K。
LCDConf.c文件有几个地方要注意一下
注意上面标注的几个地方,无非是LCD大小,色彩模式,VRAM地址而已。注意要和LTDC中配置的一致,否则可能花屏或者进入HARDFAULT。
另外一个需要修改的地方在下面,这个是GUI在初始化时自动调用的LCD配置函数。
这样简单的配置之后,底层的适配就完成了。
不过要注意的是,如果使用的其它的LCD控制器,可没有这么简单,要提供读写像素点的函数,还有要配置矩形复制函数,一大堆。不过在F7上就是这么简单。
接下来就可以调用GUI函数了,GUI函数有两种类型,一种是带OS的,另一种是不带OS的。刚入门,就不用OS版了,用个单线程先玩玩。
先调用GUI_Init()来初始化GUI库,GUI初始化流程如下
上面的几个函数都分别位于GUIConf和LCDConf文件中,回头去仔细看下。
下面来看下STEMWIN中很有用的一个组件GRAPH吧,很多采集信号用的界面都会用到它。不过这东西太复杂,研究了半天还是迷迷糊糊,所以先搞个简单的先看看。代码如下
在使用STEMWIN之前,记得先打开CRC的时钟,官方文档这么说的。
创建200个随机数据,显示在GRAPH上面。
初始化SDRAM,因为LTDC用它来做显存。
GUI初始化
创建两个组件,一个是WINDOW,另一个是GRAPH,WINDOW作为GRAPH的父窗口。
将数据附加到GRAPH上面。
OK,基本完成,下面是运行效果。细节以后再研究,入个门先。
附:界面是用GUIBUILDER创建的,下面是WINDOWDLG.C文件
- /*********************************************************************
- * *
- * SEGGER Microcontroller GmbH & Co. KG *
- * Solutions for real time microcontroller applications *
- * *
- **********************************************************************
- * *
- * C-file generated by: *
- * *
- * GUI_Builder for emWin version 5.28 *
- * Compiled Jan 30 2015, 16:41:06 *
- * (c) 2015 Segger Microcontroller GmbH & Co. KG *
- * *
- **********************************************************************
- * *
- * Internet: www.segger.com Support: support@segger.com *
- * *
- **********************************************************************
- */
- // USER START (Optionally insert additional includes)
- // USER END
- #include "DIALOG.h"
- /*********************************************************************
- *
- * Defines
- *
- **********************************************************************
- */
- #define ID_WINDOW_0 (GUI_ID_USER + 0x00)
- #define ID_GRAPH_0 (GUI_ID_USER + 0x04)
- // USER START (Optionally insert additional defines)
- // USER END
- /*********************************************************************
- *
- * Static data
- *
- **********************************************************************
- */
- // USER START (Optionally insert additional static data)
- // USER END
- /*********************************************************************
- *
- * _aDialogCreate
- */
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
- { GRAPH_CreateIndirect, "Graph", ID_GRAPH_0, 67, 19, 347, 201, 0, 0x0, 0 },
- // USER START (Optionally insert additional widgets)
- // USER END
- };
- /*********************************************************************
- *
- * Static code
- *
- **********************************************************************
- */
- // USER START (Optionally insert additional static code)
- // USER END
- /*********************************************************************
- *
- * _cbDialog
- */
- static void _cbDialog(WM_MESSAGE * pMsg) {
- // USER START (Optionally insert additional variables)
- // USER END
- switch (pMsg->MsgId) {
- // USER START (Optionally insert additional message handling)
- // USER END
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * CreateWindow
- */
- WM_HWIN CreateWindow(void);
- WM_HWIN CreateWindow(void) {
- WM_HWIN hWin;
- hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
- return hWin;
- }
- // USER START (Optionally insert additional public code)
- // USER END
- /*************************** End of file ****************************/
复制代码
|
WINDOWS也是消息驱动不是