0

I am using 12.1" TFT Display of 800x600 resolution and interfacing it with STM32F429BI Micro-controller and IS42S16400J SDRAM .I am getting the flickering issue in my display. When i bypass the SDRAM it working ok , there is no flickering, but on connecting through SDRAM it starts giving flickering issue.

#define REFRESH_COUNT           ((uint32_t)(1386))   /* SDRAM refresh counter at 90Mhz*/
#define SDRAM_TIMEOUT         ((uint32_t)0xFFFF)
#define SDRAM_DEVICE_ADDR       ((unsigned int)0xD0000000)

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
 __PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM =4;
 RCC_OscInitStruct.PLL.PLLN =180;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
 RCC_OscInitStruct.PLL.PLLQ = 4;
 HAL_RCC_OscConfig(&RCC_OscInitStruct);
 HAL_PWREx_ActivateOverDrive();
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
               |RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;
 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_RTC;
 PeriphClkInitStruct.PLLSAI.PLLSAIN =144;//18MHz
 PeriphClkInitStruct.PLLSAI.PLLSAIR = 4;
 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
 PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

 
void MX_LTDC_Init(void)
{
LTDC_LayerCfgTypeDef pLayerCfg;
 hltdc.Instance = LTDC;
 hltdc.Init.HSPolarity =LTDC_HSPOLARITY_AH;
 hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
 hltdc.Init.DEPolarity =LTDC_DEPOLARITY_AL; 
 hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
 hltdc.Init.HorizontalSync = 40;
 hltdc.Init.VerticalSync = 9;
 hltdc.Init.AccumulatedHBP = 42;
 hltdc.Init.AccumulatedVBP = 11;
 hltdc.Init.AccumulatedActiveW = 1054;
 hltdc.Init.AccumulatedActiveH = 664;
 hltdc.Init.TotalWidth = 1056;
 hltdc.Init.TotalHeigh = 666;
 hltdc.Init.Backcolor.Blue = 0;
 hltdc.Init.Backcolor.Green = 0;
 hltdc.Init.Backcolor.Red = 0;
 HAL_LTDC_Init(&hltdc);

 pLayerCfg.WindowX0 = 0;
 pLayerCfg.WindowX1 = 800;
 pLayerCfg.WindowY0 = 0;
 pLayerCfg.WindowY1 = 600;
 pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
 pLayerCfg.Alpha = 255;
 pLayerCfg.Alpha0 = 0;
 pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
 pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
 pLayerCfg.FBStartAdress = SDRAM_DEVICE_ADDR;//(uint32_t)&Color;
 pLayerCfg.ImageWidth = 800;
 pLayerCfg.ImageHeight = 600;
 pLayerCfg.Backcolor.Blue = 0;
 pLayerCfg.Backcolor.Green = 0;
 pLayerCfg.Backcolor.Red = 0;
 HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0);
}

void MX_FMC_Init(void)
{
 FMC_SDRAM_TimingTypeDef SdramTiming;
 hsdram1.Instance = FMC_SDRAM_DEVICE;
 hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
 hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
 hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
 hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
 hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
 hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
 hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
 hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
 hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
 hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
 SdramTiming.LoadToActiveDelay  = 2;
 SdramTiming.ExitSelfRefreshDelay = 14;
 SdramTiming.SelfRefreshTime   = 14;
 SdramTiming.RowCycleDelay    = 14;
 SdramTiming.WriteRecoveryTime  = 2;
 SdramTiming.RPDelay       = 4;
 SdramTiming.RCDDelay       = 4;
 HAL_SDRAM_Init(&hsdram1, &SdramTiming);
 BSP_SDRAM_Initialization_sequence(REFRESH_COUNT);
}

void BSP_SDRAM_Initialization_sequence(uint32_t RefreshCount)
{
 __IO uint32_t tmpmrd =0;  
 Command.CommandMode       = FMC_SDRAM_CMD_CLK_ENABLE;
 Command.CommandTarget      = FMC_SDRAM_CMD_TARGET_BANK2;
 Command.AutoRefreshNumber    = 1;
 Command.ModeRegisterDefinition = 0;
 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
 HAL_Delay(1);
 Command.CommandMode       = FMC_SDRAM_CMD_PALL;
 Command.CommandTarget      = FMC_SDRAM_CMD_TARGET_BANK2;
 Command.AutoRefreshNumber    = 1;
 Command.ModeRegisterDefinition = 0;
 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT); 
 Command.CommandMode       = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
 Command.CommandTarget      = FMC_SDRAM_CMD_TARGET_BANK2;
 Command.AutoRefreshNumber    = 4;
 Command.ModeRegisterDefinition = 0;
 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
 tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1     |
          SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL  |
          SDRAM_MODEREG_CAS_LATENCY_3      |
          SDRAM_MODEREG_OPERATING_MODE_STANDARD |
           SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
 Command.CommandMode       = FMC_SDRAM_CMD_LOAD_MODE;
 Command.CommandTarget      = FMC_SDRAM_CMD_TARGET_BANK2;
 Command.AutoRefreshNumber    = 1;
 Command.ModeRegisterDefinition = tmpmrd;
 HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
 HAL_SDRAM_ProgramRefreshRate(&hsdram1, RefreshCount); 
}
Diksha
  • 1

2 Answers2

1

This could be a EMI issue. A SRAM produce a lot of EMI the PCB design ist not trival easy.

Is it a dev. Board from STM or a customized borad?

theLastDay
  • 51
  • 3
0

when displaying an image (or series of images)

  1. the screen must be blanked during the 'retrace' time.
  2. any updates to the screen must be during the retrace time.

You have seen the results of not following that above two objectives.

The human eye can be fooled, but when the image is being updated while the image is being updated, the result is a 'flicker' that the human eye will catch

user3629249
  • 16,402
  • 1
  • 16
  • 17