您尚未登录。

楼主 #1 2018-03-26 12:08:44

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

求指点,LPC1765芯片中移植emWin库

我下载了emWin5.24版本。按照网上说的办法移植(网址  http://blog.sina.com.cn/s/blog_af170a920101dpxe.html),但是移植过程中,发现一运行emWin库就会挂掉,我怀疑是画点函数没有和emWin的画点函数关联起来。。求晕哥指点,emWin画点函数怎么关联我自己的lcd屏的画点,画线,清屏等操作?

离线

#2 2018-03-26 12:37:25

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

要实现 画点 和 读点函数

具体实现代码,我下午上班再回你。





在线

楼主 #3 2018-03-26 12:39:53

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

如何和emWin中的画点函数关联 起来?emWin中画点函数是哪个函数?

离线

#4 2018-03-26 13:48:45

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

刚刚翻阅了一下公司的ucgui(emwin以前的版本)产品资料,
发现只要提供写像素读像素两个函数就可以了:

void LCDSIM_SetPixelIndex(int x, int y, int Index, int LayerIndex)
{
    LCD_Buffer[y*LCD_XSIZE+x] = Index;
}


int LCDSIM_GetPixelIndex(int x, int y, int LayerIndex)
{
    return LCD_Buffer[y*LCD_XSIZE+x];
}

查了一下 RT1052 sdk 的emwin,发现 接口已经变了。





在线

#5 2018-03-26 13:54:37

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

我下载了emWin5.24版本。按照网上说的办法移植(网址  http://blog.sina.com.cn/s/blog_af170a920101dpxe.html),但是移植过程中,发现一运行emWin库就会挂掉,我怀疑是画点函数没有和emWin的画点函数关联起来。。求晕哥指点,emWin画点函数怎么关联我自己的lcd屏的画点,画线,清屏等操作?

...
接下来是一个关键,如果你在裸机的情况下实现过LCD显示就很好办了,主要有以下两部分:
        1)、初始化,在LCD_X_DisplayDriver函数的case LCD_X_INITCONTROLLER:里增加初始化代码:
__lcdInit(); 
__touchInit();
        是一个函数,还是两个函数,还是其它函数名字,你自己喜欢。
        2)、像素操作函数,在LCD_X_DisplayDriver函数的case LCD_X_SETORG:里增加像素操作函数:
        __SetDisplayOrigin(p->xPos, p->yPos);
        一样的道理,函数名字自己喜欢,但函数的两个参数是必需这样的。
...

这个demo和 RT1052不太一致,
估计RT1052有双缓冲,
所以不用实现 LCD_X_SETORG,
只要实现了  LCD_X_SHOWBUFFER 即可





在线

#6 2018-03-26 13:55:19

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void *p)
{
    uint32_t addr;
#if (LCD_BITS_PER_PIXEL == 8)
    uint16_t colorR, colorG, colorB;
    uint32_t color;
#endif
    int result = 0;
    LCD_X_SHOWBUFFER_INFO *pData;
    switch (Cmd)
    {
        case LCD_X_INITCONTROLLER:
        {
            APP_ELCDIF_Init();
            break;
        }
        case LCD_X_SHOWBUFFER:
        {
            pData = (LCD_X_SHOWBUFFER_INFO *)p;
            /* Calculate address of the given buffer */
            addr = VRAM_ADDR + VRAM_SIZE * pData->Index;
            /* Make the given buffer visible */
            ELCDIF_SetNextBufferAddr(APP_ELCDIF, addr);
            //
            // Remember buffer index to be used by ISR
            //
            s_LCDpendingBuffer = pData->Index;
            while (s_LCDpendingBuffer >= 0)
                ;
            return 0;
        }
#if (LCD_BITS_PER_PIXEL == 8)
        case LCD_X_SETLUTENTRY:
        {
            //
            // Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p
            //
            LCD_X_SETLUTENTRY_INFO *pData;
            pData = (LCD_X_SETLUTENTRY_INFO *)p;
            //
            // Call hardware routine to write a LUT entry to the controller
            //
            color = pData->Color;
            colorB = (color & 0xFF0000) >> 16;
            colorG = (color & 0x00FF00) >> 8;
            colorR = (color & 0x0000FF);
            /* 16-bit bus */
            lutData[pData->Pos] = ((colorR >> 3) << 11) | ((colorG >> 2) << 5) | ((colorB >> 3) << 0);
            return 0;
        }
#endif
        default:
            result = -1;
            break;
    }

    return result;
}

上面是 RT1052 sdk自带的emwin demo实现LCD_X_DisplayDriver( ) 代码。





在线

#7 2018-03-26 14:00:57

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

参考链接1: STemWin如何启用Multiple Buffering功能

emwin 这个双缓冲功能不错,
参考这篇文章能理解透彻 RT1052为什么不是直接写像素,而是切双缓冲。





在线

#8 2018-03-26 14:04:55

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

int main(void)
{
...
    WM_SetDesktopColor(GUI_WHITE);
    WM_Exec();

    while (1)
    {
        /* Poll touch controller for update */
        if (BOARD_Touch_Poll())
        {
#ifdef GUI_BUFFERS
            GUI_MULTIBUF_Begin();
#endif
            GUI_Exec();
#ifdef GUI_BUFFERS
            GUI_MULTIBUF_End();
#endif
        }
    }
...
}

void APP_LCDIF_IRQHandler(void)
{
    uint32_t intStatus;

    intStatus = ELCDIF_GetInterruptStatus(APP_ELCDIF);

    ELCDIF_ClearInterruptStatus(APP_ELCDIF, intStatus);

    if (intStatus & kELCDIF_CurFrameDone)
    {
        if (s_LCDpendingBuffer >= 0)
        {
            /* Send a confirmation that the given buffer is visible */
            GUI_MULTIBUF_Confirm(s_LCDpendingBuffer);
            s_LCDpendingBuffer = -1;
        }
    }
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
    __DSB();
#endif
}

/*******************************************************************************
* Application implemented functions required by emWin library
******************************************************************************/
void LCD_X_Config(void)
{
    GUI_MULTIBUF_Config(GUI_BUFFERS);
    GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
    LCD_SetSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
    LCD_SetVSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
    LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);
#if (LCD_BITS_PER_PIXEL == 8)
    LCD_SetLUT(&_aPalette_256);
#endif
    BOARD_Touch_Init();
}

RT1052 emwin 处理双缓冲代码.





在线

#9 2018-03-26 14:07:25

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

我下载了emWin5.24版本。按照网上说的办法移植(网址  http://blog.sina.com.cn/s/blog_af170a920101dpxe.html),但是移植过程中,发现一运行emWin库就会挂掉,我怀疑是画点函数没有和emWin的画点函数关联起来。。求晕哥指点,emWin画点函数怎么关联我自己的lcd屏的画点,画线,清屏等操作?




实现 Keil_v5\ARM\Segger\emWin\Sample\DisplayDriver\GUIDRV_Template.c 这个里面的画点函数.

zh.DM00089670.pdf
如果不支持所使用的显示控制器,用户只需要改编 Library\STemWinLibraryXYZ\Config 目录
下的 GUIDRV_Template.c 文件,即可轻松创建个性化的驱动程序。实际上,这个模板文件
包含有显示驱动程序所需要用到的全部功能。需要适配改编的主要程序为 _SetPixelIndex()
和 _GetPixelIndex()。如果无法读取显示内容,应利用显示数据缓存来代替对
_GetPixelIndex() 函数的调用。





在线

楼主 #10 2018-03-26 14:57:23

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

试了,好像还是没反应。。。我之前找的emWin的例子,都没看到过 LCD_X_SHOWBUFFER 的相关部分的实现。。。

离线

#11 2018-03-26 20:29:03

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

试了,好像还是没反应。。。我之前找的emWin的例子,都没看到过 LCD_X_SHOWBUFFER 的相关部分的实现。。。

这个帖子不错: http://forum.armfly.com/forum.php?mod=viewthread&tid=1678

1. 添加 三个文件 GUIDRV_Template.c,GUIDRV_TemplateI.c,GUIDRV_TemplateI_SetFuncXXX.c 到工程

2. 修改 _SetPixelIndex, _GetPixelIndex, _GetDevData 三个函数

3. 注册显卡驱动

void LCD_X_Config(void)
{       
     /* Set display driver and color conversion for 1st layer */
        GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
        /* Display driver configuration */
    LCD_SetSizeEx    (0, 128, 64);
    LCD_SetVSizeEx   (0, 128, 64);
}

做完上面三步,基本完成 emwin LCD驱动。





在线

楼主 #12 2018-03-27 17:54:15

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

怎么注册驱动,为什么我注册了驱动总是报错。。。

离线

楼主 #13 2018-03-27 18:00:10

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

我注册成功了,但是显示依然无法 显示。。

离线

#14 2018-03-27 18:58:06

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

我注册成功了,但是显示依然无法 显示。。

用仿真器跟踪,有没有进入打点函数。





在线

楼主 #15 2018-03-27 19:21:24

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

如何调试了?求指点

晕哥 说:
35584301 说:

我注册成功了,但是显示依然无法 显示。。

用仿真器跟踪,有没有进入打点函数。

离线

楼主 #16 2018-03-27 19:22:57

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

怎么用仿真器跟踪?

35584301 说:

如何调试了?求指点

晕哥 说:
35584301 说:

我注册成功了,但是显示依然无法 显示。。

用仿真器跟踪,有没有进入打点函数。

离线

#17 2018-03-27 19:32:12

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

怎么用仿真器跟踪?

35584301 说:

如何调试了?求指点

晕哥 说:

用仿真器跟踪,有没有进入打点函数。

QQ20180324195802.jpg

没有用过JLink?





在线

楼主 #18 2018-03-28 09:47:47

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

现在调动emWin刷屏是可以 ,但是显示字体还有问题

离线

楼主 #19 2018-03-28 10:48:03

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

如何把我的延迟函数替换emWin中的延迟函数?

离线

#20 2018-03-28 11:00:37

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

如何把我的延迟函数替换emWin中的延迟函数?

重新定义 GUI_X_Delay( )
linux可以调用 usleep( )
windows可以调用 Sleep( )
rtos调用 OS_Delay( )
裸奔可以循环调用汇编 nop 指令即可





在线

楼主 #21 2018-03-28 15:43:37

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

显示 字体的函数有问题,有没有办法 void  GUI_DispStringAt(const char * s, int x, int y) 调动了哪些底层函数?

离线

#22 2018-03-28 15:57:55

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

我刚刚跟踪了,
这个函数跟踪不进去,
包括
GUI_DispStringAt
GUI_SetColor
GUI_SetFont
都跟踪不进去。

可以确定他没有调用打点函数,
估计在内部处理了。
你还是用他别的demo程序吧,看是不是应用层代码问题?





在线

#23 2018-03-28 16:11:07

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

QQ20180328161325.png

跟踪了 ucgui 3.98的代码,GUI_DispStringAt有调用 打点函数.

估计是emwin用QtCreator调试器跟踪不进去.





在线

楼主 #24 2018-03-28 17:35:22

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库


现在显示字体成功了,但是显示速度有点缓慢。。。其他 的都 正常了。。。有没有办法 使字体刷新的速度提高点吗?

离线

#25 2018-03-28 17:40:54

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

是不是你的延时函数有问题
或者打点函数驱动有问题





在线

楼主 #26 2018-03-28 17:54:46

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

void   GUI_Delay  (int Period)这个延迟函数是不是没有调动 void GUI_X_Delay(int ms)函数?我重定义了GUI_X_Delay.能正常调动GUI_X_Delay,但是不能正常调动GUI_Delay,调动时时程序会卡住不动。

离线

#27 2018-03-28 18:08:38

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

从 ucgui 3.98代码看, GUI_Delay  调用了 GUI_X_Delay

/*********************************************************************
*
*       GUI_Delay
*/
void GUI_Delay(int Period) {
  int EndTime = GUI_GetTime()+Period;
  int tRem; /* remaining Time */
  GUI_ASSERT_NO_LOCK();
  while (tRem = EndTime- GUI_GetTime(), tRem>0) {
    GUI_Exec();
    GUI_X_Delay((tRem >5) ? 5 : tRem);
  }
}





在线

楼主 #28 2018-03-29 09:47:38

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

哦。原来调动了GUI_GetTime()来获利时间,加了systick中断进去。
int GUI_X_GetTime(void) {
  return TimeMS;
} 。把TimeMS设置成随systick变化就可以正常工作了。

离线

楼主 #29 2018-03-29 09:54:43

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

还有一个问题了,我查到的问题是“GUIConf.c”里的“#define GUI_NUMBYTES  1024* 12  // ”定义问题。
我想把这个改大点。改成  “#define GUI_NUMBYTES  1024* 30// ”编译器就报错用户空间超出32K的空间。我的芯片是iROM是64K的。为什么只能用32K的空间。 我看lpc1788的例子的配置“GUIConf.c”里的“#define GUI_NUMBYTES  (1024 * 1024) * 12  // x MByte”定义问题。
lpc1788不可能有12M的空间了。。这个是怎么分配空间的?

离线

#30 2018-03-29 09:54:48

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

现在输出字符正常了吗?





在线

楼主 #31 2018-03-29 11:55:21

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

输出字体正常了,显示也正常。就是显示有点慢。。GUI的延迟函数也修改好了,显示驱动我也改了,还是一样显示有点慢。这块芯片没有LCM控制器不能采用DMA方式 操作LCM,只能通过GPIO方式来模拟,来操作屏幕。。

离线

楼主 #32 2018-03-29 11:58:09

35584301
会员
注册时间: 2018-03-26
已发帖子: 16
积分: 16

Re: 求指点,LPC1765芯片中移植emWin库

估计要显示快速,芯片得换成LPC1788.。里面有 LCM的控制器以及256M的SDRAM,IROM也比这个大。。

离线

#33 2018-03-29 13:34:02

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,244
积分: 9197

Re: 求指点,LPC1765芯片中移植emWin库

35584301 说:

估计要显示快速,芯片得换成LPC1788.。里面有 LCM的控制器以及256M的SDRAM,IROM也比这个大。。

这样的话我建议先用1788,先把基本功能搞定,至少有产品可以演示,后面慢慢降成本。





在线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn