目录
一、STemWin的文件结构
二、STemWin的移植步骤
三、STemWin的LCD驱动移植
四、STemWin的触摸屏驱动移植
五、补充
STM32芯片为:STM32F407VGT6
STemWin的版本为:5.44
一、STemWin的文件结构
找到ST官方的emWin的方法:一般在HAL库文件中的 Middlewares文件夹->ST文件夹中
- Config: 包含GUI的一些配置以及GUI的一些底层的实现(例如:读点写点,这里需要将自己的LCD与触摸屏的驱动函数移植进来)
- Documentation:有关STemWin的帮助文档
- inc:有关STemWin的头文件
- Lib:STemWin的对应静态库文件(有关库文件的命名规则,则放在Release_Notes.html中)
- OS:有关STemWin的心跳时钟的一些文件,带系统或者不带操作系统(带系统的情况下用OS中的不带系统的文件也可以)
- Simulation:电脑端的仿真软件
- Software:关于STemWin的一些实用软件,比如图片转成对应显示数组,汉字的取模,字库的生成等使用功能
二、STemWin的移植步骤
在自己的工程目录创建好对应的文件夹,接下来就复制对应需要的文件了。
1、首先是Config文件夹:一般选用GUIConf GUIDRV_Template LCDConf_FlexColor_Template
2、inc文件夹全部放入自己工程文件夹下
3、Lib文件夹:根据需求选用对应的静态库文件
- 静态库文件的命名格式:
举例:STemWin_CM4_OS_wc16_ot_ARGB.a
cm4:cortexM4内核、OS:带操作系统、wc16:Wchar_t type是16位、ot:高速优化、ARGB: 支持argb
注:我这边的工程选的是STemWin_CM4_wc32.a(带操作系统的情况下,选用不带操作系统的库文件也没有太大关系)
4、OS文件夹:一般选择GUI_X.c就行了
5、编译路径的修改,库文件的添加,进行编译改错
这里提醒一下,Truestudio中添加.a文件不能直接在路径中添加,需要在选项Build-》C-Link-》Miscellaneous中添加。具体请查看:Truestudio链接静态库文件的方法
三、STemWin的LCD驱动移植
注意:使用STemWin需要使能CRC时钟。
1、Config文件夹:
- GUIConf.c文件(这里可以修改有自己分配STemWin的内存空间,使用默认的也可以)
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);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
//
// Set default font
//
GUI_SetDefaultFont(GUI_FONT_6X8);
}
- GUIDRV_Template.c文件:根据自己的LCD驱动函数,在对应位置处,添加对应的驱动功能。
//写点
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
//使用LCD快速打点函数
LCD_Fast_DrawPoint(x, y, PixelIndex);
}
//读点
static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
unsigned int PixelIndex;
//
// Convert logical into physical coordinates (Dep. on LCDConf.h)
//
#if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
int xPhys, yPhys;
xPhys = LOG2PHYS_X(x, y);
yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
GUI_USE_PARA(pDevice);
GUI_USE_PARA(x);
GUI_USE_PARA(y);
{
//
// Write into hardware ... Adapt to your system
//
// TBD by customer...
//
PixelIndex = LCD_ReadPoint(x, y);
}
#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
#undef xPhys
#undef yPhys
#endif
return PixelIndex;
}
//指定区域填充颜色
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
LCD_Fill(x0, y0, x1, y1, LCD_COLORINDEX);
}
//绘制16BPP位图
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
LCD_PIXELINDEX pixel;
LCD_SetCursor(x, y);
*(vu16 *)(0x6001FFFE) = lcddev.wramcmd; //0x6001FFFE 为LCD的SRAM所在首地址
for (;xsize > 0; xsize--, x++, p++) {
pixel = *p;
_SetPixelIndex(pDevice, x, y, pixel);
}
}
- LCDConf_FlexColor_Template.c文件
- LcdWriteReg、LcdWriteData、LcdWriteDataMultiple、LcdReadDataMultiple。修改这个程序后,可以直接使用STemWin的LCD驱动程序。但是由于我们使用的是自己的LCD驱动程序,所将这四个函数注释掉。
void LCD_X_Config(void) {
//
// Set display driver and color conversion
//
/* GUIDRV_Template_API 使用自己的API接口, 所以前面的4个读写数据或寄存器的函数都没用*/
GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);
//
// Display driver configuration, required for Lin-driver
//
LCD_SetSizeEx (0, lcddev.width , lcddev.height);
LCD_SetVSizeEx(0, lcddev.width, lcddev.height);
/*GUI与触摸屏进行位置校准*/
if(lcddev.dir == 0) //竖屏
{
GUI_TOUCH_Calibrate(GUI_COORD_X,0,320,0,319);
GUI_TOUCH_Calibrate(GUI_COORD_Y,0,480,0,479);
}else //横屏
{
GUI_TOUCH_Calibrate(GUI_COORD_X,0,480,0,479);
GUI_TOUCH_Calibrate(GUI_COORD_Y,0,320,0,319);
}
}
以上LCD显示屏的STemWin的LCD显示驱动就移植成功了,可以使用一下相关的显示函数测试一下,看是否能够运行成功。
四、STemWin的触摸屏驱动移植
1、创建一个.c文件或者在触摸屏驱动代码下,添加STemWin的触摸屏驱动代码
STemWin真正调用的是int GUI_TOUCH_X_MeasureX(void) 和 int GUI_TOUCH_X_MeasureY(void),用来获取x,y坐标的数据,所以只要将触摸屏的对应获取x坐标、y坐标的驱动放到里面就可以了。
其他3个函数可以实现也可以省略。
int GUI_TOUCH_X_MeasureX(void)
{
int32_t xvalue;
tp_dev.scan(0);
xvalue=tp_dev.x[0];
return xvalue;
}
int GUI_TOUCH_X_MeasureY(void)
{
int32_t yvalue;
tp_dev.scan(0);
yvalue = tp_dev.y[0];
return yvalue;
}
void GUI_TOUCH_X_ActivateX(void)
{
}
void GUI_TOUCH_X_ActivateY(void)
{
}
void GUI_TOUCH_X_Disable(void)
{
}
以上大致就完成了STemWin的移植了,这个时候就用STemWin的API进行GUI的设计了!
有关STemWin接口的api在Document文件夹中!
五、补充
STemWin官方手册中提到的初始化过程