我有一些数据(在数组中)显示在LCD上。为此,我使用的是STM32F4微控制器中包含的DMA2D外设。我试图显示的数据是A4格式的。因此,我的数组中的每个字节(要显示)用于绘制两个像素。
问题是,根据我的Reference Manual,这里是如何获取A4数据的(第261页,表格的最后一行):
问题是,即使我的数据是A4格式的,它们也是" 4位倒置"。例如,我没有0xE8
,而是0x8E
。结果:当显示时,每个垂直线都有两个倒数。
所以我的问题是:当使用A4彩色模式时,有没有办法反转DMA2D外设取数据的方式?我没有找到任何注册表来执行此操作,但可能会有更多"低级别"实现这一目标的方法。
谢谢!
使用的微控制器是STM32F469。使用的外围设备是:
在这种特殊情况下,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:我制作了一个脚本(外部)来根据正确的数据提取重写我的所有字体数据。我没有将帖子标记为已解决,因为它没有回答我的问题,老实说,我更愿意通过不依赖于外部脚本来使其工作。