天天看點

【空氣檢測儀專題】4.STemWin移植【空氣檢測儀專題】4.STemWin移植

【空氣檢測儀專題】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();

}
           

效果圖

【空氣檢測儀專題】4.STemWin移植【空氣檢測儀專題】4.STemWin移植

後語

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