目录

  • 一,创建
  • 二,改STemWin
  • 2.1 GUIConf.c //配置内存
  • 2.2 GUIConf.h
  • 2.3 LCDConf.c //配置图层 颜色等
  • 2.4 GUIDRV_Template.c //配置接口
  • 三,写接口
  • 3.1 emWin_App RA8875的底层显示驱动
  • 3.2 emWin_touch RA8875的底层触摸驱动
  • 3.3 MainTask STemWin的应用函数
  • 四 ,main函数


准备
1.F429工程模板(平时用的)
2.STemWin源码,KEIL有(.安装目录/KEIL5/ARM/Segger/emWin)

一,创建

工程目录下创建文件夹并添加文件。

EMWIN IAR_单片机


emWin/App (这三个都是自己创建的,用来实现接口函数)

EMWIN IAR_嵌入式_02


emWin/Demu (用到的只有这个STemWin532_CM4_Keil)如果跑操作系统,用这个STemWin532_CM4_OS_Keil。

EMWIN IAR_EMWIN IAR_03


emWin/GUI(Include是一些.h文件,全都复制放进去)

.c只用到三个

EMWIN IAR_RA8875_04

EMWIN IAR_stm32_05


要提一句,这个地方要改一下,好像是可以快一点??

EMWIN IAR_嵌入式_06

二,改STemWin
2.1 GUIConf.c //配置内存
#include "GUI.h"//ÅäÖÃEMWINÄÚ´æ

#if USE_EXTMEMHEAP
	#define GUI_NUMBYTES  (1024*1024*2)
#else
	#define GUI_NUMBYTES  (70*1024)
#endif

#define GUI_BLOCKSIZE 0x80
	
//ΪÁË·ÀÖ¹±¨´í
void GUI_X_Init(void){	
}
void GUI_X_ExecIdle(void){
}
void GUI_X_Delay(int Period){
}
GUI_TIMER_TIME GUI_X_GetTime(void){
	return 0;}


void GUI_X_Config(void) {
#if USE_EXTMEMHEAP//使用SDRAM
  static U32 *aMemory;
	aMemory = (U32 *)EXT_SRAM_ADDR;
	GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
	GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#else//芯片FLASH
	static U32 aMemory[GUI_NUMBYTES / 4];
  GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
	GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
//  GUI_SetDefaultFont(GUI_FONT_6X8);
#endif
}
2.2 GUIConf.h

最后两个是我加上的

EMWIN IAR_stm32_07

2.3 LCDConf.c //配置图层 颜色等

LCD_X_DisplayDriver这个函数没用到。

#include "GUI.h"
#include "GUIDRV_Lin.h"

//ÅäÖÃͼ²ã
#define XSIZE_PHYS 800
#define YSIZE_PHYS 480

#define COLOR_CONVERSION 			GUICC_M565
#define DISPLAY_DRIVER  			&GUIDRV_Template_API

#define NUM_BUFFERS  1 // 图片缓冲区
#define NUM_VSCREENS 1 // 使用虚拟屏数
/*
8 bpp [2^8=256;(256É«)]; GUICC_332
16 bpp [2^16=65536; (65536,¸ß²ÊÉ«)]; GUICC_565
24 bpp [2^24=16777216;(16777216,Õæ²ÊÉ«)]; GUICC_888
48 bpp [248=281474976710656;(281474976710656,רҵɨÃèÒÇÓÃ]
*/
void LCD_X_Config(void) {
	//ͼ²ã1  16bpp
  GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
//  LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);//
	LCD_SetSizeEx    (0, XSIZE_PHYS, YSIZE_PHYS);
	LCD_SetVSizeEx   (0, XSIZE_PHYS, YSIZE_PHYS);
	if(GUI_NUM_LAYERS>1)//ͼ²ã2 8bpp
	{
		GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, GUICC_332, 0, 1);
//  LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);//
		LCD_SetSizeEx    (1, XSIZE_PHYS, YSIZE_PHYS);
		LCD_SetVSizeEx   (1, XSIZE_PHYS, YSIZE_PHYS);
	}
}

EMWIN IAR_EMWIN IAR_08

2.4 GUIDRV_Template.c //配置接口

主要是函数的对接。
3.1里面,下面那几个。
举一个例子吧。这是打点函数,里面加上了自己写的打点函数。

static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
  #ifdef WIN32
    LCDSIM_SetPixelIndex(x, y, PixelIndex, pDevice->LayerIndex);
  #else
    //
    // 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);
    PixelIndex = LCD__GetColorIndex();
    GUI_USE_PARA(PixelIndex);
    {
      RA8875_DrawPixelGUI(xPhys, yPhys, PixelIndex);//打点函数
    }
    #if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
      #undef xPhys
      #undef yPhys
    #endif
  #endif
}
三,写接口
3.1 emWin_App RA8875的底层显示驱动

主要函数(这里不放出来了,有些是别家的程序,有兴趣的留言):

EMWIN IAR_嵌入式_09

3.2 emWin_touch RA8875的底层触摸驱动

我还没写。。。项目没用到触摸

3.3 MainTask STemWin的应用函数

keil那个文件夹也有很多工具,生成的C的函数,数组就放这个文件里。
因为我只是测试,图片的数组直接使用的芯片内部FLISH。SDRAM或者SD卡有空再说吧。

#include "MainTask.h"
#include "DIALOG.h"
#include "emWin_App.h"
#ifndef GUI_CONST_STORAGE
  #define GUI_CONST_STORAGE const
#endif
extern GUI_CONST_STORAGE GUI_BITMAP bmreag;
static GUI_CONST_STORAGE unsigned short _acMINI_MAP[] = {好大一数组};
GUI_CONST_STORAGE GUI_BITMAP bmMINI_MAP = {
  800, // xSize
  480, // ySize
  1600, // BytesPerLine
  16, // BitsPerPixel
  (unsigned char *)_acMINI_MAP,  // Pointer to picture data
  NULL,  // Pointer to palette
  GUI_DRAW_BMP565
};
void MainTask(void) 
{
	WM_MULTIBUF_Enable(1);	
	GUI_DrawBitmap(&bmMINI_MAP,0, 0);
	while (1)
	{
		GUI_Delay(10);
	}
}
四 ,main函数

4.1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

一定要加,没什么用,但是不开emwin不工作,类似于防盗版。

4.2 EMWIN_Power_Init // ma8875初始化。

4.3 GUI_Init(); //emwin初始化。

4.4 然后://裸机,本打算用ucosiii 的,都移植好了,但是担心查水表,回头移植一个freertos再说。

MainTask();

while(1);

效果

EMWIN IAR_stm32_10