找回密码
 立即注册
查看: 2343|回复: 30

基于 32G12K128 实验箱 V9.62_实验之TFT彩屏驱动+LCM+DMA

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2025-05-02 09:16:59

30

主题

347

回帖

3480

积分

荣誉版主

积分
3480
发表于 2024-8-28 22:12:31 | 显示全部楼层 |阅读模式
基于 32G12K128 实验箱V9.62_实验之TFT彩屏驱动+LCM+DMA

日前曾在本版块发过一帖"基于STC32G12K128实验箱V9.62_实验之TFT彩屏驱动",是没有采用LCM和DMA方式驱动的。
这两天看到AI8051U实验箱的DEMO文件包出来了,令人欣喜,坛子里的新帖也特别提到TTF彩屏用DMA模式刷屏显示图片的话题。
由于本人没有AI8051实验箱,思想着用现有的STC32G12K128实验箱V9.62,来做做实验,体验感应该是比较接近的。
于是乎, 今日抽空再做一个实验,试看加上LCM和DMA方式后的清屏效果如何。

一直以来,我对STC32G单片机DMA模式的认知是不够的。我在做其他STM32实际项目中,使用DMA手段是比较经常的。而在STC32G各项实验中,则较少采用,也是有一定原因的。
众所周知,DMA,先看百度解释:
DMA是Direct Memory Access的缩写,即直接存储器存取,是一种快速传送数据的机制。
DMA技术的重要性在于,利用它进行数据存取时不需要CPU进行干预,可提高系统执行应用程序的效率
也就是说传输数据时不完全依赖CPU的控制,不需要CPU等待器完成。
在阅读STC32G各个相关DMA的DEMO程序源码时,感觉这DMA模式的机制不太习惯。
比如在拜读梁工的''老示波器"程序源码时, 发现启动DMA传输后,要等待传输完成,这哪里是DMA啊,发现老梁自己也有注释了(原文摘贴如下):
// ( 显示一个汉字16*16=256像素, 先将字模点阵送入缓存区,然后启动DMA传输...
// 比定坐标显示点,效率相对提高, 但是要等待DMA发送完毕,又没用到真正DMA作用.)
因此对STC32G的DMA功能就不太重视了,认识也不足了。
据说AI8051U实验箱已有真正DMA功能,不需要等待,坛子里也有demo出现了,有待认真学习理解。


今日实验, 是在原程序的基础上,保持原来程序的所有代码,加入LCM和DMA,加入定时器, 来测试一下清屏时间, 以对比不同模式实效如何。
主频35MHz的同样条件下,加入清屏测试时间。 分三种情况:
1, 原程序不动,
2, 原程序+LCM方式,
3,   原程序+LCM方式+DMA方式。

这三种方式, 是通过LCD9341.H 文件中的宏定义 USE_LCM  和 USE_DMA  来切换预编译来实现的。


#define USE_LCM  1      //1:使用LCM模式          0:模拟SPI模式
#define USE_DMA  1     //1:使用LCM+DMA模式 0:模拟SPI模式

第四种情况不可能,因为不加LCM,单加DMA不可能,这里的DMA是DMA_LCM, 是与LCM密切相关的。


第一种情况, 原程序不动, 如照片所示,清一屏时间,78ms左右。
1原始方式清屏.jpg

第二种情况, 加LCM方式, 如照片所示,清一屏时间,326ms左右。
2加LCM模式清屏.jpg

第三种情况, 再加DMA方式,如照片所示,清一屏时间,78ms左右。

3加LCM DMA方式清屏.jpg

结论是,加LCM和DMA, 结果与原始程序的效果基本相同,好像是白白忙乎了,又好像是哪里存在问题 ,有待进一步研究。
虽然定时器不一定精确(按33MHz计算的1ms定时), 但是这是相对效果,应该是有可比性的。

再将加LCM和DMA以后的完整视频,再贴一下,供客官观看。其刷屏速度,对于实战项目,应该是能够满足的。




完整工程文件在此,欢迎有兴趣并有实验条件的STC51单片机爱好者下载、编译、运行、看看。
也希望官方团队,实验验证,给予指正。
基于STC32G12K128实验箱V6.92_实验之TFT彩屏驱动 LCM DMA.rar (140.27 KB, 下载次数: 187)



3 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2025-05-02 09:16:59

30

主题

347

回帖

3480

积分

荣誉版主

积分
3480
发表于 2024-8-28 22:38:47 | 显示全部楼层
本帖最后由 浦江一水 于 2024-8-31 20:26 编辑

为节约版面和看官的阅读时间,贴一下主函数和清屏函数部分,主要可关注一下,预编译部分,和以16色清屏的代码: (详细可见工程文件包中源文件)

//主函数
void main(void)
{ u16 i;
   SYS_Init();         //系统初始化
   //液晶屏初始化
#if (USE_LCM==1)
   LCM_Config();    //LCM模式初始化
#endif
#if (USE_LCM==1)
   DMA_Config();   //DMA模式初始化
#endif
  Timer0_Init();    //定时器0初始化
  EA=1;
  LCD_Init();
//LCD_SetDIR(0);       //原显示方向(纵向屏)
  LCD_SetDIR(3);       //调整显示方向(横屏)
  while(1)
  { for(i=0;i<16;i++)
    { DelayNms=0;                         //计数器复0  
      LCD_CLS((u8)i);                      //测试单色清屏
      sprintf(S," Time %04d ms ",DelayNms);
      LCD_Str16(20,20,S,15,0);         //显示清屏用时ms

      sprintf(S," Color %02d RGB=%04X ",i,COLOR);
     if(USE_LCM)strcat(S,"+LCM ");  //加入LCM模式
      if(USE_DMA)strcat(S,"+DMA "); //加入DMA模式
      LCD_Str16(20,40,S,15,0);         //显示字符串..
      delay_ms(1000);
    }
    LCD_CLS(1);                             //清屏(蓝色)
    for(i=0;i<32;i++){ LCD_Box(i*10,215,10,20,15,15,(u8)i); } //32色号定义
    for(i=0;i<20;i++)LCD_Line(5,5,315,5+i*10,13);      //任意两点一线
    for(i=0;i<20;i++)LCD_Line(315,5,5,5+i*10,13);      //任意两点一线
    delay_ms(1000);                       //延时1s
    for(i=0;i<11;i++)
    { LCD_LineH(5,5+i*20,310,10);  //画水平线
      LCD_LineV(5+i*31,5,200,10);  //画垂直线
    }
    delay_ms(2000);
    MainMenu();                            //图标彩色显示+中西文混合字符串+下拉主菜单演示
    delay_ms(3000);                      //延时3s  
    //画示波器背景底图...
    LCD_CLS(0);                            //清屏(黑色)
    LCD_BoxF(10,0,50,18,3,3);       //画圆角填色矩形
    LCD_BoxF(65,0,40,18,3,4);
    LCD_BoxF(110,0,68,18,3,7);
    LCD_A16(20,2,'A',15,3);           //显示单字符   
    LCD_A16(28,2,'U',15,3);           //青底白字
    LCD_A16(36,2,'T',15,3);
    LCD_A16(44,2,'O',15,3);
    LCD_A16(72,2,'A',14,4);           //显示单字符
    LCD_A16(80,2,'B',14,4);           //红底黄字
    LCD_A16(88,2,'C',14,4);
    LCD_Str16(120,2,"STC32G",0,7);                                //显示字符串
    LCD_Str16(195,0,"8*16_ASCII_ABC",10,0);                 //显示16点阵字符串
    LCD_Str8(10,226,"6*8_ASCII_ABCD",11,0);                 //显示8点阵字符串
    for(i=0;i<7;i++)LCD_LineH0(10,45+25*i,301,5,10,0);  //画7条水平虚线
    for(i=0;i<11;i++)LCD_LineV0(35+25*i,20,200,5,10,0); //画11条垂直虚线  
    LCD_LineH0(10,45+25*3-1,301,5,10,0);                      //画一水平虚线
    LCD_LineH0(10,45+25*3+1,301,5,10,0);
    LCD_LineV0(35+25*5-1,20,200,5,10,0);                      //画一垂直虚线
    LCD_LineV0(35+25*5+1,20,200,5,10,0);
    LCD_Box0(9,20,301,200,0,15);     //空心方框
    LCD_A08(  2,116,126,10,1);         //小箭头
    LCD_A08(312,116,127,10,1);       //小箭头
    delay_ms(1000);                        //延时1s
    n=0;y0=SIN[n++];
    for(i=0;i<150;i++)
    {
      y1=SIN[n];
      LCD_Line(10+i*2,y0,10+i*2+3,y1,14); //画11条垂直虚线
      y0=y1;
      n=n<49?n+1:0;
    }
     delay_ms(3000);                //延时3s
     //循环进行各项测试        
  }   
}


再贴一下LCD9341.C文件中的清屏函数代码:比较使用DMA和不用DMA的不同方式代码...
//清屏函数

void LCD_CLS(u8 Color)
{ u16 i,j;
  LCD_SetWindow(0,0,LCD_W-1,LCD_H-1);  
#if (USE_DMA==1)           //若使用DMA方式
  for(j=0,i=0;i<=DMA_AMT_LEN;i++)LCD_Buf = COLOR[Color];    //先向缓存区填颜色字
  DMA_TxCount = 75;       //确定发送次数: (320 * 240 * 2) / 2048 = 75 总字节数/缓存区大小=循环次数
  LCD_CS=0;                    //片选中,让DMA向显示屏发送数据...
  DMA_LCM_CR = 0xA0;    //(Write dat 写数据) 使能LCM_DMA / 启动发送数据模式操作 / 引发中断
  while(!LCD_CS);             //等待中断操作完成... 在中断服务程序中翻转片选。
#else
  for(i=0;i<LCD_W;i++)
  { for (j=0;j<LCD_H;j++)
    { LCD_WR_DAT_16Bit(COLOR[Color]); }
  }
#endif  
}




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2025-05-02 16:43:36
已绑定手机

6

主题

285

回帖

885

积分

荣誉版主

积分
885
发表于 2024-8-29 00:04:58 | 显示全部楼层
好文!我也在关注提高TFT的刷屏速度,替代其他MCU的方法。。

14
(仅供参考,欢迎探讨)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:503
  • 最近打卡:2025-05-02 08:06:55
已绑定手机

1

主题

834

回帖

1447

积分

金牌会员

积分
1447
发表于 2024-8-29 08:11:20 | 显示全部楼层
收藏学习,新入手一块40pin接口的屏幕,尝试点亮中
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2025-05-02 09:16:59

30

主题

347

回帖

3480

积分

荣誉版主

积分
3480
发表于 2024-8-29 20:01:38 | 显示全部楼层
感谢 神农鼎 管理员的鲜花鼓励。

感谢 autopccopy 版主的鲜花鼓励。

感谢  芯征程  版主的鲜花鼓励。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2024-8-29 20:40:50 | 显示全部楼层
用 DMA 解放 CPU, 让 CPU 去干更重要的事
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2025-05-02 09:16:59

30

主题

347

回帖

3480

积分

荣誉版主

积分
3480
发表于 2024-8-30 10:10:38 | 显示全部楼层
本帖最后由 浦江一水 于 2024-8-31 20:25 编辑
神*** 发表于 2024-8-29 20:40
用 DMA 解放 CPU, 让 CPU 去干更重要的事

神管所言极是!  共同心声,学用DMA的初衷就是要"解放CPU,让CPU去干更重要的事".

只是目前所看到的Demo “76-1.3寸TFT240x240彩屏演示程序-SPI-DMA刷屏” 代码中:


/******************************************************************************
      函数说明:显示图片
      入口数据:x,y起点坐标
                length 图片长度
                width  图片宽度
                pic[]  图片数组
      返回值:  无
******************************************************************************/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width, u8 xdata *pic)
{
  LCD_Address_Set(x,y,x+length-1,y+width-1);
  SPI_DMA_TRIG(pic);        //触发SPI DAM发送一个图片
  while(B_SPI_DMA_busy);  //等待图片发送完毕
}


触发了DMA传输,还要等待DMA发送完毕, CPU在此敢不等待而做其它事? 是否还是占用了CPU时间?
有待进一步学习研究, 充分发挥DMA的潜力作用.
特别是利用DMA非等待地发送适合屏幕大小的图片......

征程尚远,待努力前行......

点评

[attachimg]63255[/attachimg] 38ms,DMA-i8080并口 8位刷TFT320*240彩屏@ILI9341, AI8051U 实验箱 - TFT/LCD12864/LCD1602/红外遥控 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)  详情 回复 发表于 2024-11-10 09:15
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-9-8 22:49:25 | 显示全部楼层
本帖最后由 tzz1983 于 2024-9-8 22:50 编辑

这个屏下面的转接板是自己做的吗,还是现成买来就能匹配实验箱的?
我一直有点好奇,实验箱上那那个TFT接口到底是匹配哪家屏的呢,
如果要用杜邦线来连那太麻烦了些,
这个高效的社会,花这个精力,还不如花几块钱买个现成的节约时间
今天在尝度用AI8051U解析BMP文件数据, 突然间发现,我没地方显示,哈哈,

看了一下调试访真接口 VOLED, 结果发现是二值的, 即没有彩色和灰度.
用来显示位图效果大打折扣啊, 还是有个现成接口的TFT好,
同时也期待STC 的调试仿真接口能来个TFT模拟接口

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2025-05-02 09:16:59

30

主题

347

回帖

3480

积分

荣誉版主

积分
3480
发表于 2024-9-9 07:37:22 | 显示全部楼层
tzz1*** 发表于 2024-9-8 22:49
这个屏下面的转接板是自己做的吗,还是现成买来就能匹配实验箱的?
我一直有点好奇,实验箱上那那个TFT接口到 ...

谢谢浏览和留言.
这个屏是现成买来就匹配实验箱的, 不需要用杜邦线来连, 使用很方便.
2.4寸TFT彩屏,分辨率320*240,原用于Arduino, 某宝上一搜索便知晓了.

点评

发个链接我看看  详情 回复 发表于 2024-9-9 07:45
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-9-9 07:45:12 | 显示全部楼层
浦江*** 发表于 2024-9-9 07:37
谢谢浏览和留言.
这个屏是现成买来就匹配实验箱的, 不需要用杜邦线来连, 使用很方便.
2.4寸TFT彩屏,分辨 ...

发个链接我看看
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:32 , Processed in 0.195880 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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