查看: 19360|回复: 26

[分享] 分享一下NXP移植emWin过程

[复制链接]
  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
    发表于 2016-10-27 14:51:38 | 显示全部楼层 |阅读模式
    最近公司事情不是很多又恰好公司有块NXP的板子所以就拿来玩玩,板子是LPC1788,哇,看了1788的简介后感觉应该能干过stm32啊,不知道国内为什么没有大面积使用。哈哈,不管这些了,还有一点1788自带LCD控制器,哈哈这个真不错!好了开始正题了。    1. 首先假设你的LCD已经能正常显示了,在移植emWin时先到NXP官网下载emWin的库,我下的是5.16版本的。下载解压后会看到三个文件和一份说明,这个自己看看就行了。
    emWin Lib.png

        2. 在你的工程文件中添加个emWin文件,把刚才下载的emWin库拷到新建的emWin文件夹下,好了,准备工作做好了
    emAct.png

       3. 打开你的工程,并向工程中添加三个文件夹,emWin/Config、emWin/Library、emWin/Header,再想三个文件夹中分别添加emWin库中的所有文件,注意在Library中只需要添加一个对应你MCU的库文件,我的1788是M3内核的,所以选择M3。同时各文件路径也要添加上。那么整体结构如下:

    emg.png

        4. 好了,现在开始修改文件了,首先修改 GUIConf.c 文件。这里只要修改 void GUI_X_Config(void)函数。因为我这里LCD的存储放在外部SDRAM,所以这里gui的存储空间也选择外部。修改如下:

    GUI_x.png ------改成这样------ GUI_x1.png

    这里还要定义 LCD_GUI_RAM_BASE, 添加如下:

    LCD_Add.png

    又来了一个,这个 LCD_VRAM_BASE_ADDR 就是你LCD存储的起始位置,这个定义在我的LCD驱动文件中,后面会介绍的;这里不要忘了包含你LCD驱动的头文件。
        5.  修改 GUIConf.h 文件, 这里修改一些宏定义 ,选择不使用OS、不使用触摸屏,不使用鼠标, 那个GUI_NUM_LAYER (16)就可以了。

        6. 再来修改 LCDConf.c 文件, 首先配置你的 LCD 分辨率及像素:
    1. //
    2. // Physical display size
    3. //
    4. #define XSIZE_PHYS (480)
    5. #define YSIZE_PHYS (272)

    6. #define VXSIZE_PHYS (XSIZE_PHYS)
    7. #define VYSIZE_PHYS (YSIZE_PHYS)

    8. //
    9. // Color conversion
    10. //
    11. #define COLOR_CONVERSION GUICC_M565

    12. //
    13. // Display driver
    14. //
    15. #define DISPLAY_DRIVER GUIDRV_LIN_16

    16. //
    17. // Pixel width in bytes
    18. //
    19. #define PIXEL_WIDTH  2
    复制代码
    我的是480*272, RGB565的。然后在修改两个函数就可以了。    7. 还是 LCDConf.c 文件,修改 void LCD_X_Config(void)函数,修改成这样:
    1. void LCD_X_Config(void) {
    2.   //
    3.   // Set display driver and color conversion for 1st layer
    4.   //
    5.   GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
    6.   //
    7.   // Display driver configuration, required for Lin-driver
    8.   //
    9.   LCD_SetPosEx(0, 0, 0);
    10.   if (LCD_GetSwapXYEx(0)) {
    11.     LCD_SetSizeEx (0, YSIZE_PHYS, XSIZE_PHYS);
    12.     LCD_SetVSizeEx(0, VYSIZE_PHYS, VXSIZE_PHYS);
    13.   } else {
    14.     LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
    15.     LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
    16.   }
    17.   LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);
    18.   //
    19.   // Set user palette data (only required if no fixed palette is used)
    20.   //
    21.   #if defined(PALETTE)
    22.     LCD_SetLUTEx(0, PALETTE);
    23.   #endif
    24. }
    复制代码
    再修改  int LCD_X_DispDriver()函数,改成如下形式:
    1. int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
    2.   int r;

    3.   switch (Cmd) {
    4.   case LCD_X_INITCONTROLLER: {
    5.     //
    6.     // Called during the initialization process in order to set up the
    7.     // display controller and put it into operation. If the display
    8.     // controller is not initialized by any external routine this needs
    9.     // to be adapted by the customer...
    10.     //
    11.     // ...
    12.         _InitController(0);
    13. //        GLCD_Init(NULL, NULL);
    14.     return 0;
    15.   }
    16.   case LCD_X_SETORG: {
    17.     //
    18.     // Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p
    19.     //
    20.     LCD_X_SETORG_INFO * p;
    21.     p = (LCD_X_SETORG_INFO *)pData;
    22.         _SetDisplayOrigin(p->xPos, p->yPos);
    23.     //...
    24.     return 0;
    25.   }
    26.   default:
    27.     r = -1;
    28.   }
    29.   return r;
    30. }
    复制代码
    LCD_Size.png

    评分

    参与人数 1NXP金币 +30 收起 理由
    肖久 + 30 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 14:53:28 | 显示全部楼层
    额,最后一幅图怎么位置错了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:00:30 | 显示全部楼层
    接上面的LCD_X_DisplayDriver()函数,上面switch中主要添加两个函数, 一个_InitController(0),这个用来初始化LCD的, 另一个是_SetDisplayOrigin(int, int)这个看名字也能知道了。先说_InitController()函数
    1. static void _InitController(unsigned LayerIndex) {
    2.   //
    3.   // Set display size and video-RAM address
    4.   //
    5.   LCD_SetSizeEx (XSIZE_PHYS, YSIZE_PHYS, LayerIndex);
    6.   LCD_SetVSizeEx(VXSIZE_PHYS, VYSIZE_PHYS, LayerIndex);
    7.   LCD_SetVRAMAddrEx(LayerIndex, (void*)LCD_VRAM_BASE_ADDR);
    8.   //
    9.   // Init LCD
    10.   //
    11.   GLCD_Init(NULL, NULL);

    12. #if GUI_SUPPORT_TOUCH  // Used when touch screen support is enabled
    13.   {
    14.     U32 TouchOrientation;
    15.     U32 pclk;

    16.     //
    17.     // Initialize touch screen
    18.     //
    19.     LPC_SC->PCONP |= (1 << 12);  // Enable clock for ADC
    20.     LPC_ADC->CR    = 0
    21.                      | (1          <<  1)  // Sel AD0[1]
    22.                      | (ADC_CLKDIV <<  8)
    23.                      | (1          << 21)  // Enable ADC
    24.                      ;
    25.     //
    26.     // Calibrate touch
    27.     //
    28.     TouchOrientation = (GUI_MIRROR_X * LCD_GetMirrorXEx(0)) |
    29.                        (GUI_MIRROR_Y * LCD_GetMirrorYEx(0)) |
    30.                        (GUI_SWAP_XY  * LCD_GetSwapXYEx (0)) ;
    31.     GUI_TOUCH_SetOrientation(TouchOrientation);
    32.     if (LCD_GetSwapXYEx(0)) {
    33.       GUI_TOUCH_Calibrate(GUI_COORD_X, 0, XSIZE_PHYS, TOUCH_AD_LEFT, TOUCH_AD_RIGHT);   // x axis swapped
    34.       GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, YSIZE_PHYS, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);  // y axis swapped
    35.     } else {
    36.       GUI_TOUCH_Calibrate(GUI_COORD_X, 0, XSIZE_PHYS, TOUCH_AD_LEFT, TOUCH_AD_RIGHT);   // x axis
    37.       GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, YSIZE_PHYS, TOUCH_AD_TOP , TOUCH_AD_BOTTOM);  // y axis
    38.     }
    39.     //
    40.     // Start touch timer
    41.     //
    42.     LPC_SC->PCONP |= (0x1<<2);
    43.     pclk = SystemCoreClock/4;
    44.     LPC_TIM1->PR  = pclk/1000000; /* Set prescaler to get 1 M counts/sec */
    45.     LPC_TIM1->MR0 = 1000 * TOUCH_TIMER_INTERVAL;
    46.     LPC_TIM1->MCR = (0x3<<0);            /* Interrupt and Reset on MR0 */
    47.     NVIC_EnableIRQ(TIMER1_IRQn);
    48.     LPC_TIM1->TCR = 1;            /* Enable timer 1 */
    49.   }
    50. #endif
    51. }
    复制代码


    这里GLCD_Init()是你自己LCD的初始化函数, 一开始我想直接用GLCD_Init代替_InitController函数,但是并不行,因为在_InitControler中有LCD基地址的初始化
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:03:14 | 显示全部楼层
    本帖最后由 Wang- 于 2016-10-27 15:05 编辑

    还一个_SetDisplayOrigin()函数,这个就比较简单了
    1. static void _SetDisplayOrigin(int x, int y) {
    2.   (void)x;
    3.   //
    4.   // Set start address for display data and enable LCD controller
    5.   //
    6.   LPC_LCD->UPBASE = LCD_VRAM_BASE_ADDR + (y * XSIZE_PHYS * PIXEL_WIDTH);  // Needs to be set, before LCDC is enabled
    7. }
    复制代码

    这里和上面 _InitController 都用到了LCD_VRAM_BASE_ADDR, 这个定义在自己LCD驱动文件中,我的如下:
    1. #define LCD_VRAM_BASE_ADDR           ((uint32_t)SDRAM_BASE_ADDR + 0x00100000)
    复制代码
    注意LCDConfig.c文件也不要忘了包含 LCD_VRAM_BASE_ADDR 所在的文件
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:07:18 | 显示全部楼层
    好了,该修改的也就这样了,回到 main 函数,这里包含 GUI.h 就可以使用emWin了,
    1. int main(void)
    2. {
    3.         SDRAMInit();

    4.         GUI_Init();
    5.         GUI_SetBkColor(GUI_BLUE);
    6.         GUI_SetColor(GUI_RED);
    7.         GUI_Clear();

    8.         GUI_DispStringAt("Hello NXP emWin!", 170, 50);
    9.        
    10.     while(1)
    11.     {               

    12.     }
    13. }
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:09:09 | 显示全部楼层
    本帖最后由 Wang- 于 2016-10-27 15:13 编辑

    上几张移植后的图  
    1.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:16:53 | 显示全部楼层
    奉上我移植的源码

    LPC1788 emWin.rar

    2.27 MB, 下载次数: 347, 下载积分: 威望 1

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:17:32 | 显示全部楼层
    在放几张移植官方例程的图
    P61027-151135.jpg
    P61027-151208.jpg
    P61027-151209.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    210
    最后登录
    2018-8-14
    发表于 2016-10-27 15:21:09 | 显示全部楼层
    感谢楼主分享,赞一个
    签到 签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-10-27 15:28:21 | 显示全部楼层
    肖久 发表于 2016-10-27 15:21
    感谢楼主分享,赞一个

    谢谢肖总的金币
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 09:09 , Processed in 0.111218 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表