硬汉嵌入式论坛

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

[DMA2D] 求助,H7的DMA2D格式转换后颜色错位(不是RB翻转)

[复制链接]

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2020-8-3 10:39:14 | 显示全部楼层 |阅读模式
这几天在学习DMA2D,碰到输出顺序的问题,输入为ARGB888格式图像红色(0xFFFF0000),输出是RGB565格式,数据变成了 0x00 0xF8蓝色(我需要的是0xF8,0x00才对,这个用RB翻转是没用的,翻转后成了0x1F 0x00,是绿色的),经过仔细测试,确定是转换后输出顺序是先输出低位再输出高位。但我的显示传输需要先传高位再传低位,我查了参考手册,在DMA2D里面似乎根本没有相关输出顺序的配置,请教下各位是否有解决的方法?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-8-3 10:42:26 | 显示全部楼层
上你的配置代码看下。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 10:48:35 | 显示全部楼层
eric2013 发表于 2020-8-3 10:42
上你的配置代码看下。

配置代码就是用的硬汉的
初始化里面就只做了启动时钟的操作
__HAL_RCC_DMA2D_CLK_ENABLE();

/*
*********************************************************************************************************
*        函 数 名: _DMA2D_DrawAlphaBitmap
*        功能说明: ARGB8888格式位图显示
*        形    参: pDst        目标区地址
*             pSrc        源数据地址,即位图首地址
*             xSize       目标区域的X轴大小,即每行像素数
*             ySize       目标区域的Y轴大小,即行数
*             OffLineSrc  源数据行偏移
*             OffLineDst  目标区行偏移
*             PixelFormat 目标区颜色格式
*        返 回 值: 无
*********************************************************************************************************
*/
void DMA2D_DrawAlphaBitmap(void  * pDst,
                                       void  * pSrc,
                                                                   uint32_t xSize,
                                                                   uint32_t ySize,
                                                                   uint32_t OffLineSrc,
                                                                   uint32_t OffLineDst,
                                                                   uint32_t PixelFormat)
{
        /* DMA2D采用存储器到存储器模式, 这种模式前景层和背景层作为DMA2D输入,且支持颜色格式转换和颜色混合 */  
        DMA2D->CR      = 0x00020000UL | (1 << 9);
        DMA2D->FGMAR   = (uint32_t)pSrc;
        DMA2D->BGMAR   = (uint32_t)pDst;
        DMA2D->OMAR    = (uint32_t)pDst;
        DMA2D->FGOR    = OffLineSrc;
        DMA2D->BGOR    = OffLineDst;
        DMA2D->OOR     = OffLineDst;
       
        /* 前景层颜色格式是LTDC_PIXEL_FORMAT_ARGB8888,即位图的颜色格式,背景层和输出区颜色格式可配置 */
        DMA2D->FGPFCCR = DMA2D_INPUT_ARGB8888  ;//前景层像素格式转换器
        DMA2D->BGPFCCR = PixelFormat;                                                                                //背景层像素格式转换器
        DMA2D->OPFCCR  = PixelFormat;                                                                                        //目标层像素格式转换器
        DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;

        /* 启动传输 */
        DMA2D->CR   |= DMA2D_CR_START;   

        /* 等待DMA2D传输完成 */
        while (DMA2D->CR & DMA2D_CR_START) {}
}
下面是缓存
u8 GUI_RAM[390*390*2]   __attribute__ ((at(0x24000000))); //定位到SRAM1,使用0x24000000~~0x2404A487
u8 JPEG_BUFF[64*3*1024] __attribute__ ((at(0x24050000)));        //定位到SRAM1,使用0x24050000~~0x24079999

下面是调用的转换
DMA2D_DrawAlphaBitmap((void *)(GUI_RAM),(void *)JPEG_BUFF,39,39,0,0,DMA2D_OUTPUT_RGB565);
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 10:57:55 | 显示全部楼层
2.png
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 10:59:26 | 显示全部楼层
2.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-8-3 11:39:52 | 显示全部楼层
帮你测了下,用的我们V7的原始例子。

V7-035_DMA2D功能测试(显示色块,位图,Alpha混合和图片混合等)

使用图片:
5.png

绘制前ARGB8888格式数据值:
1.png

转换后RGB565格式数据值:
2.png

实际效果:
QQ截图20200803113941.png


经过测试,完全没问题。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 13:17:49 | 显示全部楼层
你的结果memory查看数据格式是选成了unsigned short ,查看时编译器自动把数据按先显示高位F8(2)再显示低位00(1)排序了,如果切换成unsigned char 显示,就会反过来。如果用DMA发送数据,会直接按unsigned char发送,按00(1低位)再F8(2高位)顺序来发的。你的显示屏接收数据估计是LSB低位在前的,就可以正常显示,但如果遇到屏幕要求数据格式是MSB高位在前的就会出错了。要是有什么办法能设置生成的数据高低位顺序就好了。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 13:34:16 | 显示全部楼层
看来这个问题暂时没办法解决了,只有用RGB888这种正好8位的数据才行,RGB565之类需要一个byte里面合两种颜色数据的,使用就受限制了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-8-3 13:36:43 | 显示全部楼层
goodjob 发表于 2020-8-3 13:17
你的结果memory查看数据格式是选成了unsigned short ,查看时编译器自动把数据按先显示高位F8(2)再显示低 ...

你的理解偏差有两个:

1、DMA2D不存在unsigned char发送的问题,他是按照你的数据颜色格式转换的,他仅仅是帮你转换下,并存到你要的位置。这种情况下,数据顺序仅仅与大小端有关系。

2、现在我们用的裸屏(不带控制器的),基本都RGB888接口格式的,他们是并行传输数据的,不存在MSB,LSB的问题。

回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 13:46:27 | 显示全部楼层
eric2013 发表于 2020-8-3 13:36
你的理解偏差有两个:

1、DMA2D不存在unsigned char发送的问题,他是按照你的数据颜色格式转换的,他 ...

现在一些小的SPI驱动的屏幕,为了减小内存消耗以及高速刷新,只能用RGB565和SPI 的DMA发送,所以DMA2D生成的两位数据的高低位顺序影响就很大了,比如红色F800,反过来发就变成蓝色+一点绿色的00F8了,这个只能写程序再转换一次。而且JPEG硬解出来的图像也受这个影响,就会消耗很多处理时间了。可能ST设计DMA2D的时候只瞄准了高端屏没考虑那些便宜的小屏吧。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-8-3 13:56:44 | 显示全部楼层
goodjob 发表于 2020-8-3 13:46
现在一些小的SPI驱动的屏幕,为了减小内存消耗以及高速刷新,只能用RGB565和SPI 的DMA发送,所以DMA2D生 ...

如果用的H7,DMA2D配合MDMA,可以设置各种字节顺序的。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2020-8-3 13:58:11 | 显示全部楼层
eric2013 发表于 2020-8-3 13:56
如果用的H7,DMA2D配合MDMA,可以设置各种字节顺序的。

哦哦,我还没仔细看MDMA,现在去仔细学下,谢谢指点
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 22:58 , Processed in 0.195942 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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