目录

一、STemWin的文件结构

二、STemWin的移植步骤

 三、STemWin的LCD驱动移植

四、STemWin的触摸屏驱动移植

五、补充


STM32芯片为:STM32F407VGT6

STemWin的版本为:5.44

一、STemWin的文件结构

找到ST官方的emWin的方法:一般在HAL库文件中的 Middlewares文件夹->ST文件夹中

openharmony 移植opencv_驱动移植

  • 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

openharmony 移植opencv_STM32_02

2、inc文件夹全部放入自己工程文件夹下

3、Lib文件夹:根据需求选用对应的静态库文件

  • 静态库文件的命名格式:

openharmony 移植opencv_驱动移植_03

举例: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官方手册中提到的初始化过程

openharmony 移植opencv_STM32_04