STM32F4:更改DMA2D中的数据获取。可能吗?

STM32F4:更改DMA2D中的数据获取。可能吗?,stm32,stm32f4,Stm32,Stm32f4,我有一些数据(在一个数组中)要显示在LCD上。为此,我使用STM32F4微控制器中包含的DMA2D外围设备。我试图显示的数据是A4格式的。因此,数组中的每个字节(要显示)都用于绘制两个像素 根据我的观点,问题是A4数据是如何获取的(第261页,表的最后一行): 问题是,即使我的数据是A4格式的,它们也是“4位反转的”。例如,我没有使用0xE8,而是使用0x8E。结果是:当显示时,每一条垂直线都有一个2乘2的反转 所以我的问题是:当使用A4颜色模式时,有没有办法反转DMA2D外设获取数据的方式?

我有一些数据(在一个数组中)要显示在LCD上。为此,我使用STM32F4微控制器中包含的DMA2D外围设备。我试图显示的数据是A4格式的。因此,数组中的每个字节(要显示)都用于绘制两个像素

根据我的观点,问题是A4数据是如何获取的(第261页,表的最后一行):

问题是,即使我的数据是A4格式的,它们也是“4位反转的”。例如,我没有使用
0xE8
,而是使用
0x8E
。结果是:当显示时,每一条垂直线都有一个2乘2的反转

所以我的问题是:当使用A4颜色模式时,有没有办法反转DMA2D外设获取数据的方式?我没有找到任何注册可以做到这一点,但也许有一个更“低水平”的方式来实现这一点

谢谢

编辑:设置 使用的微控制器是STM32F469。使用的外围设备包括:

  • FMC管理外部RAM。除其他目标外,该RAM用于存储显示缓冲区(一个用于绘制,一个用于制作微积分)
  • DSI主机处于视频模式的LTDC。然后,DSI主机的输出从外部连接到MIPI到LVDS芯片转换器
  • DMA2D可以轻松实现内存到内存的传输、寄存器到内存的传输以及带有PFC和混合的内存到内存的传输
在这种特殊情况下,A4格式的数据用于绘制字体(这就是为什么使用混合部分)

关于此特定正面图案例中的DMA2D配置:

该函数目前只允许绘制一个特定字符。事实上,它几乎可以完美地工作。字符已绘制,但不像我前面指定的那样(线由两个倒转)。我在
Character1Array
中手动反转了一个字节中的每一个“4位”,字符被完美地绘制出来

我不仅画字体,而且画图片(但不是输入的A4格式,更多的是ARGB8888格式,效果很好)。输出格式为始终argb888


编辑2:我制作了一个脚本(外部),根据正确的数据提取重写所有字体数据。我没有将帖子标记为已解决,因为它没有回答我的问题,老实说,我更愿意通过不依赖外部脚本来实现它。

可能有,但我们需要更多地了解您的设置。你的输出格式是什么?显示器是否通过FSMC连接?是否可以使用LTDC?请包括尽可能多的细节,它们可能是相关的。
DMA2D_HandleTypeDef charDMA2D;
uint32_t destination =  ((uint32_t)backBuffer + (4*(y*LCD_X_SIZE + x)));

charDMA2D.Instance = DMA2D;

charDMA2D.Init.Mode = DMA2D_M2M_BLEND;
charDMA2D.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
charDMA2D.Init.OutputOffset =  800 - 48;

charDMA2D.LayerCfg[0].AlphaMode = DMA2D_NO_MODIF_ALPHA;
charDMA2D.LayerCfg[0].InputColorMode = DMA2D_INPUT_ARGB8888;
charDMA2D.LayerCfg[0].InputAlpha = 0x00;
charDMA2D.LayerCfg[0].InputOffset = 0;

charDMA2D.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
charDMA2D.LayerCfg[1].InputColorMode = DMA2D_INPUT_A4;
charDMA2D.LayerCfg[1].InputAlpha = 0x00;
charDMA2D.LayerCfg[1].InputOffset = 0;

HAL_DMA2D_Init(&charDMA2D);
HAL_DMA2D_ConfigLayer(&charDMA2D, 0);
HAL_DMA2D_ConfigLayer(&charDMA2D, 1);
HAL_DMA2D_BlendingStart(&charDMA2D, (uint32_t)Character1Array, (uint32_t)BackgroundArray, destination, 48, 100);
HAL_DMA2D_PollForTransfer(&charDMA2D, 1000);