*pPPI_COUNT = 200*(240+85) - 1;
*pDMA0_X_MODIFY = 2;
*pDMA0_X_COUNT =200*(240+85);//
85是水平消隐的时钟数,200行是因为*pDMA0_X_COUNT是16位的,再大会溢出,这85个数据是无用的数据,程序中依次设置好Timer1,PPI,DMA0(一维DMA),然后依次启动DMA0,PPI,Timer1。能正确显示一个200行的“犹抱琵琶半遮面”的李嘉欣。
改为2维DMA设置:
*pPPI_COUNT = 160*(240+85) - 1;
*pDMA0_X_MODIFY = 2;
*pDMA0_X_COUNT = 160*HLINE;//
*pDMA0_Y_MODIFY = 2;
*pDMA0_Y_COUNT = 2;
我将整个图像分为上下半帧传送,显示的结果为上下半帧重叠闪烁在上半帧显示,下半帧也闪烁无显示(出现随机的一个颜色)。
再次改为如下2维DMA设置:
*pPPI_COUNT =(240+85) - 1;
*pDMA0_X_MODIFY = 2;
*pDMA0_X_COUNT = HLINE;//
*pDMA0_Y_MODIFY = 2;
*pDMA0_Y_COUNT = 320;
只有第一行有图像变换,其他行轮换显示统一颜色。
曾经这样设置过,设置X方向传输160行一维DMA,启动中断,在中断中重新设置DMA,将DMA的START_ADDR指向下半帧起始处,再启动DMA,但只有上部显示正常,下半帧还是无显示,后来看资料也说无同步信号DMA不会启动。
现在实在没有办法了,在此请各位高手不吝赐教,我的问题出在哪里,如何设置2维DMA。
-------------------------------------------------------------------------------------------------
原因总算在昨天找到了,那就是半帧传输完后,也就是2D DMA的内部循环结束后,开始外部循环,但外部循环没有工作,原因是没有同步信号,原来每次的DMA传输要有同步信号启动,手册里也没有说。于是改程序,将内部同步改为外部同步,同步信号在每帧起始处即半帧处增加一个同步,但CPLD程序一直不能工作,最后用了一个效率较低的办法,用内部同步,将PPI_FS1(TIMER1)的周期改为原来的一半,这样一帧中就能产生两个同步头,但是上半帧为160行,下半帧的160行结束后还要有16行的垂直消隐,只能开启PPI中断,在半帧结束后的中断判断上下半帧,修改TIMER1的PERIOD为相应的长度,多增加了一个周期7.7ms左右的中断程序。问题解决。