20100924:
最后验证的结果,应该是和内存速度相关,测试如下:
//内存读写数据测试
void MemTimeTst(void)
{
#if 24BPP
unsigned int *addr=(unsigned int *)(LCD_BUFFER);
#else
//16BPP
unsigned short *addr=(unsigned short *)(LCD_BUFFER);
#endif
unsigned int i,j,k,m;
//屏分辨率
m=(SCR_XSIZE*LCD_YSIZE);
rGPGCON=(rGPGCON & (~(0x3<<10)))|(1<<10);
//IO口输出高电平
rGPGDAT=rGPGDAT | (1<<5);
//输出低电平,此时就可以抓到下降沿了
rGPGDAT=rGPGDAT & ~(1<<5);
for(i=0;i<m;i++)
{
*(addr+i)=*(addr+i+1);
}
//拉高,测量低电平时间
rGPGDAT=rGPGDAT | (1<<5);
}
16BPP写内存时间8ms,对应的24BPP时间15ms
void LCDDMATimeTst(void)
{
//(rLCDCON1>>18)为DMA输出LCD数据的行指针,只读,为countdown
while((rLCDCON1>>18)!=271)
{}
rGPGCON=(rGPGCON & (~(0x3<<10)))|(1<<10);
rGPGDAT=rGPGDAT | (1<<5);
rGPGDAT=rGPGDAT & ~(1<<5);
//等待DMA从271传输到0行
while((rLCDCON1>>18)!=0)
{}
rGPGDAT=rGPGDAT | (1<<5);
}
输出271行,DMA时间17->18ms左右(基于不同的HCLK和CLKVAL时间会不同,只是测试一下16BPP和24BPP差异),16BPP和24BPP无明显区别
以上,时间用示波器测量IO端口的高低电平来测量时间
一般,人眼可以感觉到的闪烁为60HZ,约1000/60ms=16.7ms,24BPP直接写一帧的时间基本就已经达到了60HZ,再做一下其他判断,则输出来的画面会缓慢
总结:16BPP->24BPP,写内存时间增加接近1倍左右,而DMA时间没变,所以直接写屏也会较16BPP闪烁;从16BPP->24BPP DMA时间可以变得更大或更小,而写内存时间是改变不了的
之所以会出现这种状况,可能是由于驱动中是用NOCACHE,对应的写内存速度不是受CPU限制而是受SDRAM限制,SDRAM目前最高速度好像是133M,而不是CPU的400M。而且写数据一般是从内存的一个地方读取出来保存到LCD buffer对应的内存中,需多个指令周期完成