Проблема с LTDC, DMA и RGB888

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Проблема с LTDC, DMA и RGB888

Сообщение MementoMori »

Смотрите, вот код инициализации DMA2D
static void MX_DMA2D_Init(void)
{


hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_M2M_PFC;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB888;
hdma2d.Init.OutputOffset = 0;
hdma2d.LayerCfg[1].InputOffset = 0;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB888;
hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[1].InputAlpha = 0;
if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
{
Error_Handler();
}


}
Настройка слоя

............
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
pLayerCfg.Alpha = 255;
pLayerCfg.Alpha0 = 0;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
pLayerCfg.FBStartAdress = 0xD0000000;
...........
if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
А вот собственно функция, рисующая прямоугольник

void TFT_FillRectangle(uint16_t x1, uint16_t y1,
uint16_t x2, uint16_t y2, uint32_t color)
{
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
uint32_t addr=0;
addr = hltdc.LayerCfg[0].FBStartAdress + 3*(y1*hltdc.LayerCfg[0].ImageWidth+x1);
hdma2d.Init.Mode = DMA2D_R2M;

hdma2d.Init.OutputOffset = hltdc.LayerCfg[0].ImageWidth - (x2-x1);
if(HAL_DMA2D_Init(&hdma2d) == HAL_OK)
{
if(HAL_DMA2D_Start(&hdma2d, color, addr, x2-x1, y2-y1) == HAL_OK)
{
HAL_DMA2D_PollForTransfer(&hdma2d, 10);
}
}
}
TFT_FillRectangle(10,10,200,200,0xFF0000FF);

На выходе получаю синий прямоугольник с красной полосой слева.

Что не так?

Добавлено after 2 hours 12 minutes 36 seconds:


Обнаружил некую закономерность. Наличие артефакта зависит от того, где линия начинается и где заканчивается.

Изображение

При одной и той же длине линии результат зависит от координат начала и координат конца.

В конце артефакт наблюдается если его координаты нечетны. То есть под одному через один.

В начале - по два через два.



Есть мысли?
Реклама
Ответить

Вернуться в «ARM»