硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1873|回复: 7
收起左侧

[emWin] 老问题一直没解决,刷新慢

[复制链接]

1

主题

3

回帖

15

积分

新手上路

积分
15
发表于 2018-1-4 08:26:21 | 显示全部楼层 |阅读模式
大神们帮我分析一下。谢谢
视频上传不了。麻烦教下上传视频 。
硬件是STM32F103VC +SSD1963
emwin内存是40*1024.驱动也优化了
在主界面有几张图片,开启 WM_SetCreateFlags(WM_CF_MEMDEV)后刷新慢,但是又要必须开启,要不然有闪烁感.
在wm_paint下要显示几张位图。

GUI_CONST_STORAGE GUI_BITMAP bmwaterfull = {
  95, // xSize
  170, // ySize
  190, // BytesPerLine
  16, // BitsPerPixel
  (unsigned char *)_acwaterfull,  // Pointer to picture data
  NULL,  // Pointer to palette
  GUI_DRAW_BMP565
};
这种大小的图片有两张,是相互替换用。
GUI_CONST_STORAGE GUI_BITMAP bmredpump = {
  45, // xSize
  120, // ySize
  90, // BytesPerLine
  16, // BitsPerPixel
  (unsigned char *)_acredpump,  // Pointer to picture data
  NULL,  // Pointer to palette
  GUI_DRAW_BMP565
};
这种大小的图片要显示8张。
还有几张小图标。

我试了一下,如果在wm_paint不放这些图片,刷新还是可以的,看不到刷新感。但是显示这些图片就很明显。
下面附这些图片的显示方式。
void pump_display(void)
{
    u8 i;
     GUI_SetPenSize(6);      
         GUI_SetFont(&GUI_Font24_ASCII);
     for(i=0;i<8;i++)
             {      
               if (SysParameterCur.PumpUseFlag[i]==UseState)
               {   
                 GUI_DrawLine(225+i*75,170,760,170);//最上面线条
                 GUI_DrawLine(165+i*75,318,165+i*75,370);//竖线
                   GUI_DrawLine(165+i*75,318,225+i*75,318);//上横
                 GUI_DrawLine(225+i*75,170,225+i*75,318);//上竖线
                 GUI_DrawLine(140,370,165+i*75,370);//底部线条
                 GUI_GotoXY(180+i*75,335);
                 GUI_DispDec(i+1,1);
                 GUI_DispStringAt("#",192+i*75,335);

                if (PumpState[i]==RunState)
                {
                    GUI_DrawBitmap(&bmbluepump,170+75*i,212);
                }
                else if (PumpState[i]==StopState)
                {
                    GUI_DrawBitmap(&bmredpump,170+75*i,212);
                }
                else if (PumpState[i]==ErroState)
                {
                    GUI_DrawBitmap(&bmgradpump,170+75*i,212);
                }


               }
               else if (SysParameterCur.PumpUseFlag[i]==NoUseState)
               {
                   __NOP();
               }
           }
}

void waterbox_check(void)
{
     //水箱缺水信号显示
       if (SysParameterCur.PumpUseFlag[10] ==UseState )
       {           
       if ((input_buf[0]&0x10)==0x10)
       {
       GUI_DrawBitmap(&bmwaterlow,45,220);
        }
        else
        {
        GUI_DrawBitmap(&bmwaterfull,45,220);
        }   
       }
       else
       {
       if ((input_buf[0]&0x10)==0x10)
       {
           GUI_DrawBitmap(&bmwaterfull,45,220);

        }
        else
        {
            GUI_DrawBitmap(&bmwaterlow,45,220);

        }  
       }
}

我现在个人感觉是认为内存不够,我试着调整,用10*1024时,刷新很慢,但是我最大也只能放大到40*1024了,比10*1024要快一些。

大神们有什么好的方法。给个思路也行。







回复

使用道具 举报

54

主题

145

回帖

307

积分

高级会员

积分
307
发表于 2018-1-4 09:25:24 | 显示全部楼层
刷新慢要优化底层的驱动
回复

使用道具 举报

1

主题

3

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-1-4 09:59:47 | 显示全部楼层
mewan 发表于 2018-1-4 09:25
刷新慢要优化底层的驱动

已优化。我也看了核对对硬汉的程序 ,优化过的。我现在怀疑是内存不够,分段显示了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2018-1-4 11:41:59 | 显示全部楼层
程序没问题,主要是底层的16bpp的优化,这个优化了,显示是图片速度会快不少。

ps:视频的话,论坛上传不了,得上传到优酷或者腾讯视频,论坛发个链接就行。
回复

使用道具 举报

1

主题

3

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-1-4 13:43:05 | 显示全部楼层
硬汉,这个我的底层16BPP的驱动,你看下有问题吗
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
       
        LCD_PIXELINDEX pixel;
        LCD_SetCursor(x,y);
        *(__IO uint16_t *)(UCGUI_LCD_CMD)  = lcddev.wramcmd;  //写入颜色值
        for (;xsize > 0; xsize--, x++, p++)
        {
                pixel = *p;
        *(__IO uint16_t *)(UCGUI_LCD_DATA) =pixel;
    }
   
       
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2018-1-5 01:53:40 | 显示全部楼层
king 发表于 2018-1-4 13:43
硬汉,这个我的底层16BPP的驱动,你看下有问题吗
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, i ...

没问题,这样就可以了。

pixel = *p;
*(__IO uint16_t *)(UCGUI_LCD_DATA) =pixel;
可以改成
*(__IO uint16_t *)(UCGUI_LCD_DATA) =*p;

如果这样还有问题的话,估计你的显示屏就这样了。
回复

使用道具 举报

1

主题

3

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-1-5 21:19:11 | 显示全部楼层
eric2013 发表于 2018-1-5 01:53
没问题,这样就可以了。

pixel = *p;

就是可能内存不够,我把STM32F103VC换成103VE,把动态内存由40K改成55K,明显快了一些,但是还是能看的到,层层下来,但是速度快了。我理解是不是自动分段存储显示了,才有这刷屏感。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2018-1-6 01:30:00 | 显示全部楼层
king 发表于 2018-1-5 21:19
就是可能内存不够,我把STM32F103VC换成103VE,把动态内存由40K改成55K,明显快了一些,但是还是能看的到 ...

估计速度就这样了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-16 03:08 , Processed in 0.243958 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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