emWin_mcb1700_bsp 中的代码问题解决方案 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1 摘要 MCB1700是KEIL的评估板,板载芯片是基于ARM cortex-M3的LPC1758、LPC1768或LPC1769。 EmWin 是由 SEGGER 开发的嵌入式图形库,现在由 NXP 以库的形式提供,可与 NXP 微控制器一起免费用于商业用途。NXP 提供的软件包包括 emWin Color 基本包、包含 GUIBuilder 的窗口管理器/小部件模块、用于无闪烁动画的内存设备模块、用于平滑显示曲线、线条和字体的抗锯齿模块、字体转换器和 VNC 服务器。 NXP 提供了 MCB1700 emWin 板支持包: 适用于 MCB1700 的 emWin 5.14 BSP 版本 1.0 该软件包包含三个IDE项目:IAR,MDK和LPCXpresso,但是现在,客户在使用它时,通常会发现这些问题: LPCXpresso 项目有构建错误 MDK项目有构建错误 下载此代码后,某些 MCB1700 板无法工作,LCD 始终显示白色,没有其他图像。 本文档主要讨论这三个问题并给出相应的解决方案以使MCB1700 emWin_mcb1700_bsp能够正常工作。 2 代码问题分析及解决方案 客户需要首先从上面的链接下载emWin_mcb1700_bsp并安装,安装包默认安装后,源代码可以在以下路径找到:C:\nxp\emWin\NXP_emWin514_MCB1700_BSP 2.1 keil工程构建错误 本章主要讲述emWin_mcb1700_bsp keil工程编译错误及解决方法。 2.1.1问题复现 使用keil IDE打开emWin_mcb1700_bsp keil工程,会发现如下图所示的6个错误: 所有这些错误都与 emwin lib 中包含的 GUI 功能有关,单击 GUI 文件夹后,您会发现该 lib 是 emWin_514,即旧的 emWin lib。 因此人们可以尝试使用nxp 网站上的最新库。 2.1.2问题解决方案 从此链接下载最新的 emWin lib: 适用于 NXP ARM MCU 的 emwin 5.30 预编译库 安装后,从文件夹复制 emWin_M3.lib: NXP_emWin530\emWin_library\Keil\ 到 NXP_emWin514_MCB1700_BSP\GUI 文件夹。 然后将这个新的库添加到 KEIL 项目的 GUI 文件夹中,如下所示: 添加 emWin_M3.lib 后,删除旧库 emWin_514_Keil4_M3_LE.lib 的构建,只需在右键单击选项中取消选择目标构建中包含的项目,如下所示: 保存并再次重建,你会发现错误消失了。 2.2 LPCXpresso项目构建错误 本章主要描述emWin_mcb1700_bsp LPCXpresso项目构建错误及其解决方案。 2.2.1 LPCXpresso项目问题复现 打开LPCXpresso项目并构建它,您可能会发现这些问题: 所有错误都是 C/C++ 问题。 2.2.2 LPCXpresso项目问题解决 选择项目->属性,将语言标准更改为 GNU C90 标准,如下所示: 点击“应用”按钮,然后再次重建,你会发现错误消失了: 当然,您也可以将 lib 更改为最新版本,就像 KEIL 项目中的方法一样,使用此文件夹中最新的 LPCXpresso emWin lib:NXP_emWin530\emWin_library\LPCXpresso\libemWin_M3.a 2.3 部分MCB1700板代码功能问题 本部分主要针对部分MCB1700板的功能问题,给出分析并给出相应的解决方案。 2.3.1 代码功能问题复现 构建问题解决后,客户可以通过调试器或编程器将代码下载到 MCB1700 板,无论是 LPC1758、LPC1768 还是 LPC1769。经过对部分MCB1700板卡的测试,发现部分板卡始终显示白色,emwin功能无法使用,但部分板卡可以显示正确的图片。所有这些板子看起来都一样。 我仔细对比了这些板子,发现LCD上的系列号有区别,现列出如下: 小型断路器 LCD系列号 RESULT MCB1758 A774A-43- P101210 -4072 OK MCB1758 A774A-61- P120814 -4074 异常,LCD显示白色 MCB1769 A774A-22- P120814 -4074 异常,LCD显示白色 MCB1769 A774A-57- P120814 -4074 异常,LCD显示白色 从上面的表格中,我们可以发现所有无法工作的MCB板都有一个特点:LCD序列号包含P120814,所以应该与LCD控制器有关,但是这些MCB1700板上的控制器是什么呢?从 KEIL IDE 安装路径下载 LCD_Blinky 代码后: C:\Keil_v5\ARM\Boards\Keil\MCB1700\LCD_Blinky 我发现这个项目可以正确显示图片,所以我做了调试和源代码检查,之后我得到了带有P120814的LCD,使用的是Himax公司的HX8347-D LCD控制器。但是 emWin MCB1700 BSP 中的 LCD 驱动代码适用于 SPFD5408 LCD 控制器。 2.3.2代码功能问题解答 这里以MDK项目为例,描述如何修改emWin_MCB1700_BSP代码并使其在不工作的MCB1700板上运行。经过上一章的分析,发现问题主要出在LCD驱动上,所以代码修改主要针对LCDConf.c文件,该文件中的代码用于LCD驱动程序配置。 2.3.2.1 修改显示方向 注释掉旧的 DISPLAY_ORIENTATION 定义,并像这样定义它: //#定义 DISPLAY_ORIENTATION (GUI_SWAP_XY) #定义 DISPLAY_ORIENTATION (GUI_MIRROR_X | GUI_SWAP_XY) 2.3.2.2 修改LCD控制器初始化代码 从2.3.1章节中,我们可以知道不工作的MCB1700板上的LCD是HX8347-D,HX8347 LCD控制器初始化代码应该修改如下: static void _InitController(void) { #ifndef WIN32 GUI_X_延迟(10); LCD_X_SPI_Init(); GUI_X_延迟(10); /* 驾驶能力设置 ------------------------------------*/ wr_reg(0xEA, 0x00); /* 电源控制内部使用 (1) */ wr_reg(0xEB, 0x20); /* 内部使用电源控制 (2) */ wr_reg(0xEC, 0x0C); /* 源控制内部使用 (1) */ wr_reg(0xED, 0xC7); /* 源控制内部使用 (2) */ wr_reg(0xE8, 0x38); /* 源输出周期正常模式 */ wr_reg(0xE9, 0x10); /* 源输出周期空闲模式 */ wr_reg(0xF1, 0x01); /* RGB 18位接口;0x0110 */ wr_reg(0xF2, 0x10); /* 调整伽马曲线 --------------------------------------*/ 写寄存器(0x40,0x01); 写寄存器(0x41,0x00); 写寄存器(0x42,0x00); 写寄存器(0x43,0x10); 写寄存器(0x44,0x0E); 写寄存器(0x45,0x24); 写寄存器(0x46,0x04); 写寄存器(0x47,0x50); 写寄存器(0x48,0x02); 写寄存器(0x49,0x13); 写寄存器(0x4A,0x19); 写寄存器(0x4B,0x19); 写寄存器(0x4C,0x16); 写寄存器(0x50,0x1B); 写寄存器(0x51,0x31); 写寄存器(0x52,0x2F); 写寄存器(0x53,0x3F); 写寄存器(0x54,0x3F); 写寄存器(0x55,0x3E); 写寄存器(0x56,0x2F); 写寄存器(0x57,0x7B); 写寄存器(0x58,0x09); 写寄存器(0x59,0x06); 写寄存器(0x5A,0x06); 写寄存器(0x5B,0x0C); 写寄存器(0x5C,0x1D); 写寄存器(0x5D,0xCC); /* 电源电压设置-----------------------------------------*/ 写寄存器(0x1B,0x1B); 写寄存器(0x1A,0x01); 写寄存器(0x24,0x2F); 写寄存器(0x25,0x57); 写寄存器(0x23,0x88); /* 开机设置 -------------------------------------------- */ wr_reg(0x18, 0x36); /* 内部振荡器频率调整 */ wr_reg(0x19, 0x01); /* 启用内部振荡器 */ wr_reg(0x01, 0x00); /* 正常模式,无滚动 */ wr_reg(0x1F, 0x88); /* 电源控制 6 - DDVDH 关闭 */ GUI_X_延迟(200); wr_reg(0x1F, 0x82); /* 电源控制 6 - 升压: 3 x VCI */ GUI_X_延迟(50); wr_reg(0x1F, 0x92); /* 电源控制 6 - 升压:开启 */ GUI_X_延迟(50); wr_reg(0x1F, 0xD2); /* 电源控制 6 - VCOML 激活 */ GUI_X_延迟(50); /* 颜色选择--------------------------------------------*/ wr_reg(0x17, 0x55); /* RGB,系统接口:16位/像素*/ wr_reg(0x00, 0x00); /* 关闭滚动,无待机 */ /* 接口配置 -------------------------------------------- */ wr_reg(0x2F, 0x11); /* LCD驱动:1线反转*/ 写寄存器(0x31,0x00); wr_reg(0x32, 0x00); /* DPL=0, HSPL=0, VSPL=0, EPL=0 */ /* 设置时显示-----------------------------*/ wr_reg(0x28, 0x38); /* PT(0,0) 有效,VGL/VGL */ GUI_X_延迟(200); wr_reg(0x28, 0x3C); /* 显示活动,VGL/VGL */ // wr_reg(0x16, 0x00); /* 内存访问控制 (MX/Y/V/L,BGR) */ /* 显示滚动设置 ----------------------------------*/ wr_reg(0x0E, 0x00); /* TFA MSB */ wr_reg(0x0F, 0x00); /* TFA 最低有效位 */ wr_reg(0x10, 320 >> 8); /* VSA MSB */ wr_reg(0x11, 320 & 0xFF); /* VSA LSB */ wr_reg(0x12, 0x00); /* BFA 最高有效位 */ wr_reg(0x13, 0x00); /* BFA LSB */ #endif } 2.3.2.3 修改LCD_X_Config配置 来自 Segger 中的 emWin 显示驱动程序网站: https://www.segger.com/emwin-display-drivers.html 可以发现HX8347的显示驱动是GUIDRV_FlexColor ,函数GUIDRV_FlexColor_SetFunc中的参数pfFunc是GUIDRV_FLEXCOLOR_F66712。 因此,像这样修改 LCD_X_Config 函数中的 GUIDRV_FlexColor_SetFunc: GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66712, GUIDRV_FLEXCOLOR_M16C0B16); 修改完成后,保存并重新编译。最后,将代码下载到之前没有工作的MCB1700开发板中,下载代码到开发板后,按下开发板上的RESET键,你会发现LCD上显示的GRAPH_DATA_XY演示图片是这样的: 2.3.3其他应用测试 针对无法正常工作的 MCB1700 板进行上述代码修改后,如果您有兴趣,还可以尝试其他应用程序来显示其他图片。在文件夹NXP_emWin514_MCB1700_BSP\Application中还有很多其他的应用程序,只需要将其添加到项目中的应用程序文件夹中,然后LCD就可以显示相应的画面,现在列出一些应用程序的测试结果。 2.3.3.1 GUI_WIDGET_GraphYtDemo.c 2.3.3.2GUI_HelloWorld.c 2.3.3.3GUI_ALPHA_TransparentDialogDemo.c 2.3.3.4 WM_RadialMenu.c 3 结论 从上面的详细描述中,您将知道 emWin_MCB1700_bsp KEIL 项目构建错误可以通过将 lib 更改为最新的 emwin lib 来修复,LPCXpresso 项目构建错误可以通过将语言标准更改为 GNU C90 来修复,某些 MCB1700 中的功能问题主要是由于 LCD 驱动程序不匹配引起的,只需将代码修改为相应的 LCD 驱动程序即可解决 LCD 显示白色问题。 希望本文档能够帮助那些在MCB1700板上使用emWin_MCB1700_bsp的客户,修改后的项目也在附件中供您参考。 LPC17xx
記事全体を表示