硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2753|回复: 12
收起左侧

[emWin] stemwin使用GUICC_M8888I颜色问题

[复制链接]

3

主题

32

回帖

41

积分

新手上路

积分
41
发表于 2018-2-18 21:15:36 | 显示全部楼层 |阅读模式
本帖最后由 passteen 于 2018-2-18 23:22 编辑

STemWin配置为单层和双层时,使用GUICC_M8888I颜色显示图片均不正常(其他颜色格式正常),不使用存储设备,直接绘图正常显示。
打断点发现只有在GUICC_M8888I颜色时调用DMA2D_Color2IndexBulk函数,进入InvertAlpha_SwapRB函数时,pColorSrc指针处的数据不是解码出来的图像数据,
首先是一个貌似地址的数据,而后是很长一段的0 。
GUI_NUM_LAYERS为1时且使用_CM_ARGB8888颜色,较大图片会有部分图像显示但颜色不正确。

绘图函数如下:
        GUI_HMEM  PicMem;
        GUI_MEMDEV_Handle  hMEMjpg;
        GUI_JPEG_INFO JpegInfo;
        
        if(GetAlocMem(sFilename,PicMem))                        //将SD卡jpg文件加载至内存
        {

                GUI_JPEG_GetInfo(_acBuffer,flist.fsize,&JpegInfo);       //获取图片的尺寸
               
                hMEMjpg = GUI_MEMDEV_Create(0,0,JpegInfo.XSize,JpegInfo.YSize);     //创建内存设备
                GUI_MEMDEV_Select(hMEMjpg);                        //激活(手册上说的)理解为给解码需要使用的指针赋值
                GUI_JPEG_Draw(_acBuffer,flist.fsize,0,0);          //绘制图像
                GUI_MEMDEV_CopyToLCDAt(hMEMjpg,px,py);             //显示
        }
        
        GUI_ALLOC_Free(PicMem);                  //释放动态内存
        
        return         hMEMjpg;

请问大神是什么原因?

另外,STM32F429超频至240M运行毫无问题,没有温升感(没测试高温环境),这说明在LCD闪烁时可以降低LTDC时钟同时还可超频解决,前提是保证外设时钟不可超频(PCLK1和PCLK2等)





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-2-19 00:20:04 | 显示全部楼层
如果楼主用的是标准库,可以直接使用我们F429的emWin底层驱动接口文件(仅一个背光需要修改,其它基本无需修改),另外修改bsp_tft_429.c文件末尾的最后一个配置函数即可。

测试图片的话,仅调用函数GUI_JPEG_Draw(_acBuffer,flist.fsize,0,0); 测试。
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-2-19 10:25:38 | 显示全部楼层
eric2013 发表于 2018-2-19 00:20
如果楼主用的是标准库,可以直接使用我们F429的emWin底层驱动接口文件(仅一个背光需要修改,其它基本无需 ...

仅用GUI_JPEG_Draw是正常的。底层驱动文件也是照搬的,仅与硬件相关的代码做了些修改。(自己画了一块BGA封装的板)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-2-19 10:30:43 | 显示全部楼层
passteen 发表于 2018-2-19 10:25
仅用GUI_JPEG_Draw是正常的。底层驱动文件也是照搬的,仅与硬件相关的代码做了些修改。(自己画了一块BGA ...

使用我们新版emWin教程的JPEG的存储设备测试方法进行测试,你的这个存储设备使用有问题。
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-2-19 17:11:26 | 显示全部楼层
本帖最后由 passteen 于 2018-2-19 17:13 编辑
eric2013 发表于 2018-2-19 10:30
使用我们新版emWin教程的JPEG的存储设备测试方法进行测试,你的这个存储设备使用有问题。

V6开发板2.0版本的是新版吗?
我就是按照上面的方法做的。
GetAlocMem(sFilename,PicMem)函数是将文件读进动态内存的封装函数。
然后就是创建内存设备并绘制进去。
下面贴上完整代码:
static u8 GetAlocMem(const char *sFilename, GUI_HMEM acMem)
{
        res_disk = f_open(&flist,sFilename,FA_READ);               //读文件
        if(res_disk!=FR_OK) return 0;                              //判断是否读成功
        acMem = GUI_ALLOC_AllocZero(flist.fsize);                 //申请动态内存并清零
        _acBuffer = GUI_ALLOC_h2p(acMem);                         //将申请到内存的句柄转换为指针
        res_disk = f_read(&flist,_acBuffer,flist.fsize,&fnum);     //将文件加载至内存
        f_close(&flist);                                           //加载完毕后关闭文件
        if(res_disk!=FR_OK) return 0;
        return 1;
}


GUI_MEMDEV_Handle  hMEMjpg;
void _ShowJpg(const char *sFilename, int px, int py)
{
        GUI_HMEM  PicMem;
        GUI_JPEG_INFO JpegInfo;
        
        if(GetAlocMem(sFilename,PicMem))                        //将SD卡jpg文件加载至内存
        {

                GUI_JPEG_GetInfo(_acBuffer,flist.fsize,&JpegInfo);       //获取图片的尺寸
               
                hMEMjpg = GUI_MEMDEV_Create(0,0,JpegInfo.XSize,JpegInfo.YSize);     //创建内存设备
                GUI_MEMDEV_Select(hMEMjpg);                        //激活(手册上说的)理解为给解码需要使用的指针赋值
                GUI_JPEG_Draw(_acBuffer,flist.fsize,0,0);          //绘制图像
                GUI_MEMDEV_CopyToLCDAt(hMEMjpg,px,py);             //显示

        }
        
        GUI_ALLOC_Free(PicMem);                  //释放动态内存
        
}

使用_CM_ARGB8888颜色显示不正常

颜色转换代码如下:
static void InvertAlpha_SwapRB(LCD_COLOR * pColorSrc, LCD_COLOR * pColorDst, uint32_t NumItems)
{
  uint32_t Color;
  do
  {
    Color = *pColorSrc++;
    *pColorDst = ((Color & 0x000000FF) << 16)         /* Swap red <-> blue */
                 |  (Color & 0x0000FF00)                /* Green */
                 | ((Color & 0x00FF0000) >> 16)         /* Swap red <-> blue */
                 | ((Color & 0xFF000000) ^ 0xFF000000); /* Invert alpha */
                pColorDst++;
  } while (--NumItems);
}
static void DMA2D_Index2ColorBulk(void * pIndex, LCD_COLOR * pColor, uint32_t NumItems, U8 SizeOfIndex, uint32_t PixelFormat)
{
  /* Use DMA2D for the conversion */
  DMA2D_ConvertColor(pIndex, _aBuffer_DMA2D, PixelFormat, LTDC_Pixelformat_ARGB8888, NumItems);
  
  /* Convert colors from ARGB to ABGR and invert alpha values */
  InvertAlpha_SwapRB(_aBuffer_DMA2D, pColor, NumItems);
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-2-19 17:28:52 | 显示全部楼层
passteen 发表于 2018-2-19 17:11
V6开发板2.0版本的是新版吗?
我就是按照上面的方法做的。
GetAlocMem(sFilename,PicMem)函数是将文件 ...

是的,你这个是错误的用法,不是我们教程的做法。使用存储设备绘制的目的是为了整体加载显示。使用我们JPEG章节的例子测试即可。http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-2-19 18:19:49 | 显示全部楼层
eric2013 发表于 2018-2-19 17:28
是的,你这个是错误的用法,不是我们教程的做法。使用存储设备绘制的目的是为了整体加载显示。使用我们JP ...

仔细比对了一下,用法差异有2
1、fclose在读取文件数据后就使用了
2、GUI_JPEG_Draw函数的坐标为0,0(此前曾在此填入了坐标偏移,但大图片进入HardFault_Handler)

还发现使用GUI_MEMDEV_WriteAt函数显示不正常,使用 GUI_MEMDEV_CopyToLCDAt正常(RGB888)
但是将颜色更改为RGB565则使用GUI_MEMDEV_WriteAt可以正常绘制。使用ARGB8888颜色则所有绘屏操作不能正常显示

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-2-19 18:41:29 | 显示全部楼层
passteen 发表于 2018-2-19 18:19
仔细比对了一下,用法差异有2
1、fclose在读取文件数据后就使用了
2、GUI_JPEG_Draw函数的坐标为0,0( ...

你多试试吧,不清楚你的这个是怎么回事了。
如果软件没问题,就得检查硬件问题了,降低LTDC时钟,降低SDRAM所涉及到引脚的速度等级。
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-2-19 18:57:29 | 显示全部楼层
本帖最后由 passteen 于 2018-2-19 18:59 编辑
eric2013 发表于 2018-2-19 18:41
你多试试吧,不清楚你的这个是怎么回事了。
如果软件没问题,就得检查硬件问题了,降低LTDC时钟,降低SD ...

想来想去,应该是与内存管理以及颜色所使用的字节数有相关,导致指针传递异常但系统并不认为出错,我查一下与字节和内存相关的配置。硬件方面可以肯定没有问题。

感谢硬汉,春节愉快
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-2-19 21:55:17 | 显示全部楼层
本帖最后由 passteen 于 2018-2-19 21:58 编辑

通过打断点发现只要是调用下面的函数,就显示不正常
static void DMA2D_Color2IndexBulk(LCD_COLOR * pColor, void * pIndex, uint32_t NumItems, U8 SizeOfIndex, uint32_t PixelFormat)
{
  /* Convert colors from ABGR to ARGB and invert alpha values */
  InvertAlpha_SwapRB(pColor, _aBuffer_DMA2D, NumItems);
  
  /* Use DMA2D for the conversion */
  DMA2D_ConvertColor(_aBuffer_DMA2D, pIndex, LTDC_Pixelformat_ARGB8888, PixelFormat, NumItems);
        
//        #if 1 /* 将此函数加入,测试发现不加入此函数,BMP565格式的位图无法正常显示  */
//  {
//    int BitsPerPixel;
//    if (SizeOfIndex == 4) {
//      BitsPerPixel = _GetBitsPerPixel(PixelFormat);
//      GUI__ExpandPixelIndices(pIndex, NumItems, BitsPerPixel);
//    }        
//  }
//        #endif
}

注释掉的内容在RGB565格式下显示正常(因为根本就没有进入这个函数),感觉是pColor指针指向错误导致
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-2-20 00:28:08 | 显示全部楼层
passteen 发表于 2018-2-19 21:55
通过打断点发现只要是调用下面的函数,就显示不正常
static void DMA2D_Color2IndexBulk(LCD_COLOR * pCol ...

这里的BMP565是指的位图格式,由BmpCvt转换的,不是硬件配置的颜色的格式RGB565。
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-2-21 09:29:19 | 显示全部楼层
eric2013 发表于 2018-2-20 00:28
这里的BMP565是指的位图格式,由BmpCvt转换的,不是硬件配置的颜色的格式RGB565。

直接用安富来的配置RGB888,RGB565都正常了,但是ARGB8888显示出来的颜色不正常,好像是反色,并且图像整体向下移动大约10像素的样子。找到官方的配置使用也是同样的结果。ARGB1555也不正常
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
发表于 2018-7-25 10:00:15 | 显示全部楼层
直接把这个 相关的函数屏蔽即可

DMA2D_Color2IndexBulk
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-17 06:13 , Processed in 0.376708 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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