野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14551|回复: 6

F429的LTDC显示动画时,出现闪屏现象

[复制链接]
发表于 2016-12-10 11:35:11 | 显示全部楼层 |阅读模式
修改19-LTDC—液晶显示英文(字库在内部FLASH)代码,实行双缓冲绘图。
画了一个圆,每次走一步。本来想加入的双缓冲原理,应该可以解决;还是出现闪屏现象,虽然有一点改善。仿真运行后,才知道LTDC->SRCR->LTDC_SRCR_VBR无法置1。无论调用固件库函数,还直接寄存器置1;都不行。代码如下:

//画圆函数
void LCD_Test(void)
{
        LTDC_PosTypeDef ltdcPos;
        static unsigned int x=100, y=100;
        unsigned int status;
       
        LCD_SetLayer(LCD_FOREGROUND_LAYER);  
  LCD_SetTransparency(0xff);
       
  LCD_Clear(LCD_COLOR_BLACK);        /* ÇåÆᣬÏÔê¾è«oú */       


        LCD_SetColors(LCD_COLOR_RED,LCD_COLOR_BLACK);
  LCD_DrawFullCircle(x,y,50);
       
        //LCD_SetColors(LCD_COLOR_GREEN,LCD_COLOR_BLACK);
// LCD_DrawFullCircle(450,350,75);
        status = LTDC->SRCR;
        SwapBuffer();

        x++;
        y++;
        if (x >= LCD_PIXEL_WIDTH)
                x=0;
        if (y>=LCD_PIXEL_HEIGHT)
                y = 0;
  Delay(0x2FFFF);
}

//双缓冲函数
#define LCD_BACKGROUND1_BUFFER                                  (LCD_FRAME_BUFFER)
#define LCD_FOREGROUND1_BUFFER                                         (LCD_BACKGROUND1_BUFFER + BUFFER_OFFSET)
#define LCD_BACKGROUND2_BUFFER                                  (LCD_FOREGROUND1_BUFFER + BUFFER_OFFSET)
#define LCD_FOREGROUND2_BUFFER                                  (LCD_BACKGROUND2_BUFFER + BUFFER_OFFSET)
#define LCD_DMD2D_FOREGROUND_BUFFER                  (LCD_FOREGROUND2_BUFFER + BUFFER_OFFSET)
#define LCD_DMD2D_BACKGROUND_BUFFER                  (LCD_DMD2D_FOREGROUND_BUFFER + BUFFER_OFFSET)


void SwapBuffer(void)
{
        switch(currentFrame) {
                case FRAME1:
                        if (CurrentFrameBuffer == LCD_FOREGROUND1_BUFFER) {
                                CurrentFrameBuffer = LCD_FOREGROUND2_BUFFER;
                        }
                        else if (CurrentFrameBuffer == LCD_BACKGROUND1_BUFFER) {
                                CurrentFrameBuffer = LCD_BACKGROUND2_BUFFER;
                        }                       
                        LTDC_LayerAddress(LTDC_Layer1, LCD_BACKGROUND1_BUFFER);
                        LTDC_LayerAddress(LTDC_Layer2, LCD_FOREGROUND1_BUFFER);
                        currentFrame = FRAME2;
                        LTDC_ReloadConfig(LTDC_VBReload);
                        LTDC->SRCR = 0x02;
                        break;
                case FRAME2:
                        if (CurrentFrameBuffer == LCD_FOREGROUND2_BUFFER) {
                                CurrentFrameBuffer = LCD_FOREGROUND1_BUFFER;
                        }
                        else if (CurrentFrameBuffer == LCD_BACKGROUND2_BUFFER) {
                                CurrentFrameBuffer = LCD_BACKGROUND1_BUFFER;
                        }                       
                        LTDC_LayerAddress(LTDC_Layer1, LCD_BACKGROUND2_BUFFER);
                        LTDC_LayerAddress(LTDC_Layer2, LCD_FOREGROUND2_BUFFER);
                        currentFrame = FRAME1;
                        LTDC_ReloadConfig(LTDC_VBReload);
                        LTDC->SRCR = 0x02;
                        break;
        }
}


如果把画圆延时加长:Delay(0xFFFFF);就不会出现闪屏。但是动画太慢,并不理想。
尝试在LTDCInit之前、里面或者之后加上LTDC->SRCR = 0x02;也无法把LTDC->SRCR->LTDC_SRCR_VBR置1.
现在问题:为什么不能置1?还是我对LTDC->SRCR->LTDC_SRCR_VBR这个位置理解错了?这个位不是垂直消隐吗?


还有一个问题:我读取LTDC_CDSR位都是为0,我本来想LTDC->SRCR->LTDC_SRCR_VBR不能置1,也可以通过读取这个信号为同步信号。但是这个方法也不行。


望大神们赐教。


回复

使用道具 举报

发表于 2016-12-10 12:06:49 | 显示全部楼层
RGB888使用DMA2D的话都会闪,
RGB565用我们的配置可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-10 13:37:45 | 显示全部楼层
flyleaf 发表于 2016-12-10 12:06
RGB888使用DMA2D的话都会闪,
RGB565用我们的配置可以

我是用开发板测试的,那个是RGB888吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-10 18:01:35 | 显示全部楼层
问题解决了,双缓冲函数添加读取垂直同步信号如下:
        switch(currentFrame) {
                case FRAME1:
                        if (CurrentFrameBuffer == LCD_FOREGROUND1_BUFFER) {
                                CurrentFrameBuffer = LCD_FOREGROUND2_BUFFER;
                        }
                        else if (CurrentFrameBuffer == LCD_BACKGROUND1_BUFFER) {
                                CurrentFrameBuffer = LCD_BACKGROUND2_BUFFER;
                        }
                        //垂直同步信号
                        do{
                        }while(LTDC_GetCDStatus(LTDC_CD_VDES) == RESET);
                        LTDC_LayerAddress(LTDC_Layer1, LCD_BACKGROUND1_BUFFER);
                        LTDC_LayerAddress(LTDC_Layer2, LCD_FOREGROUND1_BUFFER);
                        currentFrame = FRAME2;
                        break;
                case FRAME2:
                        if (CurrentFrameBuffer == LCD_FOREGROUND2_BUFFER) {
                                CurrentFrameBuffer = LCD_FOREGROUND1_BUFFER;
                        }
                        else if (CurrentFrameBuffer == LCD_BACKGROUND2_BUFFER) {
                                CurrentFrameBuffer = LCD_BACKGROUND1_BUFFER;
                        }                       
                        //垂直同步信号
                        do{
                        }while(LTDC_GetCDStatus(LTDC_CD_VDES) == RESET);
                        LTDC_LayerAddress(LTDC_Layer1, LCD_BACKGROUND2_BUFFER);
                        LTDC_LayerAddress(LTDC_Layer2, LCD_FOREGROUND2_BUFFER);
                        currentFrame = FRAME1;
                        break;
        }


这样就不会闪屏,不过刷新很慢。后来我计算一下,最大的刷新率才20多帧。难怪延时多了,就可以了。
计算公式:LCD时钟频率是PLLLCDCLK /DIV = 420/6/8 = 8.75Mhz.
一次刷新需要点亮800*480个点,水平和垂直的多余同步先忽略。即一次需要800*480个LCD时种。
800*480*1/8.75Mhz = 43.9ms
即使说刷新率是1/43.9ms=22.8帧;这个还是忽略了同步信号,所以估计刷新率才20帧。太慢了!
回复 支持 0 反对 1

使用道具 举报

发表于 2016-12-13 12:58:07 | 显示全部楼层
可以提高始终频率试试,
不使用DMA2d的时候群创的屏幕始终可以到33M,
使用dma2d的时候25M没问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 23:07:33 | 显示全部楼层
我试过了,提高频率。但是一提高就出现花屏,不知道是什么原因;他们的教程也是提到这个情况。不知道是不是因为开发板,走线比较复杂,容易产生干扰。
更奇怪,我把频率调低一点也会出现花屏,有点硬件兼容问题吧
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-6 15:18:15 | 显示全部楼层
ggafish 发表于 2016-12-13 12:58
可以提高始终频率试试,
不使用DMA2d的时候群创的屏幕始终可以到33M,
使用dma2d的时候25M没问题。

好像不行,我提高了时钟频率,结果会出现屏闪
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-24 23:47 , Processed in 0.039817 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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