您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]PPI双显存控制疑问
本帖共有3728个阅读者
发表帖子 发表投票 回复主题
[求助]PPI双显存控制疑问
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]PPI双显存控制疑问
你好,我在程序中为PPI做了两个显存A和B。请问在切换时,是不是直接修改pDMA0_START_ADDR指向的地址,即*pDMA0_START_ADDR = A;或*pDMA0_START_ADDR = B;我这么做后一切换就出错了。请问在切换显存时,要进行怎样的一个步骤呢?谢谢!

「该帖子被 pigy 在 2012-12-19 09:57:15 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/18 16:43:59
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你需要先关闭DMA,切换后再重新使能DMA


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/12/18 19:48:53
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
andy你好,我试了你说的方法,但是一切换显示就不正常了。会出现偏移现象!
这时我的处理方法:
假设有两个显存A和B
当显示内容更新到A时,进行如入处理显示
*pDMA0_CONFIG &= (~DMAEN);     /* 禁止DMA0 */
*pDMA0_START_ADDR   = A;
*pDMA0_CONFIG |= DMAEN;        /* 使能DMA0 */
当显示内容更新到B时,进行如入处理显示
*pDMA0_CONFIG &= (~DMAEN);     /* 禁止DMA0 */
*pDMA0_START_ADDR   = B;
*pDMA0_CONFIG |= DMAEN;        /* 使能DMA0 */

这样对不?

如果在切换时加入关PPI,就可以显示正常,不会出现偏移。但是屏幕有明显的闪动现象!这是为什么呢?
*pPPI_CONTROL |= PORT_EN;     /*使能PPI*/
*pDMA0_CONFIG &= (~DMAEN);    /* 禁止DMA0 */
*pDMA0_START_ADDR   = A;
*pDMA0_CONFIG |= DMAEN;       /* 使能DMA0 */
*pPPI_CONTROL &= (~PORT_EN);  /*禁止PPI*/


「该帖子被 pigy 在 2012-12-19 11:52:52 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/19 11:48:50
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你的PPI使能和关闭位置反了,加入PPI应该是不会抖动的,最好在使能PPI和DMA之后加入ssync()指令同步。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/12/19 15:01:56
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢andy,之前打错了。实际是先关掉PPI和DMA,切换显存后再开PPI和DMA的。但是切换有明显的抖动现象(就是刚切换时,屏会小闪一下,这是不是开关PPI的原因呢?)!不知是为什么?加了指令同步还是一样。请问下andy在做切换也是只修改这几个寄存器的值么?还有什么要注意的地方么?对应的HSYNC和VSYNC时钟用不用先关闭?
*pPPI_CONTROL &= (~PORT_EN);          /*禁止PPI*/
*pDMA0_CONFIG &= (~DMAEN);    /* 禁止DMA0 */
*pDMA0_START_ADDR   = A;
*pDMA0_CONFIG |= DMAEN;         /* 使能DMA0 */
*pPPI_CONTROL |= PORT_EN;               /*使能PPI*/
asm(" ssync;")



「该帖子被 pigy 在 2012-12-20 13:36:16 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/19 16:20:30
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如下是我程序的大体流程:不知这样的双显存切换有没有什么问题呢?我按这个流程写完程序后,来回按按键WAVE_KEY和PARA_KEY切换显示画面,有明显的闪烁感(就是刚切换那会儿)。自已老是找不出原因来。在切换中开关PPI是不是会有影响?但是不开关PPI,只开关DMA,显示会出现偏移。请坛主指点下!万分感谢!

void gui_draw_point(INT16S x, INT16S y, INT32U color)
{
    if (0 == tft_ctrl.bits.write)
    {
        //写入A
        tft_bufferA[y][3 * x]     = (color >> 16) & 0xFF;     /* R */
        tft_bufferA[y][3 * x + 1] = (color >> 8) & 0xFF;      /* G */
        tft_bufferA[y][3 * x + 2] = (color) & 0xFF;           /* B */
    }
    else
    {
        //写入B
        tft_bufferB[y][3 * x]     = (color >> 16) & 0xFF;     /* R */
        tft_bufferB[y][3 * x + 1] = (color >> 8) & 0xFF;      /* G */
        tft_bufferB[y][3 * x + 2] = (color) & 0xFF;           /* B */  
    }
}

void write_change(void)
{
    static INT32S i = 0;

    if (1 == tft_ctrl.bits.disp)
    {
        uart_printf("当前显示A\n");
    }
    else
    {
        uart_printf("当前显示B\n");
    }
    
    if (i++ % 2)
    {
        uart_printf("写入A\n");
        tft_ctrl.bits.write = 0;
        tft_ctrl.bits.disp  = 1;
    }
    else
    {        
        uart_printf("写入B\n");
        tft_ctrl.bits.write = 1;
        tft_ctrl.bits.disp  = 0;
    }
}

void disp_change(void)
{
    if (1 == tft_ctrl.bits.disp)
    {
        uart_printf("显示A\n");
        
        *pDMA0_CONFIG &= (INT16U)(~DMAEN);     /* 禁止DMA0 */
        asm("ssync;");
        *pPPI_CONTROL &= (INT16U)(~PORT_EN);   /* 禁止PPI */
        asm("ssync;");

        /* 更改显示缓冲 */
        *pDMA0_START_ADDR   = tft_bufferA[0];  
      
        *pDMA0_CONFIG |= (INT16U)DMAEN;     /* 使能DMA0 */
        asm("ssync;");      
        *pPPI_CONTROL |= (INT16U)PORT_EN;   /* 使能PPI */
        asm("ssync;");
    }
    else
    {
        uart_printf("显示B\n");
        
        *pDMA0_CONFIG &= (INT16U)(~DMAEN);     /* 禁止DMA0 */
        asm("ssync;");
        *pPPI_CONTROL &= (INT16U)(~PORT_EN);   /* 禁止PPI */
        asm("ssync;");

        /* 更改显示缓冲 */        
        *pDMA0_START_ADDR   = tft_bufferB[0];
        
        *pDMA0_CONFIG |= (INT16U)DMAEN;     /* 使能DMA0 */
        asm("ssync;");      
        *pPPI_CONTROL |= (INT16U)PORT_EN;   /* 使能PPI */
        asm("ssync;");
    }
}

void main(void)
{
    char   key_val;
    
    tft_ctrl.bits.write = 0;
    tft_ctrl.bits.disp  = 1;
    init();    
    
    while(1)
    {
        key_val = key_parse();
        
        switch ( key_val )
        {
            case WAVE_KEY:
                write_change();
                //写显示内容(最终调用gui_draw_point打点函数)
                disp_change();
            break;
            case PARA_KEY:
                write_change();
                //写显示内容(最终调用gui_draw_point打点函数)
                disp_change();
            break;
        }
    }
}

以下是通过串口显示出来的相关信息:
当前显示A(按下按键)
写入B
显示B
当前显示B(按下按键)
写入A
显示A
当前显示A(按下按键)
写入B
显示B
当前显示B(按下按键)
写入A
显示A
当前显示A(按下按键)
写入B
显示B
当前显示B(按下按键)
写入A
显示A
当前显示A(按下按键)
写入B
显示B





「该帖子被 pigy 在 2012-12-20 19:49:01 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/20 19:44:07
虫_飞(论坛新手)
虫_飞
头衔:社区公民
帮派:无帮无派
帖数:11
金钱:185
积分:13
注册时间:2012/12/24
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
好像重新使能DMA就可以了吧

void disp_change(void)
{
    if (1 == tft_ctrl.bits.disp)
    {
        uart_printf("显示A\n");
        
        /* 更改显示缓冲 */
        *pDMA0_START_ADDR   = tft_bufferA[0];  
        asm("ssync;");  
        *pDMA0_CONFIG |= (INT16U)DMAEN;     /* 使能DMA0 */
        asm("ssync;");
    }
    else
    {
        uart_printf("显示B\n");
        
        /* 更改显示缓冲 */        
        *pDMA0_START_ADDR   = tft_bufferB[0];
        asm("ssync;");
        *pDMA0_CONFIG |= (INT16U)DMAEN;     /* 使能DMA0 */
        asm("ssync;");
    }
}

@找个天使替我去爱你~
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/25 10:02:50
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢!虫_飞的回答。但是试了一下不行!还是会出现显示偏移的问题。每按一次按键偏移程序都不一样的。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/25 14:06:55
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

图像偏移,通常是DMA通道堵塞造成的,你降低速度,减少EBIU对内存的操作,将EBIU全局控制寄存器中的DMA优先于核打开。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/12/26 10:57:17
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
andy你好,我想问下PPI刷显示不是用的是EBIU的SDRAM控制制器么(显存建于SDRAM空间上)?我看手册,你说的DMA优先级是在异步控制器中的。还有双缓冲切换时,正常操作到底用不用先关PPI呢?
上传的图片
  2012122614573762.jpg [ 27.11 KB 545×288 ] (缩略时请点击查看原图)

 


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/26 15:00:47
24
1
1/3
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159294 Call, 1 Queries, Processed in 0.031250 second(s),