OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4121|回复: 4

求助:DMA2D填充的奇怪问题

[复制链接]

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
发表于 2018-3-24 08:48:35 | 显示全部楼层 |阅读模式
1金钱
发现连续使用LCD_Color_Fill函数填充两个色块,单步调试模式时没有问题,全速时只能显示第一个色块,第二个就是不显示,如果将两次填充之间做点延时,显示就正常了,请指教,多谢!

//LTDC填充矩形,DMA2D填充
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为ex-sx+1)*(ey-sy+1)   
//注意:sx,ex,不能大于lcddev.width-1;sy,ey,不能大于lcddev.height-1!!!
//color:要填充的颜色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color, u8 inLCD_PIXFORMAT)
{
        u32 timeout=0;
        u16 offline;
        u32 addr;

        offline=LCD_PIXEL_WIDTH-(ex-sx+1);
    //指定绘制的首地址
    addr = CurrentFrameBuffer+2*(800*sy+sx);

        RCC->AHB1ENR|=1<<23;                        //使能DM2D时钟
        DMA2D->CR&=~(1<<0);                                //先停止DMA2D
        DMA2D->CR=3<<16;                                //寄存器到存储器模式
        DMA2D->OPFCCR=inLCD_PIXFORMAT;        //设置颜色格式
        DMA2D->OOR=offline;                                //设置行偏移
        DMA2D->OMAR=addr;                                //输出存储器地址
        DMA2D->NLR=(ey-sy+1)|((ex-sx+1)<<16);        //设定行数寄存器
        DMA2D->OCOLR=color;                                //设定输出颜色寄存器
        DMA2D->CR|=1<<0;                                //启动DMA2D
        while((DMA2D->ISR&(1<<1))==0)        //等待传输完成
        {
                timeout++;
                if(timeout>0X1FFFFF)
            break;        //超时退出
        }  
        DMA2D->IFCR|=1<<1;                                //清除传输完成标志        
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-3-25 01:45:43 | 显示全部楼层
要不就一起填充得了。要不就按你说的,加延时。
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-3-29
在线时间
22 小时
发表于 2018-9-18 17:28:07 | 显示全部楼层
楼主,能分享下你的整个程序,我卡住在显示了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-18 17:41:29 | 显示全部楼层
不知道你的是什么样LCD, 但我之前改了OLD的驱动方法,用DMA也有类似的问题, 最后找到的原因是DMA发送完最后一个Command后就跳到发数据的函数, 然后D/C的控制线就被转为D, 而实际这时只是DMA搬完最后一个Command到SPI_DR, 但SPI还没完全把最后一个数据发送完毕, 这时候的DC控制线转为D就会让OLED接收错误, 之后改为在DMA完成后Delay_2us后才跳到下一个函数, 问题就解决了
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-4-13
在线时间
9 小时
发表于 2020-5-14 20:22:02 | 显示全部楼层
    DMA2D 是DMA方式,不加延时,岂不是 重新配置了??? 或者 lock了, 第二个就忽略了。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表