目录
- 一,创建
- 二,改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/App (这三个都是自己创建的,用来实现接口函数)
emWin/Demu (用到的只有这个STemWin532_CM4_Keil)如果跑操作系统,用这个STemWin532_CM4_OS_Keil。
emWin/GUI(Include是一些.h文件,全都复制放进去)
.c只用到三个
要提一句,这个地方要改一下,好像是可以快一点??
二,改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
最后两个是我加上的
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);
}
}
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的底层显示驱动
主要函数(这里不放出来了,有些是别家的程序,有兴趣的留言):
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);
效果