打印
[STM32F4]

DMA2D填充的奇怪问题

[复制链接]
1307|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huwr|  楼主 | 2021-9-12 12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DMA, CD, LCD, ADDR, ev, pi
发现连续使用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;                                //清除传输完成标志         
}

使用特权

评论回复
沙发
jiajs| | 2021-9-12 12:08 | 只看该作者

这方面不熟帮不了你,支持下;

使用特权

评论回复
板凳
jiajs| | 2021-9-12 12:15 | 只看该作者
看着像timeout了,这个值应该根据时钟、像素数计算,或者不用timeout直接死循环判断完成标志。

使用特权

评论回复
地板
huwr|  楼主 | 2021-9-12 12:17 | 只看该作者
设置了中断,发现都是正常的,没有超时。

使用特权

评论回复
5
stly| | 2021-9-12 12:19 | 只看该作者
有没有错误标志位?光从代码上不好看出问题所在

使用特权

评论回复
6
supernan| | 2021-9-12 12:20 | 只看该作者
确实比较奇怪,尝试着定位不正常的时候,是卡在哪条语句上。

使用特权

评论回复
7
huwr|  楼主 | 2021-9-12 12:22 | 只看该作者
没法定位,如果单步执行就OK了,全速就不行

使用特权

评论回复
8
stly| | 2021-9-12 12:25 | 只看该作者
把延时分别加在每一条语句后面,看看哪句不加就不可以运行了,然后定位寄存器。

使用特权

评论回复
9
yszong| | 2021-9-12 12:27 | 只看该作者
会不会跟你代码顺序有关, 你是这个顺序吗?

使用特权

评论回复
10
juventus9554| | 2021-9-12 12:29 | 只看该作者
方可2填充在前 方可2填充在后?

使用特权

评论回复
11
dengdc| | 2021-9-12 12:31 | 只看该作者
如果是这样就可能出现你说的问题。

使用特权

评论回复
12
gongche| | 2021-9-12 12:33 | 只看该作者
DMA刚开始跑,程序代码接着这些,将DMA2D重新初始化又跑新的DMA2D填充了。

使用特权

评论回复
13
chuxh| | 2021-9-12 12:35 | 只看该作者
看起来像是LCD在数据传输完成后需要一小段时间进行转换数据,这时候它无法解析你在后面发出的LCD位置信息,导致你后面的操作失败

使用特权

评论回复
14
llljh| | 2021-9-12 12:41 | 只看该作者
似乎你可以查看LCD的某个状态位来确认LCD是否能接受操作指令

使用特权

评论回复
15
huwr|  楼主 | 2021-9-12 12:43 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
16
labasi| | 2021-10-8 17:17 | 只看该作者
会不会不小心擦掉了

使用特权

评论回复
17
guanjiaer| | 2021-10-9 07:56 | 只看该作者
有点延时也没什么吧

使用特权

评论回复
18
heimaojingzhang| | 2021-10-9 07:56 | 只看该作者
太快了 是不是io口反应不过来啊

使用特权

评论回复
19
keaibukelian| | 2021-10-9 07:57 | 只看该作者
是哪个状态位呢

使用特权

评论回复
20
paotangsan| | 2021-10-9 07:59 | 只看该作者
大概需要做多长时间的延时呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

780

主题

8627

帖子

5

粉丝