硬汉嵌入式论坛

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

[emWin] STM32F103+RA8875,在没有挂在外部存储的情况下,怎么才能让界面更流畅

[复制链接]

3

主题

18

回帖

27

积分

新手上路

积分
27
发表于 前天 08:53 | 显示全部楼层 |阅读模式
如题,目前我使用的是STMF103ZET6+RA8875液晶驱动芯片,但是芯片外部并没有挂载任何的存储芯片,所以我做界面切换的时候,下一次要显示的界面的控件是可以用肉眼看得出来一个一个刷新出来的,目前我该怎么解决这个问题?

能不能让emWIN将下一个界面的所有像素写在RA8875的另外一个层,写完之后,我在调用RA8875的层切换函数直接显示呢,有没有大佬这么做过?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122428
QQ
发表于 前天 09:17 | 显示全部楼层
这个是底层没优化好,RA8875有2D硬件加速,要利用上

参考我们已经停产的V4开发板的emWin例子,采用的RA8875,

https://forum.anfulai.cn/forum.p ... &extra=page%3D1
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 前天 14:27 | 显示全部楼层
eric2013 发表于 2026-5-7 09:17
这个是底层没优化好,RA8875有2D硬件加速,要利用上

参考我们已经停产的V4开发板的emWin例子,采用的RA8 ...

大佬,我看了一下,你给我分享的这个教程中移植的部分,使用RA8875的功能的地方好像也就是画点,读点,画水平线,画垂直线和区域纯色填充,我自己的程序中移植也是移植的这些,但是就像我上面说的一样,我还是可以看到控件是一个一个刷新出来的。目前还没找到解决的办法,大佬你有什么思路吗?
回复

使用道具 举报

4

主题

469

回帖

481

积分

高级会员

积分
481
发表于 前天 22:05 | 显示全部楼层
小内存GUI界面流畅的核心思想是:整个屏幕分成若干个区块顺序渲染,由于是部分渲染,所占内存不多,然后把渲染在内存里的像素点图块通过DMA传输到显示器;接着渲染下一个图块,直到整个屏幕或所有脏区域都完成。
总结就是:渲染⋙传输⋙渲染⋙传输⋙ 渲染⋙传输⋙直到完成。
避免每个像素直接打点到显示器,特别不要对像素进行“读-修改-写”,这都是龟速的原因。
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 前天 22:34 | 显示全部楼层
glory 发表于 2026-5-7 22:05
小内存GUI界面流畅的核心思想是:整个屏幕分成若干个区块顺序渲染,由于是部分渲染,所占内存不多,然后把 ...

我整体的背景是使用液晶驱动芯片的区域填充去做的,但是控件的绘制是通过emWIN的画点和画线去做的,但是我界面上有五个控件,我可以很明显的看到,界面先变成白屏,然后控件在短时间内一个一个的出现,我感觉是绘制控件绘制的慢了,目前还不知道怎么解决。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122428
QQ
发表于 9 小时前 | 显示全部楼层
zha0ke 发表于 2026-5-7 14:27
大佬,我看了一下,你给我分享的这个教程中移植的部分,使用RA8875的功能的地方好像也就是画点,读点,画 ...

一定要把RA8875硬件2D加速配置上,参考我们的例子,都实现了。

还有就是16bpp接口函数的优化,非常重要,这个在我们的例子里面也实现了,参考下
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 4 小时前 | 显示全部楼层
eric2013 发表于 2026-5-9 10:33
一定要把RA8875硬件2D加速配置上,参考我们的例子,都实现了。

还有就是16bpp接口函数的优化,非常重 ...

static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const * p, int xsize) {
    //设置图形光标位置
    LCD_Graphic_Cursor_Set(x, y);
   
    //进入内存写入模式
    LCD_Write_Command(MRWDP); // 0x04 命令,进入内存读写模式
   
    //连续写入数据
    for (int i = 0; i < xsize; i++) {
        uint16_t color = p;
        LCD_Write_Data(color >> 8); // 再写高字节
        LCD_Write_Data(color);      // 先写低字节
    }
   
    // 4. 等待 FIFO 空
    LCD_Check_Mem_WR_FIFO_Empty();
}
这是我的 16BPP优化后的函数,但是我在这段程序里打个断点,程序运行的时候,我点击界面切换,断点根本不起作用,说明程序没有调用这个函数。
/*********************************************************************
*
*       _DrawBitmap
*/
static void _DrawBitmap(GUI_DEVICE * pDevice, int x0, int y0,
                       int xSize, int ySize,
                       int BitsPerPixel,
                       int BytesPerLine,
                       const U8 * pData, int Diff,
                       const LCD_PIXELINDEX * pTrans) {
  int i;

  switch (BitsPerPixel) {
  case 1:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine1BPP(pDevice, x0, i + y0, pData, Diff, xSize, pTrans);
      pData += BytesPerLine;
    }
    break;
  case 2:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine2BPP(pDevice, x0, i + y0, pData, Diff, xSize, pTrans);
      pData += BytesPerLine;
    }
    break;
  case 4:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine4BPP(pDevice, x0, i + y0, pData, Diff, xSize, pTrans);
      pData += BytesPerLine;
    }
    break;
  case 8:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine8BPP(pDevice, x0, i + y0, pData, xSize, pTrans);
      pData += BytesPerLine;
    }
    break;
  //
  // Only required for 16bpp color depth of target. Should be removed otherwise.
  //
  case 16:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine16BPP(pDevice, x0, i + y0, (const U16 *)pData, xSize);
      pData += BytesPerLine;
    }
    break;
  //
  // Only required for 32bpp color depth of target. Should be removed otherwise.
  //
  case 32:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine32BPP(pDevice, x0, i + y0, (const U32 *)pData, xSize);
      pData += BytesPerLine;
    }
    break;
  }
}
这是我的_DrawBitmap函数,我把断点打在switch这一行,发现传进来的参数为0x00000001,像这种情况是我哪里没有配置吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-9 20:18 , Processed in 0.561453 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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