yanhui 发表于 2023-11-14 16:20:39

使用SPI-DMA+LCM-DMA方式显示320*240的图片需要多长时间

使用STC32G12K128单片机,设置35M,采用SPI-DMA+LCM-DMA双缓冲方式显示320*240的图片,模拟播放一段小视屏,明显卡顿,做个时间延时,大概一张图片显示需要250MS,这个时间还有没有提升的空间呢?

yanhui 发表于 2023-11-14 16:24:40

延时改成200MS时播放的就不连贯了。

相关代码:

void LCD_ShowPicture_dma(uint16 x)                //SPI_DMA,LCM_DMA方式显示图片
{
        uint32 pic_add=picture_addr+x*153600;   // 从GD25Q64的这个地址开始读取图片
        TFT_CS= 0;        //选择TFT
        GD25Q64_Readdma(pic_add);        //开启SPI_DMA主模式操作读GD25Q64,开始第一次(0)读取到缓冲区1
//        while(!GD25Q64_CS);        //等待读取一次完成,阻塞机制
}

void common_isr(void) interrupt13        //DMA_LCM和DMA_SPI中断
{
        if(DMA_LCM_STA & 0x01)        //进入DMA_LCM
    {
                        DMA_LCM_STA= 0;
      if(stage >= Index)                //150K图片传送完毕
                        {
                                TFT_CS=1;
                        }
    }
        if(DMA_SPI_STA & 0x01)        //进入DMA_SPI
    {
                        DMA_SPI_STA= 0;
      if(!(stage & 1))        //偶数次
                                {
                                        DMA_LCM_TXAL= (uint8)((uint16)&DmaBuffer1);        //缓冲区1开始发送
                                        DMA_LCM_TXAH= (uint8)((uint16)&DmaBuffer1>>8);
                                        DMA_LCM_CR= 0xa1; //启动DMA开始发送数据
                                }
                        else        //奇数次
                                {
                                        DMA_LCM_TXAL= (uint8)((uint16)&DmaBuffer2);        //缓冲区2开始发送   
                                        DMA_LCM_TXAH= (uint8)((uint16)&DmaBuffer2>>8);
                                        DMA_LCM_CR= 0xa1;        //启动DMA开始发送数据
                                }
                        if(stage <Index)
       {
                                if(!(stage & 1))        //偶数次
                                        {
                                                DMA_SPI_RXAL= (uint8)((uint16)&DmaBuffer2);        //发送到缓冲区2         
            DMA_SPI_RXAH= (uint8)((uint16)&DmaBuffer2>>8);
            DMA_SPI_CR= 0xc1;        //启动DMA开始接收数据
          }
         else        //奇数次
                                        {
                                                DMA_SPI_RXAL= (uint8)((uint16)&DmaBuffer1);        //发送到缓冲区1         
            DMA_SPI_RXAH= (uint8)((uint16)&DmaBuffer1>>8);
            DMA_SPI_CR= 0xc1;        //启动DMA开始接收数据
          }
      stage++;
         }
       else
                       {
                               GD25Q64_CS= 1;        //150K图片数据读取完毕
                               stage=0;        //重新开始计数
                       }
   }
}

yanhui 发表于 2023-11-14 16:31:54

视频1和2分别是使用DMA和不使用时播放的效果,感觉效果差不多,并没有体现出来使用DMA的优势

乘风飞扬 发表于 2023-11-14 18:00:38

yanhui 发表于 2023-11-14 16:31
视频1和2分别是使用DMA和不使用时播放的效果,感觉效果差不多,并没有体现出来使用DMA的优势 ...

DMA的优势在于使用硬件自动传输数据,释放CPU资源。
想要加快刷新速度,要提高接口的时钟频率。

yanhui 发表于 2023-11-14 18:10:11

设置过的了

神农鼎 发表于 2023-11-14 18:38:42

这个算法是解放 CPU去做其他事




yanhui 发表于 2023-11-15 08:35:51

两张图片之间的那个延时间隔CPU可以做其他操作,这个8位并口TFT彩屏,就没法播放视屏了对吗?这个播放速度有没有老师能给出具体参数呢?或者有没有好的方法能实现彩屏的视屏播放效果?

WangChong 发表于 2023-11-15 09:22:25

yanhui 发表于 2023-11-15 09:52:19

我用的是KMPlayer播放视频,捕获成你要的图片格式,再用Image2Lcd批量转换成150K单个的BIN文件,最后将这些BIN文件合并成一个BIN文件烧录到25Q64中,程序中再通过用SPI-DMA方式读取25Q64对应的每个图片,用LCM-DMA方式实现对应图片的显示,读取显示速度够快,视觉看起来就能连续播放。目前这个刷新图片速度达到了效果,但是视频还不够理想,速度限制在于读取25Q64这里,当然用OLED12864显示灰度图片的话,8H8K64就可以实现视频级的播放。

神农鼎 发表于 2023-11-16 07:40:40

后面的 STC8051H, STC32G96K256, 都有 QSPI读FLASH,
支持 QSPI -DMA 直通 TFT320240 接口
支持 QSPI -DMA 直通 TFT480320 接口

STC8051H,2024/6/1 后回来


页: [1] 2
查看完整版本: 使用SPI-DMA+LCM-DMA方式显示320*240的图片需要多长时间