硬汉嵌入式论坛

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

分享一个littlevgl的基本demo,通过dma进行绘制,提高了速度

[复制链接]

25

主题

100

回帖

180

积分

初级会员

积分
180
发表于 2020-6-19 09:34:57 | 显示全部楼层 |阅读模式
本帖最后由 xujun 于 2020-6-20 08:15 编辑

根据硬汉的例子去掉了emwin,修改为littlevgl,由于bsp_tft_429.c内没有提供通过DMA绘制矩形图片函数,仅提供了DMA绘制单色矩形,增加了一个函数通过DMA绘制图片
  1. void LCD429_FillRect1(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t *_usColor)
  2. {
  3.         uint32_t timeout=0;
  4.         /* 使用DMA2D硬件填充矩形 */
  5.         DMA2D_InitTypeDef      DMA2D_InitStruct;
  6.         DMA2D_FG_InitTypeDef   DMA2D_FG_InitStruct;
  7.         uint32_t  Xaddress = 0;


  8.         uint16_t  OutputOffset;
  9.         uint16_t  NumberOfLine;
  10.         uint16_t  PixelPerLine;        
  11.                
  12.         if (g_LcdDirection == 0)                /* 横屏 */
  13.         {
  14.                 Xaddress = s_CurrentFrameBuffer + 2* (g_LcdWidth * _usY + _usX);        
  15.                 OutputOffset = g_LcdWidth-(_usHeight-_usX+1);
  16.                 NumberOfLine = _usHeight-_usX+1;
  17.                 PixelPerLine = _usWidth-_usY+1;
  18.         }
  19.         else if (g_LcdDirection == 2)        /* 竖屏 */
  20.         {
  21.                 Xaddress = s_CurrentFrameBuffer + 2 * (g_LcdHeight * (g_LcdWidth - _usX -  _usWidth) + _usY);        
  22.                 OutputOffset = g_LcdHeight - _usHeight;
  23.                 NumberOfLine = _usWidth;
  24.                 PixelPerLine = _usHeight;
  25.         }

  26.         /* 配置 DMA2D */
  27.         DMA2D->CR&=~(DMA2D_CR_START);        //先停止DMA2D
  28.         DMA2D->CR=DMA2D_M2M;                        //存储器到存储器模式
  29.         DMA2D->FGPFCCR=DMA2D_RGB565;        //设置颜色格式
  30.         DMA2D->FGOR=0;                                        //前景层行偏移为0
  31.         DMA2D->OOR=OutputOffset;                                //设置行偏移

  32.         DMA2D->FGMAR=(u32)_usColor;                //源地址
  33.         DMA2D->OMAR=Xaddress;                                //输出存储器地址
  34.         DMA2D->NLR=(PixelPerLine)|(NumberOfLine<<16);        //设定行数寄存器
  35.         DMA2D->CR|=DMA2D_CR_START;                                        //启动DMA2D
  36.         while((DMA2D->ISR&(DMA2D_FLAG_TC))==0)                //等待传输完成
  37.         {
  38.                 timeout++;
  39.                 if(timeout>0X1FFFFF)break;        //超时退出
  40.         }
  41.         DMA2D->IFCR|=DMA2D_FLAG_TC;                                //清除传输完成标志

  42. }
复制代码
需要的可以自己在整理一下程序的结构,目前粗糙,但刷新速度不错。

littlevgl_demo.rar (18.35 MB, 下载次数: 169) eab3de2fafbbf5acee6df6cb05a8a040.mp4 (1.69 MB, 下载次数: 325)


修复触摸不灵敏问题,修改10ms调用一次读取触摸屏函数GT811_OnePiontScan
内部增加读取后提交到数据队列,程序如下:增加了TOUCH_PutKey提交数据

  1. void GT811_OnePiontScan(void)
  2. {
  3.         uint8_t buf[6];
  4.         static uint8_t s_tp_down = 0;
  5.         uint16_t x, y;
  6.        
  7.         /* 读取寄存器:0x721  R  TouchpointFlag  Sensor_ID  key  tp4  tp3  tp2  tp1  tp0 */
  8.         GT811_ReadReg(GT811_READ_XY_REG, buf, 1);
  9.        
  10.         /* 判断是否按下,没有按下,直接退出 */
  11.         if ((buf[0] & 0x01) == 0)
  12.         {
  13.                 if (s_tp_down == 1)
  14.                 {
  15.                         /* State.x和State.y的数值无需更新,State是全局变量,保存的就是最近一次的数值 */
  16.                         s_tp_down = 0;
  17. //                        State.Pressed = 0;
  18. //                        GUI_PID_StoreState(&State);
  19.                 }
  20.                 return;
  21.         }
  22.        
  23.         /* 读取第一个触摸点0 */
  24.         GT811_ReadReg(GT811_READ_XY_REG + 1, &buf[1], 5);
  25.        
  26.         /*
  27.         0x721  R  TouchpointFlag  Sensor_ID  key  tp4  tp3  tp2  tp1  tp0
  28.         0x722  R  Touchkeystate     0  0  0  0  key4  key3  key2  key1

  29.         0x723  R  Point0Xh  触摸点 0,X 坐标高 8 位
  30.         0x724  R  Point0Xl  触摸点 0,X 坐标低 8 位
  31.         0x725  R  Point0Yh  触摸点 0,Y 坐标高 8 位
  32.         0x726  R  Point0Yl  触摸点 0,Y 坐标低 8 位
  33.         0x727  R  Point0Pressure  触摸点 0,触摸压力
  34.         */
  35.         g_GT811.TouchpointFlag = buf[0];
  36.         g_GT811.Touchkeystate = buf[1];
  37.        
  38.         g_GT811.X0 = ((uint16_t)buf[2] << 8) + buf[3];
  39.         g_GT811.Y0 = ((uint16_t)buf[4] << 8) + buf[5];
  40.        
  41.         /* 检测按下 */
  42.         /* 坐标转换 :
  43.                 电容触摸板左下角是 (0,0);  右上角是 (479,799)
  44.                 需要转到LCD的像素坐标 (左上角是 (0,0), 右下角是 (799,479)
  45.         */
  46.         x = g_GT811.Y0;
  47.         y = 479 - g_GT811.X0;
  48.        
  49.         if (s_tp_down == 0)
  50.         {
  51.                 s_tp_down = 1;
  52.                 TOUCH_PutKey(TOUCH_DOWN, x, y);        }
  53.         else
  54.         {
  55.                 TOUCH_PutKey(TOUCH_DOWN, x, y);
  56.         }
  57.        
  58. }
复制代码


配置littlevgl读取触摸周期为20ms,因为从队列取数据,缩短周期影响不是很大。整理程序的结构,删减不用的部分,仅保留了GT811触摸驱动,littlevgl接口按照官方文档整理,使用体验更顺畅。

littlevgl_demo20200620.rar (18.32 MB, 下载次数: 375)


评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

25

主题

100

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-6-19 09:36:28 | 显示全部楼层
本帖最后由 xujun 于 2020-6-20 08:16 编辑

55

littlevgl_demo.rar

18.35 MB, 下载次数: 152

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-6-19 10:17:22 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

13

主题

95

回帖

134

积分

初级会员

积分
134
发表于 2020-6-19 21:48:11 | 显示全部楼层
V6测试了一下,不错,速度很快
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-6-2 13:52:52 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
发表于 2021-6-3 11:01:41 | 显示全部楼层
学习一下,
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
发表于 2021-8-5 14:44:46 | 显示全部楼层
本帖最后由 crazymcu 于 2021-8-9 17:46 编辑

已解决,感谢分享
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
发表于 2021-8-5 14:45:49 | 显示全部楼层
感谢楼主分享,请问我这个帖子的触摸滑动问题你有遇到过吗?
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 04:18 , Processed in 0.185810 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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