在线时间376 小时
UID3135871
注册时间2016-10-9
NXP金币97

TA的每日心情 | 怒 2025-5-29 09:38 |
---|
签到天数: 632 天 连续签到: 1 天 [LV.9]以坛为家II
版主
  
- 积分
- 4470

- 最后登录
- 2025-6-10
|
今天,我们来移植下emwin,emwin还是比较好用的,它既有GUI生成工具,也有PC上位机的仿真软件。还是比较好评的,虽然不开源,只能用库,单对于
我们普通用户来说根本无区别。
下面讲讲怎样在MCUXpresso 上添加emwin。首先要确保emwin的文件添加到工程中。如果没有的话,打开SDK管理器,选择emwin添加。
添加后:
有用的就是emwin开头的3个文件夹,记得老版本的时候,所以的配置都在config文件夹里面的gui_config.h 和lcd_config.h及gui_x.c等一堆文件完成,但是新版本的怎么也看不到,后来才知道它把这些配置的具体函数,集中到template下的emwin_support.c和emwin_support.h。我们匹配好这两个文件加上gui_config.h 就可以了(lcd_config.h里面啥也没有,是个空文件)。
我们对emwin_support.h,进行修改,修改后代码:
- /*
- * Copyright (c) 2016, Freescale Semiconductor, Inc.
- * Copyright 2016-2017 NXP
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #ifndef _EMWIN_SUPPORT_H_
- #define _EMWIN_SUPPORT_H_
- //
- // Color conversion TODO - choose appropriate color conversion here - see emWin documentation
- //
- //#define COLOR_CONVERSION GUICC_888
- #define COLOR_CONVERSION GUICC_M565
- //
- // Display driver TODO - choose appropriate LCD driver here - see emWin documentation
- //
- #define DISPLAY_DRIVER GUIDRV_FLEXCOLOR
- // TODO - specify the LCD dimensions
- #define BOARD_LCD_READABLE 0 //不允许读LCD
- #define LCD_WIDTH 320
- #define LCD_HEIGHT 240
- // TODO - specify the memory assigned to emWin
- #define GUI_NUMBYTES 0x8000 /*! Amount of memory assigned to the emWin library */
- // TODO - specify the memory location for the frame buffers
- extern int BOARD_Touch_Poll(void);
- #endif
复制代码 其中要注意的:
1、颜色编码格式(默认的888是不符合这个屏的,我们改成565)要对应;
2、LCD的长宽要对应;
3、关闭了LCD的读功能,我们LCD硬件上不支持读。
3、指定的缓存位置(这里默认是MCU内部存储,很小,可以指向外部SRAM或者FLASH)。
////////////////////////////////////////////////////////////////////////////////////////////////////
下面对emwin_support.c就行修改,里面有具体的LCD底层实现函数的定义,修改后代码为:
- /*
- * Copyright (c) 2016, Freescale Semiconductor, Inc.
- * Copyright 2016-2017 NXP
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <emwin_support.h>
- #include "GUI.h"
- #include "WM.h"
- #include "GUIDRV_FlexColor.h" // TODO - choose appropriate LCD driver here - see emWin documentation
- #include "fsl_debug_console.h"
- #include "fsl_gpio.h"
- #include "ili9341_lcd.h" //SPI_LCD 驱动头文件
- #include "ft6366_i2ctouch.h" //IIC_touch 头文件
- #ifndef GUI_MEMORY_ADDR
- static uint32_t s_gui_memory[(GUI_NUMBYTES + 3) / 4]; /* needs to be word aligned */
- #define GUI_MEMORY_ADDR ((uint32_t)s_gui_memory)
- #endif
- /*******************************************************************************
- * Implementation of communication with the LCD controller
- ******************************************************************************/
- static void APP_pfWrite8_A0(U8 Data)
- {
- ili9341_lcd_writ_cmd(Data);
- }
- static void APP_pfWrite8_A1(U8 Data)
- {
- ili9341_lcd_writ_data(Data);
- }
- static void APP_pfWriteM8_A1(U8 *pData, int NumItems)
- {
- ili9341_lcd_writ_databuf8(pData, NumItems);
- }
- static U8 APP_pfRead8_A1(void)
- {
- uint8_t Data;
- #if defined(BOARD_LCD_READABLE) && (BOARD_LCD_READABLE == 0)
- PRINTF("Warning: LCD does not support read operation, the image may get distorted.\r\n");
- assert(0);
- #endif
- //GPIO_PortSet(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
- //BOARD_LCD_SPI.Receive(&Data, 1);
- //SPI_WaitEvent();
- Data=ili9341_lcd_read_data(0X00);
- return Data;
- }
- static void APP_pfReadM8_A1(U8 *pData, int NumItems)
- {
- #if defined(BOARD_LCD_READABLE) && (BOARD_LCD_READABLE == 0)
- PRINTF("Warning: LCD does not support read operation, the image may get distorted.\r\n");
- assert(0);
- #endif
- //GPIO_PortSet(BOARD_LCD_DC_GPIO, BOARD_LCD_DC_GPIO_PORT, 1u << BOARD_LCD_DC_GPIO_PIN);
- //BOARD_LCD_SPI.Receive(pData, NumItems);
- //SPI_WaitEvent();
- ili9341_lcd_read_databuf8(pData,NumItems);
- }
- // TODO - implement event handling
-
- static void BOARD_LCD_InterfaceInit(void)
- {
- // TODO - LCD interface initialization
- ili9341_lcd_init();
- }
- void BOARD_LCD_InterfaceDeinit(void)
- {
- // TODO - LCD interface deinitialization
- }
- /*******************************************************************************
- * Implementation of communication with the touch controller
- ******************************************************************************/
- // TODO - implement event handling
- static void BOARD_Touch_InterfaceInit(void)
- {
- // TODO - touch interface initialization
- ft6366_i2ctouch_Init();
- }
- void BOARD_Touch_InterfaceDeinit(void)
- {
- // TODO - touch interface deinitialization
- }
- int BOARD_Touch_Poll(void)
- {
- // TODO - touch handling
- GUI_PID_STATE pid_state;
- ft6336_i2ctouch_scan(FLEXCOMM5_PERIPHERAL);
- if(ftf6336_tpr_structure.touchsta.all & 0x01)//判断仅1点触摸 支持5点触摸
- {
- //pid_state.x = LCD_WIDTH - ftf6336_tpr_structure.y[0];
- //pid_state.y = ftf6336_tpr_structure.x[0];
- pid_state.x = ftf6336_tpr_structure.y[0];
- pid_state.y = LCD_HEIGHT-ftf6336_tpr_structure.x[0];
- //按下或者被触摸
- pid_state.Pressed = ((ftf6336_tpr_structure.touchsta.bit.touch==1)||(ftf6336_tpr_structure.touchsta.bit.hold==1));
- pid_state.Layer = 0;
- GUI_TOUCH_StoreStateEx(&pid_state);
- PRINTF("I touch the screen posion x: %d ,y:%d ,Press is %d.\r\n",pid_state.x,pid_state.y,pid_state.Pressed);
- return 1;
- }
- return 0;
- }
- /*******************************************************************************
- * Application implemented functions required by emWin library
- ******************************************************************************/
- void LCD_X_Config(void)
- {
- GUI_DEVICE *pDevice;
- GUI_PORT_API PortAPI;
- CONFIG_FLEXCOLOR Config = {0, 0, GUI_SWAP_XY, 0, 1};
- // Initialize the gui device with specified display driver and color conversion
- pDevice =GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
- GUIDRV_FlexColor_Config(pDevice, &Config);
- LCD_SetSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
- LCD_SetVSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
- PortAPI.pfWrite8_A0 = APP_pfWrite8_A0;
- PortAPI.pfWrite8_A1 = APP_pfWrite8_A1;
- PortAPI.pfWriteM8_A1 = APP_pfWriteM8_A1;
- PortAPI.pfRead8_A1 = APP_pfRead8_A1;
- PortAPI.pfReadM8_A1 = APP_pfReadM8_A1;
- GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B8);
- // Initialize touch interface
- BOARD_Touch_InterfaceInit();
- }
- int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void *pData)
- {
- int result = 0;
- switch (Cmd)
- {
- case LCD_X_INITCONTROLLER:
- BOARD_LCD_InterfaceInit();
- GUI_X_Delay(50); /* settle down delay after reset */
- FT9341_Init(APP_pfWrite8_A1, APP_pfWrite8_A0);
- break;
- default:
- result = -1;
- break;
- }
- return result;
- }
- void GUI_X_Config(void)
- {
- /* Assign work memory area to emWin */
- GUI_ALLOC_AssignMemory((void *)GUI_MEMORY_ADDR, GUI_NUMBYTES);
- /* Select default font */
- GUI_SetDefaultFont(GUI_FONT_6X8);
- }
- void GUI_X_Init(void)
- {
- }
- /* Dummy RTOS stub required by emWin */
- void GUI_X_InitOS(void)
- {
- }
- /* Dummy RTOS stub required by emWin */
- void GUI_X_Lock(void)
- {
- }
- /* Dummy RTOS stub required by emWin */
- void GUI_X_Unlock(void)
- {
- }
- /* Dummy RTOS stub required by emWin */
- U32 GUI_X_GetTaskId(void)
- {
- return 0;
- }
- void GUI_X_ExecIdle(void)
- {
- }
- GUI_TIMER_TIME GUI_X_GetTime(void)
- {
- return 0;
- }
- void GUI_X_Delay(int Period)
- {
- volatile int per;
- volatile int i;
- for (per = Period; per > 0; per--)
- {
- for (i = 15000; i > 0; i--)
- ;
- }
- }
复制代码 把emwin里面对应的几个操作底层的函数与我们之前的LCD和触摸连接起来。其中要这样的是:
1、本LCD硬件无读的功能,具体实现的函数可以不写
2、触摸芯片读取的x,y位置与GUI里面元件的位置是否对应,不对应需要稍微转换一下,如果自己用GUI TOOL 生成,可在设置是指定整个画面的起始结束坐标位置。
gui_config.h 里面内容默认,未做修改。
好了,到此,我们就完成了emwin的移植。我们在mian.c里面添加一下代码测试一下:
- /**
- * @file seekfreePrj_demo.c
- * @brief Application entry point.
- */
- #include <stdio.h>
- #include "board.h"
- #include "peripherals.h"
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "LPC55S69_cm33_core0.h"
- #include "fsl_debug_console.h"
- /* TODO: insert other include files here. */
- #include "sd.h"
- #include "ff.h"
- #include "diskio.h"
- #include "fsl_sd_disk.h"
- #include "semphr.h"
- #include "task.h"
- #include "delay.h"
- #include "led.h"
- #include "key.h"
- #include "ft6366_i2ctouch.h"
- #include "ili9341_lcd.h"
- #include <emwin_support.h>
- #include "GUI.h"
- #include "BUTTON.h"
- #include "CHECKBOX.h"
- #include "SLIDER.h"
- #include "DROPDOWN.h"
- #include "RADIO.h"
- #include "MULTIPAGE.h"
- #include <stdbool.h>
- /* TODO: insert other definitions and declarations here. */
- #ifndef GUI_NORMAL_FONT
- #define GUI_NORMAL_FONT (&GUI_Font16_ASCII)
- #endif
- #ifndef GUI_LARGE_FONT
- #define GUI_LARGE_FONT (&GUI_Font16B_ASCII)
- #endif
- #ifndef GUI_SCALE_FACTOR
- #define GUI_SCALE_FACTOR 1
- #endif
- #ifndef GUI_SCALE_FACTOR_X
- #define GUI_SCALE_FACTOR_X GUI_SCALE_FACTOR
- #endif
- #ifndef GUI_SCALE_FACTOR_Y
- #define GUI_SCALE_FACTOR_Y GUI_SCALE_FACTOR
- #endif
- #define GUI_SCALE(a) ((int)((a) * (GUI_SCALE_FACTOR)))
- #define GUI_SCALE_X(x) ((int)((x) * (GUI_SCALE_FACTOR_X)))
- #define GUI_SCALE_Y(y) ((int)((y) * (GUI_SCALE_FACTOR_Y)))
- #define GUI_SCALE_COORDS(x, y) GUI_SCALE_X(x), GUI_SCALE_Y(y)
- #define GUI_SCALE_RECT(x0, y0, xs, ys) GUI_SCALE_X(x0), GUI_SCALE_Y(y0), GUI_SCALE_X(xs), GUI_SCALE_Y(ys)
- #define GUI_ID_DRAWAREA (GUI_ID_USER + 0)
- #define GUI_ID_PAGEWIN1 (GUI_ID_USER + 1)
- #define GUI_ID_PAGEWIN2 (GUI_ID_USER + 2)
- static DROPDOWN_Handle hDropdown0;
- static RADIO_Handle hRadio0;
- static CHECKBOX_Handle hCheck0;
- static WM_HWIN hDrawArea;
- static SLIDER_Handle hSlider0;
- static SLIDER_Handle hSlider1;
- static SPINBOX_Handle hSpinbox0;
- static PROGBAR_Handle hProgbar0;
- static const GUI_COLOR color_list[] = {GUI_BLACK, GUI_YELLOW, GUI_ORANGE, GUI_RED,
- GUI_MAGENTA, GUI_BLUE, GUI_CYAN, GUI_GREEN};
- static const GUI_POINT triangle_points[] = {
- {GUI_SCALE(0), GUI_SCALE(0)}, {GUI_SCALE(-50), GUI_SCALE(100)}, {GUI_SCALE(50), GUI_SCALE(100)}};
- static void cbDrawArea(WM_MESSAGE *pMsg)
- {
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- GUI_SetColor(color_list[DROPDOWN_GetSel(hDropdown0)]);
- switch (RADIO_GetValue(hRadio0))
- {
- case 0:
- if (CHECKBOX_GetState(hCheck0))
- {
- GUI_FillRect(GUI_SCALE_X(70) - GUI_SCALE(50), GUI_SCALE_Y(70) - GUI_SCALE(50),
- GUI_SCALE_X(70) + GUI_SCALE(50), GUI_SCALE_Y(70) + GUI_SCALE(50));
- }
- else
- {
- GUI_DrawRect(GUI_SCALE_X(70) - GUI_SCALE(50), GUI_SCALE_Y(70) - GUI_SCALE(50),
- GUI_SCALE_X(70) + GUI_SCALE(50), GUI_SCALE_Y(70) + GUI_SCALE(50));
- }
- break;
- case 1:
- if (CHECKBOX_GetState(hCheck0))
- {
- GUI_FillPolygon(triangle_points, 3, GUI_SCALE_COORDS(70, 20));
- }
- else
- {
- GUI_DrawPolygon(triangle_points, 3, GUI_SCALE_COORDS(70, 20));
- }
- break;
- case 2:
- if (CHECKBOX_GetState(hCheck0))
- {
- GUI_FillEllipse(GUI_SCALE_COORDS(70, 70), GUI_SCALE(50), GUI_SCALE(50));
- }
- else
- {
- GUI_DrawEllipse(GUI_SCALE_COORDS(70, 70), GUI_SCALE(50), GUI_SCALE(50));
- }
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- static void cbPageWin1(WM_MESSAGE *pMsg)
- {
- int NCode;
- int Id;
- switch (pMsg->MsgId)
- {
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_RADIO0:
- switch (NCode)
- {
- case WM_NOTIFICATION_VALUE_CHANGED:
- WM_InvalidateWindow(hDrawArea);
- break;
- }
- break;
- case GUI_ID_DROPDOWN0:
- switch (NCode)
- {
- case WM_NOTIFICATION_SEL_CHANGED:
- WM_InvalidateWindow(hDrawArea);
- break;
- }
- break;
- case GUI_ID_CHECK0:
- switch (NCode)
- {
- case WM_NOTIFICATION_VALUE_CHANGED:
- WM_InvalidateWindow(hDrawArea);
- break;
- }
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- static void cbPageWin2(WM_MESSAGE *pMsg)
- {
- int NCode;
- int Id;
- switch (pMsg->MsgId)
- {
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_SLIDER0:
- switch (NCode)
- {
- case WM_NOTIFICATION_VALUE_CHANGED:
- PROGBAR_SetValue(hProgbar0, SLIDER_GetValue(hSlider0));
- break;
- }
- break;
- case GUI_ID_SLIDER1:
- switch (NCode)
- {
- case WM_NOTIFICATION_VALUE_CHANGED:
- SPINBOX_SetValue(hSpinbox0, SLIDER_GetValue(hSlider1));
- break;
- }
- break;
- case GUI_ID_SPINBOX0:
- switch (NCode)
- {
- case WM_NOTIFICATION_VALUE_CHANGED:
- SLIDER_SetValue(hSlider1, SPINBOX_GetValue(hSpinbox0));
- break;
- }
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- break;
- }
- }
- /*
- * @brief Application entry point.
- */
- int main(void) {
- /* Init board hardware. */
- BOARD_InitBootPins();
- BOARD_InitBootClocks();
- BOARD_InitBootPeripherals();
- #ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
- /* Init FSL debug console. */
- BOARD_InitDebugConsole();
- #endif
- LED_Init();
- KEY_Init();
- //MySD_Init();
- PRINTF("the systemclock is: %d Mhz\n",SystemCoreClock/1000000);
- PRINTF("the for1mclock is: %d Mhz\n",CLOCK_GetFro1MFreq()/1000000);
- PRINTF("FATFS SDCard example.\r\n");
- fatfs_sdcard_init();
- fatfs_sdcard_mkdir("/dir");
- fatfs_sdcard_writetxt("/dir/test.txt",(char*)("Helloworld!\r\n"));
- fatfs_sdcard_readtxt("/dir/test.txt",strlen("Helloworld!\r\n"));
- PRINTF("THE SEND STR3 LEN IS %d.\r\n",strlen("Helloworld!\r\n"));
- fatfs_sdcard_readMaxtxt("/dir/test.txt");
- //fatfs_sdcard_readdir((char*)("2:/dir"));
- fatfs_sdcard_readdir((char*)("2:/"));
- ft6366_i2ctouch_Init();
- ili9341_lcd_init();
复制代码 编译生成,下载,查看LCD输出:
触摸,拖到,均可改变对应值,好了emwin的移植就到这里了。
谢谢大家观看!
|
|