硬汉嵌入式论坛

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

[emWin] 请教一个问题,关于_DrawBitLine16BPP函数。

[复制链接]

5

主题

15

回帖

30

积分

新手上路

积分
30
发表于 2019-1-14 12:06:05 | 显示全部楼层 |阅读模式
在移植emwin时需要移植这个函数,static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize)。
对这几个参数不了解,另外,我这里有显示图片的函数:void LCD_Show_Image(u16 x, u16 y, u16 width, u16 height, const u8 *p)。
请问,怎么修改一下把LCD_Show_Image添加到_DrawBitLine16BPP中?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-1-14 12:34:55 | 显示全部楼层
16bpp的意思绘制一个支持颜色配置的水平线
以9488为例:
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: ILI9488_DrawHTransLine
  4. *        功能说明: 绘制一条彩色透明的水平线 (主要用于UCGUI的接口函数), 颜色值为0表示透明色
  5. *        形    参:  _usX1    :起始点X坐标
  6. *                          _usY1    :水平线的Y坐标
  7. *                          _usWidth :直线的宽度
  8. *                          _pColor : 颜色缓冲区
  9. *        返 回 值: 无
  10. *********************************************************************************************************
  11. */
  12. void ILI9488_DrawHTransLine(uint16_t _usX1 , uint16_t _usY1, uint16_t _usWidth, const uint16_t *_pColor)
  13. {
  14.         uint16_t i, j;
  15.         uint16_t Index;

  16.         ILI9488_SetCursor(_usX1, _usY1);

  17.         /* 写显存 */
  18.         ILI9488_REG = 0x2C;
  19.         for (i = 0,j = 0; i < _usWidth; i++, j++)
  20.         {
  21.                 Index = *_pColor++;
  22.             if (Index)
  23.         {
  24.                          ILI9488_RAM = Index;
  25.                 }
  26.                 else
  27.                 {
  28.                         ILI9488_SetCursor(_usX1 + j, _usY1);
  29.                         ILI9488_REG = 0x2C;
  30.                         ILI9488_RAM = Index;
  31.                 }
  32.         }
  33. }
复制代码


以RA8875为例:
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: RA8875_DrawHColorLine
  4. *        功能说明: 绘制一条彩色水平线 (主要用于UCGUI的接口函数)
  5. *        形    参:_usX1    :起始点X坐标
  6. *                          _usY1    :水平线的Y坐标
  7. *                          _usWidth :直线的宽度
  8. *                          _pColor : 颜色缓冲区
  9. *        返 回 值: 无
  10. *********************************************************************************************************
  11. */
  12. void RA8875_DrawHColorLine(uint16_t _usX1 , uint16_t _usY1, uint16_t _usWidth, uint16_t *_pColor)
  13. {
  14.         uint16_t i;

  15.         s_ucRA8875Busy = 1;
  16.         
  17.         RA8875_REG = 0x46; RA8875_RAM = _usX1;
  18.         RA8875_REG = 0x47; RA8875_RAM = _usX1 >> 8;
  19.         RA8875_REG = 0x48; RA8875_RAM = _usY1;
  20.         RA8875_REG = 0x49; RA8875_RAM = _usY1 >> 8;

  21.         RA8875_REG = 0x02;                 /* 用于设定RA8875 进入内存(DDRAM或CGRAM)读取/写入模式 */
  22.         
  23.         for (i = 0; i < _usWidth; i++)
  24.         {
  25.                 RA8875_RAM = *_pColor++;
  26.                 //RA8875_WriteData16(*_pColor++);
  27.         }
  28.         
  29.         s_ucRA8875Busy = 0;
  30. }
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-1-14 12:37:12 | 显示全部楼层
如果需要DMA方式的控制,看此贴:

【原创开源应用第4期】给ili9488,RA8875等类显示屏的emWin底层增加DMA加速,提供RTX,uCOS和FreeRTOS版本
http://www.armbbs.cn/forum.php?m ... 7501&fromuid=58
(出处: 安富莱电子论坛)
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2019-1-14 13:40:25 | 显示全部楼层
本帖最后由 去月球 于 2019-1-14 15:22 编辑
eric2013 发表于 2019-1-14 12:34
16bpp的意思绘制一个支持颜色配置的水平线
以9488为例:

优化了16bpp函数,速度比之前快了一倍,总体来说还是很慢,现在我试试DMA的方式。
1547444266(1).png
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2019-1-14 21:40:09 | 显示全部楼层
eric2013 发表于 2019-1-14 12:37
如果需要DMA方式的控制,看此贴:

【原创开源应用第4期】给ili9488,RA8875等类显示屏的emWin底层增加DM ...

请问,我用的F429,可不可以用DMA2D来进行加速。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-1-15 00:42:35 | 显示全部楼层
去月球 发表于 2019-1-14 21:40
请问,我用的F429,可不可以用DMA2D来进行加速。

没问题。
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2019-1-15 16:03:45 | 显示全部楼层

求助。使用DMA2D的方式优化_DrawBitLine16BPP函数,给emwin分配的起始地址为0xC0100000,屏幕的分辨率为宽240*高320(竖屏),有几个寄存器的配置不太清楚。
1. DMA2D->CR  操作模式
2. DMA2D->OOR 输出偏移量
3. DMA2D->OMDR 填写哪个地址
4. DMA2D->NLR 填写什么参数

这几个寄存器,该怎么填写。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-1-16 00:31:18 | 显示全部楼层
去月球 发表于 2019-1-15 16:03
求助。使用DMA2D的方式优化_DrawBitLine16BPP函数,给emwin分配的起始地址为0xC0100000,屏幕的分辨率为 ...

从此贴任意下载一个emWin例子,然后看出文件夹\emWin\Config
http://www.armbbs.cn/forum.ph ... 9834&extra=page%3D1

里面有个emWin底层接口文件LCDConf_Lin_Template.c。

DMA2D的各种优化都已经实现,你可以参考使用。
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2019-1-16 09:21:33 | 显示全部楼层
本帖最后由 去月球 于 2019-1-16 10:03 编辑
eric2013 发表于 2019-1-16 00:31
从此贴任意下载一个emWin例子,然后看出文件夹\emWin\Config
http://www.armbbs.cn/forum.ph ... 983 ...

1547601351(1).png 参考了例程来用DMA2D优化_FIilRect函数,但是执行GUI_Init时程序卡死,但是添加打印信息发现GUI_X_Config、LCD_X_Config、LCD_X_DisplayDriver依次被执行,然后_FIilRect函数也执行了,但是程序还是在GUI_Init卡死。另外屏幕是SPI屏,没有使用LTDC。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-1-16 10:00:14 | 显示全部楼层
去月球 发表于 2019-1-16 09:21
参考了例程来用DMA2D优化_FIilRect函数,但是执行GUI_Init时程序卡死,但是添加打印信息发现GUI_X_Config ...

调用函数GUI_Init前使用前要使能DMA2D时钟。

另外程序卡死是什么意思,程序界面卡,还是直接死掉了。
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2019-1-16 10:11:26 | 显示全部楼层
本帖最后由 去月球 于 2019-1-16 12:06 编辑
eric2013 发表于 2019-1-16 10:00
调用函数GUI_Init前使用前要使能DMA2D时钟。

另外程序卡死是什么意思,程序界面卡,还是直接死掉了。

DMA2D时钟刚刚已经使能,一样的结果。卡死,是调试的时候,程序执行到GUI_Init,卡在了GUI_Init,屏幕是花屏状态。还有个问题,不管是DMA还是DMA2D,都需要设置LCD显存地址是吗?我一直都是把数据传送到了emwin的动态内存,不知道这样对不对。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-1-17 02:13:29 | 显示全部楼层
去月球 发表于 2019-1-16 10:11
DMA2D时钟刚刚已经使能,一样的结果。卡死,是调试的时候,程序执行到GUI_Init,卡在了GUI_Init,屏幕是 ...

优化的时候一定要使用参数传递过来的地址。
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2019-1-18 10:14:55 | 显示全部楼层
eric2013 发表于 2019-1-17 02:13
优化的时候一定要使用参数传递过来的地址。

移植emwin时,是通用的移植方法。看emwin用户手册发现emwin支持我的lcd,驱动为GUIDRV_CompactColor_16,如果要用官方的驱动来移植,有没有参考例子。还有就是通用的移植方法,和使用官方提供的驱动,哪个显示速度更快一些。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 19:48 , Processed in 0.279491 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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