使用SPI-DMA+LCM-DMA方式显示320*240的图片需要多长时间
使用STC32G12K128单片机,设置35M,采用SPI-DMA+LCM-DMA双缓冲方式显示320*240的图片,模拟播放一段小视屏,明显卡顿,做个时间延时,大概一张图片显示需要250MS,这个时间还有没有提升的空间呢?延时改成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; //重新开始计数
}
}
}
视频1和2分别是使用DMA和不使用时播放的效果,感觉效果差不多,并没有体现出来使用DMA的优势 yanhui 发表于 2023-11-14 16:31
视频1和2分别是使用DMA和不使用时播放的效果,感觉效果差不多,并没有体现出来使用DMA的优势 ...
DMA的优势在于使用硬件自动传输数据,释放CPU资源。
想要加快刷新速度,要提高接口的时钟频率。 设置过的了 这个算法是解放 CPU去做其他事
两张图片之间的那个延时间隔CPU可以做其他操作,这个8位并口TFT彩屏,就没法播放视屏了对吗?这个播放速度有没有老师能给出具体参数呢?或者有没有好的方法能实现彩屏的视屏播放效果? 我用的是KMPlayer播放视频,捕获成你要的图片格式,再用Image2Lcd批量转换成150K单个的BIN文件,最后将这些BIN文件合并成一个BIN文件烧录到25Q64中,程序中再通过用SPI-DMA方式读取25Q64对应的每个图片,用LCM-DMA方式实现对应图片的显示,读取显示速度够快,视觉看起来就能连续播放。目前这个刷新图片速度达到了效果,但是视频还不够理想,速度限制在于读取25Q64这里,当然用OLED12864显示灰度图片的话,8H8K64就可以实现视频级的播放。 后面的 STC8051H, STC32G96K256, 都有 QSPI读FLASH,
支持 QSPI -DMA 直通 TFT320240 接口
支持 QSPI -DMA 直通 TFT480320 接口
STC8051H,2024/6/1 后回来
页:
[1]
2