реклама на сайте
подробности

 
 
> STM32F439+SDRAM+DMA2D+TFT, Гадость на экране при работе DMA2D
Denisvak
сообщение Oct 9 2015, 13:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 7-03-06
Из: Санкт-Петербург
Пользователь №: 15 038



Делаю железячку с экраном TFT 800х480 Контроллер STM32F439 SDRAM IS42S16400J-7TLI
Память пишется, все Ок. Экран работает, картинки рисуются и т.д.(без dma2d) Настала необходимость сделать вывод на экран через двойную буферизацию. Перерисовывать два слоя регулярно стало накладно и долго по времени, начал запускать dma2d, но при выводе картинки через него или очистки буфера...почему-то по экрану начинают ползти помехи, как бы след от изображенного текста, а там где ничего не нарисовано такого не возникает, изображениеподергивается и т.д. как раз при вызове DMA2D_StartTransfer(); В чем могут быть проблемы?

Инициализация LTDC
CODE
void LCD_Init(void)
{
LTDC_InitTypeDef LTDC_InitStruct;

/* Configure the LCD Control pins ------------------------------------------*/
// LCD_CtrlLinesConfig();
// LCD_ChipSelect(DISABLE);
// delay(300);
// LCD_ChipSelect(ENABLE);
// delay(300);
//LCD_ChipSelect(DISABLE);
/* Configure the LCD_SPI interface -----------------------------------------*/
//LCD_SPIConfig();

/* Power on the LCD --------------------------------------------------------*/
//LCD_PowerOn();

/* Enable the LTDC Clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);

/* Enable the DMA2D Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);

/* Configure the LCD Control pins */
LCD_AF_GPIOConfig();

SDRAM_Init();

/* LTDC Configuration *********************************************************/
/* Polarity configuration */
/* Initialize the horizontal synchronization polarity as active low */
LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;//LTDC_HSPolarity_AL;
/* Initialize the vertical synchronization polarity as active low */
LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;//
/* Initialize the data enable polarity as active low */
LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;//
/* Initialize the pixel clock polarity as input pixel clock */
LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;

/* Configure R,G,B component values for LCD background color */
LTDC_InitStruct.LTDC_BackgroundRedValue = 0;
LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;
LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;

/* Configure PLLSAI prescalers for LCD */
/* Enable Pixel Clock */
/* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
/* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */
/* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/4 = 48 Mhz */
/* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 48/8 = 6 Mhz */
RCC_PLLSAICmd(DISABLE);
RCC_PLLSAIConfig(360, 7, 3);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
//RCC_PLLSAIConfig(280,15,2);
//RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);

/* Enable PLLSAI Clock */
RCC_PLLSAICmd(ENABLE);
/* Wait for PLLSAI activation */
while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)
{
}

/* Timing configuration */
/* Configure horizontal synchronization width */
LTDC_InitStruct.LTDC_HorizontalSync = (Hsync-1);
/* Configure vertical synchronization height */
LTDC_InitStruct.LTDC_VerticalSync = (Vsync-1);
/* Configure accumulated horizontal back porch */
LTDC_InitStruct.LTDC_AccumulatedHBP = (Hsync+HBP-1);
/* Configure accumulated vertical back porch */
LTDC_InitStruct.LTDC_AccumulatedVBP = (Vsync+VBP-1);
/* Configure accumulated active width */
LTDC_InitStruct.LTDC_AccumulatedActiveW =(Hsync+LCD_PIXEL_WIDTH+HBP-1);
/* Configure accumulated active height */
LTDC_InitStruct.LTDC_AccumulatedActiveH = (Vsync+LCD_PIXEL_HEIGHT+VBP-1);
/* Configure total width */
LTDC_InitStruct.LTDC_TotalWidth = (Hsync + HBP + LCD_PIXEL_WIDTH + HFP - 1);
/* Configure total height */
LTDC_InitStruct.LTDC_TotalHeigh = (Vsync + VBP + LCD_PIXEL_HEIGHT + VFP - 1);

LTDC_Init(&LTDC_InitStruct);
}



Код инициализации памяти
CODE
void SDRAM_Init(void)
{
FMC_SDRAMInitTypeDef FMC_SDRAMInitStructure;
FMC_SDRAMTimingInitTypeDef FMC_SDRAMTimingInitStructure;

/* GPIO configuration for FMC SDRAM bank */
SDRAM_GPIOConfig();

/* Enable FMC clock */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);

/* FMC Configuration ---------------------------------------------------------*/
/* FMC SDRAM Bank configuration */
/* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */
/* TMRD: 2 Clock cycles */
FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay = 2;
/* TXSR: min=70ns (7x11.11ns) */
FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 6;//7;
/* TRAS: min=42ns (4x11.11ns) max=120k (ns) */
FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime = 4;//4;
/* TRC: min=70 (7x11.11ns) */
FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay = 6;//7;
/* TWR: min=1+ 7ns (1+1x11.11ns) */
FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime = 2;
/* TRP: 20ns => 2x11.11ns */
FMC_SDRAMTimingInitStructure.FMC_RPDelay = 2;
/* TRCD: 20ns => 2x11.11ns */
FMC_SDRAMTimingInitStructure.FMC_RCDDelay = 2;

/* FMC SDRAM control configuration */
FMC_SDRAMInitStructure.FMC_Bank = FMC_Bank2_SDRAM;
/* Row addressing: [7:0] */
FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b;
/* Column addressing: [11:0] */
FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_12b;
FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth = SDRAM_MEMORY_WIDTH;
FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4;
FMC_SDRAMInitStructure.FMC_CASLatency = SDRAM_CAS_LATENCY;
FMC_SDRAMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Disable;
FMC_SDRAMInitStructure.FMC_SDClockPeriod = SDCLOCK_PERIOD;
FMC_SDRAMInitStructure.FMC_ReadBurst = SDRAM_READBURST;
FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_2;
FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingInitStructure;

/* FMC SDRAM bank initialization */
FMC_SDRAMInit(&FMC_SDRAMInitStructure);

/* FMC SDRAM device initialization sequence */
SDRAM_InitSequence();
}


Функция заливки экрана одним цветом(очистка)
CODE
void LCD_ClearDMA2D(uint32_t Color,unsigned int adr)
{
DMA2D_InitTypeDef DMA2D_InitStruct;

uint32_t Xaddress = 0;
uint16_t Red_Value = 0, Green_Value = 0, Blue_Value = 0;

Xaddress = adr; // + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);

Red_Value = (0xF800 & Color) >> 11;
Blue_Value = 0x001F & Color;
Green_Value = (0x07E0 & Color) >> 5;

/* Configure DMA2D */
DMA2D_DeInit();
DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;
DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;
DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;
DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;
DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;

DMA2D_InitStruct.DMA2D_OutputOffset = 0;
DMA2D_InitStruct.DMA2D_NumberOfLine = 480;
DMA2D_InitStruct.DMA2D_PixelPerLine = 800;


DMA2D_Init(&DMA2D_InitStruct);
/* Start Transfer */
DMA2D_StartTransfer(); // тут появляются помехи на экране.
/* Wait for CTC Flag activation */
while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
{
}
}


Сообщение отредактировал IgorKossak - Oct 9 2015, 17:36
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01349 секунд с 7
ELECTRONIX ©2004-2016