【空氣檢測儀專題】4.STemWin移植
上次已經有了液晶的畫點、畫線、畫矩陣函數了;為了移植STemWin做好了準備。
step 1:
下載下傳en.stm32cubef1壓縮包,其中包含STemWin,在en.stm32cubef1\STM32Cube_FW_F1_V1.6.0\Middlewares\ST檔案下。
step 2:
- 在工程源檔案中建立STemWinPortable檔案夾,将用于存放STemWin移植相關的檔案
-
從STemWing拷貝共7個檔案到TemWinPortable檔案夾下
GUIConf.c
GUIConf.h
GUIDRV_Template.c
GUIDRV_Template.h
LCDConf_FlexColor_Template.c
LCDConf_FlexColor_Template.h
GUI_X.c(在STemWin\OS檔案下裡)
-
重命名一下檔案
LCDConf_FlexColor_Template.c->LCDConf.c
LCDConf_FlexColor_Template.h->LCDConf.h
- 把STemWinPortable檔案夾下7個檔案加入到IAR工程中;并STemWin\Lib\STemWin532_CM3_IAR.a也加入到IAR工程中。
- 把STemWin\inc,STemWinPortable的路徑加入到IAR中,以便IAR能找到頭檔案。
step 3:
-
在GUIConf.c中
#define GUI_NUMBYTES 0x200000
改成
#define GUI_NUMBYTES (1024*20)//表示給emwin使用20k的RAM空間
- 在GUIDRV_Template.c中_SetPixelIndex函數增加畫點函數
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, 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);
GUI_USE_PARA(PixelIndex);
{
//
// Write into hardware ... Adapt to your system
//
// TBD by customer...
//
ili9481_DrawPixel(x,y,PixelIndex);//增加的畫點函數
}
#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
#undef xPhys
#undef yPhys
#endif
}
- 在LCDConf.c中修改螢幕分辨率
#define XSIZE_PHYS 320 // To be adapted to x-screen size
#define YSIZE_PHYS 480 // To be adapted to y-screen size
- 在LCDConf.c中LCD_X_Config函數修改螢幕驅動
void LCD_X_Config(void)
{
GUI_DEVICE * pDevice;
CONFIG_FLEXCOLOR Config = {};
GUI_PORT_API PortAPI = {};
//
// Set display driver and color conversion
//
// pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
pDevice = GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, , );//因為使用的是GUIDRV_Template驅動是以填&GUIDRV_Template_API
//
// Display driver configuration, required for Lin-driver
//
LCD_SetSizeEx (, XSIZE_PHYS , YSIZE_PHYS);
LCD_SetVSizeEx(, VXSIZE_PHYS, VYSIZE_PHYS);
//
// Orientation
//
// Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;//不用去掉
// GUIDRV_FlexColor_Config(pDevice, &Config);//不用去掉
//
// Set controller and operation mode
//
// PortAPI.pfWrite16_A0 = LcdWriteReg; //不用去掉
// PortAPI.pfWrite16_A1 = LcdWriteData; //不用去掉
// PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple; //不用去掉
// PortAPI.pfReadM16_A1 = LcdReadDataMultiple; //不用去掉
// GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);//不用去掉
}
- 在stm32f10x_it.c中增加emWin計時
#include "GUI_ConfDefaults.h"
extern volatile GUI_TIMER_TIME OS_TimeMS;
void SysTick_Handler(void)
{
OS_TimeMS++;
}
step 4:
寫測試代碼
#include "ili9481.h"
#include "GUI.h"
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
int main(void)
{
SysTick_Config(SystemCoreClock / );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//必須要的,STemWin需要,否則無法使用STemWin
//TFT_Initialize();
ili9481_Init();
GUI_Init();
GUI_SetFont(&GUI_Font32_ASCII);
GUI_DispStringAt("Hello world!",,);
while();
}
效果圖

後語
因為隻一直了畫點函數,刷螢幕的時候明顯比隻用驅動來畫慢很多。是以後面還需要優化。