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

时间:2017-10-16 07:00:05

标签: stm32 stm32f4

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

问题是,根据我的Reference Manual,这里是如何获取A4数据的(第261页,表格的最后一行):

enter image description here

问题是,即使我的数据是A4格式的,它们也是" 4位倒置"。例如,我没有0xE8,而是0x8E。结果:当显示时,每个垂直线都有两个倒数。

所以我的问题是:当使用A4彩色模式时,有没有办法反转DMA2D外设取数据的方式?我没有找到任何注册表来执行此操作,但可能会有更多"低级别"实现这一目标的方法。

谢谢!

编辑:设置

使用的微控制器是STM32F469。使用的外围设备是:

  • FMC管理外部RAM。该RAM用于存储显示缓冲区(一个用于绘制,一个用于进行微积分);
  • 在视频模式下使用DSI HOST的LTDC。然后,DSI HOST的输出从外部连接到MIPI到LVDS芯片转换器;
  • DMA2D通过PFC和混合轻松实现内存到内存的传输,寄存器到内存的传输以及内存到内存的传输。

在这种特殊情况下,A4格式的数据用于绘制字体(这就是使用混合部分的原因)。

关于此特定前端绘图案例中的DMA2D配置:

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);

此功能目前仅允许绘制一个特定字符。事实上,它的工作几乎完美。字符被绘制但不像我之前指定的那样预期(两行倒两行)。我手动反转每个" 4-bit"在Character1Array的一个字节中,字符被完美地绘制。

我不是只绘制字体而是绘制图片(但不是A4格式的输入,更多ARGB8888格式化并且效果很好)。输出格式始终 ARGB8888。

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

0 个答案:

没有答案