开源GUI STemWin在小熊派上的移植
扫描二维码
随时随地手机看文章
该Demo用GUIBuilder工具画了一个
Listview
的控件以及三个Text
控件以及一个Image控件,最后保存生成代码拷贝到Keil MDK后编译下载到小熊派上运行。1、STemWin简介
STemWin是SEGGER
公司授权给意法半导体(ST)
公司,使用ST芯片的用户可免费使用STemWin,关于STemWin的显示效果,有兴趣的可自行百度搜索查看。1.1 下载并熟悉官网最新版本的STemWin
解压后得到以下目录,移植STemWin最主要关心的是
Libraies
目录下的与STemWin相关的库文件,其它的多数是ST官网的一些Demo例程,暂时用不着,如下图所示:简单介绍下以下几个目录:2、小熊派移植STemWin
2.1 移植STemWin到小熊派
2.1.1 添加STemWin软件包到带LCD的基础工程
首先需要一个源码工程,这个直接从小熊派源码包拿就行了,不需要重新去写,我们本次移植的是不带操作系统的。解压,然后在工程目录下创建两个和STemWin相关的目录:将1.1下载的STemWin软件包整个拷贝到STemWin这个目录下。2.1.2 添加STemWin相关库及文件到Keil MDK
这个app.c用来存放
GUIBuilder
软件生成的代码,最后通过调用STemWin的CreateWindow
函数来展示界面。2.1.3 修改STemWin所需要的内存空间
位于GUIConf.c
文件:#define GUI_NUMBYTES (16*1024)//0x200000 //设置EMWIN内存大小
注意:如果该参数设置太大的话Keil会报空间不够的错误,这里我们根据需求,将其设置为16*1024
即可,它分配的其实是一块静态连续的内存空间:2.1.4 配置LCD及STemWin相关
位于LCDConf_FlexColor_Template.c
文件:在这个文件中,我们需要包含LCD驱动文件,小熊派已经实现好了,我们直接拿过来用就行了。#inlcude "lcd.h"
注意lcd.h中并没有写命令和写数据的函数声明,这里我们需要将lcd.c修改一下,然后在lcd.h导出这两个函数,才能给LCDConf_FlexColor_Template.c
使用。(1)修改LCD显示分辨率
//更改显示分辨率
#define XSIZE_PHYS 240 // To be adapted to x-screen size
#define YSIZE_PHYS 240 // To be adapted to y-screen size
(2)实现写指令、写数据、写多个数据、读多个数据接口
注意,官方给的模板默认是一次2个字节的写入,而小熊派LCD是SPI OLED(ST7789)
,实现的接口是一次只写1个字节的数据,所以我们要将接口改成1个字节的写入,否则显示会有问题。 /********************************************************************
*
* LcdWriteReg 写寄存器
*
* Function description:
* Sets display register
*/
static void LcdWriteReg(U8 Data)
{
// ... TBD by user
LCD_Write_Cmd(Data);
}
/********************************************************************
*
* LcdWriteData 写数据
*
* Function description:
* Writes a value to a display register
*/
static void LcdWriteData(U8 Data)
{
// ... TBD by user
LCD_Write_Data(Data);
}
/********************************************************************
*
* LcdWriteDataMultiple 写多个数据
*
* Function description:
* Writes multiple values to a display register.
*/
static void LcdWriteDataMultiple(U8 * pData, int NumItems)
{
while (NumItems--)
{
// ... TBD by user
LCD_Write_Data(*pData );
}
}
/********************************************************************
*
* LcdReadDataMultiple 读多个点
*
* Function description:
* Reads multiple values from a display register.
*/
static void LcdReadDataMultiple(U8 * pData, int NumItems)
{
while (NumItems--)
{
// ... TBD by user
//没有读点函数,留空
}
}
(3)修改LCD_X_Config函数
void LCD_X_Config(void)
{
GUI_DEVICE * pDevice;
CONFIG_FLEXCOLOR Config = {0};
GUI_PORT_API PortAPI = {0};
// Set display driver and color conversion
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0);
// Display driver configuration, required for Lin-driver
LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
// Orientation
//Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
Config.Orientation = 0 ;
Config.NumDummyReads = 2;
GUIDRV_FlexColor_Config(pDevice,