野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27088|回复: 7

【求助】用F429加800*400RGB屏显示图片错位

[复制链接]
发表于 2019-5-16 10:48:36 | 显示全部楼层 |阅读模式
新手求助,我用F429的LTDC和DMA2D显示图片,结果显示出的图片有错位,并且最上面几行是花点。图片是用Image2Lcd v2.9取的数组,RGB888模式,
代码如下
int main(void)
{
  LCD_Init();
  LCD_LayerInit();
  LTDC_Cmd(ENABLE);
  LCD_SetLayer(LCD_BACKGROUND_LAYER);  
  LCD_Clear(LCD_COLOR_WHITE);       
  LCD_SetLayer(LCD_FOREGROUND_LAYER);
  LCD_SetTransparency(0xFF);
  LCD_Clear(LCD_COLOR_BLACK);       
  Delay(0xfff);  
  LCD_SetLayer(LCD_FOREGROUND_LAYER);  
  LCD_SetTransparency(0xff);       
  LCD_Clear(LCD_COLOR_BLACK);       

  while(1)
        {
                LCD_DisplayPicture(100, 100, 300, 124,gImage_color);
                Delay(0xFFFFFF);
        }  

}


/**************图片显示函数**********************************/
void LCD_DisplayPicture(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height,const uint8_t *image)
{

    DMA2D_InitTypeDef      DMA2D_InitStruct;
    DMA2D_FG_InitTypeDef   DMA2D_FG_InitStruct;
       
        uint32_t DMA2D_OutAdd;
       
    /* Enable the DMA2D Clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);

    /* DMA2D configuration */
    DMA2D_DeInit();

    /* Transfer mode */
    DMA2D_InitStruct.DMA2D_Mode = DMA2D_M2M;

    /* Color mode */
    DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB888;
    DMA2D_OutAdd = CurrentFrameBuffer + 3*(LCD_PIXEL_WIDTH*Ypos + Xpos);

    /* Output Address */
    DMA2D_InitStruct.DMA2D_OutputMemoryAdd = DMA2D_OutAdd;

    /* Number of lines : height */
    DMA2D_InitStruct.DMA2D_NumberOfLine = Height;

    /* Number of pixel per line : width */
    DMA2D_InitStruct.DMA2D_PixelPerLine = Width;

    /* Initialize the alpha and RGB values */
    DMA2D_InitStruct.DMA2D_OutputGreen = 0;
    DMA2D_InitStruct.DMA2D_OutputBlue = 0;
    DMA2D_InitStruct.DMA2D_OutputRed = 0;
    DMA2D_InitStruct.DMA2D_OutputAlpha = 0;

    /* Initialize the output offset */
    DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - Width);

    /* Initialize DMA2D */
    DMA2D_Init(&DMA2D_InitStruct);

    /* Configure default values for foreground */
    DMA2D_FG_StructInit(&DMA2D_FG_InitStruct);

    /* Configure DMA2D foreground color mode */
    DMA2D_FG_InitStruct.DMA2D_FGCM = DMA2D_RGB888;

    /* Configure Input Address */
    DMA2D_FG_InitStruct.DMA2D_FGMA = (uint32_t)*image;

    /* Initialize foreground */
    DMA2D_FGConfig(&DMA2D_FG_InitStruct);

    /* Start Transfer */
    DMA2D_StartTransfer();

    /* Wait for CTC Flag activation */
    while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
    {
    }
}



我的程序显示的结果如图


显示的图片

显示的图片

取模的图片(实际为bmp格式)

取模的图片(实际为bmp格式)
回复

使用道具 举报

 楼主| 发表于 2019-5-16 10:51:41 | 显示全部楼层
gImage_color就是用Image2Lcd取的数组
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-16 10:59:58 | 显示全部楼层
NemoL 发表于 2019-5-16 10:51
gImage_color就是用Image2Lcd取的数组

前面的初始化函数都是野火例程里面的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-17 08:27:34 | 显示全部楼层
[mw_shl_code=c,true]int main(void)
{
        LED_GPIO_Config();         
        LCD_Init();
        LCD_LayerInit();
        LTDC_Cmd(ENABLE);
        LCD_SetLayer(LCD_BACKGROUND_LAYER);  
        LCD_Clear(LCD_COLOR_WHITE);
        LCD_SetLayer(LCD_FOREGROUND_LAYER);
        LCD_SetTransparency(0xFF);
        LCD_Clear(LCD_COLOR_BLACK);
        LCD_SetLayer(LCD_FOREGROUND_LAYER)
        Delay(0xfff);  
        LCD_SetLayer(LCD_FOREGROUND_LAYER);  
        LCD_SetTransparency(0xff);
        LCD_Clear(LCD_COLOR_BLACK);       

  while(1)
        {                     
                LCD_DisplayPicture(100, 100, 300, 124,gImage_color);
                Delay(0xFFFFFF);
        }  

}



void LCD_DisplayPicture(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height,const uint8_t *image)
{

    DMA2D_InitTypeDef      DMA2D_InitStruct;
    DMA2D_FG_InitTypeDef   DMA2D_FG_InitStruct;
       
        uint32_t DMA2D_OutAdd;
       
    /* Enable the DMA2D Clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);

    /* DMA2D configuration */
    DMA2D_DeInit();

    /* Transfer mode */
    DMA2D_InitStruct.DMA2D_Mode = DMA2D_M2M;

    /* Color mode */
    DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB888;
//   DMA2D_OutAdd = CurrentFrameBuffer + 3*(Width*Ypos + Xpos);
    DMA2D_OutAdd = CurrentFrameBuffer + 3*(LCD_PIXEL_WIDTH*Ypos + Xpos);

    /* Output Address */
    DMA2D_InitStruct.DMA2D_OutputMemoryAdd = DMA2D_OutAdd;

    /* Number of lines : height */
    DMA2D_InitStruct.DMA2D_NumberOfLine = Height;

    /* Number of pixel per line : width */
    DMA2D_InitStruct.DMA2D_PixelPerLine = Width;

    /* Initialize the alpha and RGB values */
//    DMA2D_InitStruct.DMA2D_OutputGreen = 0;
//    DMA2D_InitStruct.DMA2D_OutputBlue = 130;
//    DMA2D_InitStruct.DMA2D_OutputRed = 228;
//    DMA2D_InitStruct.DMA2D_OutputAlpha = 0;

    /* Initialize the output offset */
    DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH- Width;

    /* Initialize DMA2D */
    DMA2D_Init(&DMA2D_InitStruct);

    /* Configure default values for foreground */
    DMA2D_FG_StructInit(&DMA2D_FG_InitStruct);

    /* Configure DMA2D foreground color mode */
    DMA2D_FG_InitStruct.DMA2D_FGCM = DMA2D_RGB888;

    /* Configure Input Address */
    DMA2D_FG_InitStruct.DMA2D_FGMA = (uint32_t)*image;

    /* Initialize foreground */
    DMA2D_FGConfig(&DMA2D_FG_InitStruct);

    /* Start Transfer */
    DMA2D_StartTransfer();

    /* Wait for CTC Flag activation */
    while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
    {
    }
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-17 09:37:31 | 显示全部楼层
已解决,结贴
回复 支持 反对

使用道具 举报

发表于 2019-6-22 14:26:04 | 显示全部楼层
楼主怎么解决的?
回复 支持 反对

使用道具 举报

发表于 2019-10-20 10:08:28 | 显示全部楼层
不同 发表于 2019-6-22 14:26
楼主怎么解决的?

将代码清单中78行的
[mw_shl_code=c,true]DMA2D_FG_InitStruct.DMA2D_FGMA = (uint32_t)*image;[/mw_shl_code]
改成:
[mw_shl_code=c,true]DMA2D_FG_InitStruct.DMA2D_FGMA = (uint32_t)ℑ[/mw_shl_code]
即可解决
回复 支持 反对

使用道具 举报

发表于 2020-12-17 13:35:21 | 显示全部楼层
最近在看野火的LTDC+DMA2D
楼主确定不是DMA2D_FG_InitStruct.DMA2D_FGMA = (uint32_t)image;
去掉*号吗
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 03:44 , Processed in 0.042720 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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