SDRAM, взаимодействующий с STM32F429BI, имеет проблему с мерцанием

#c #stm32 #keil #stm32f4 #stm32cubemx

#c #stm32 #keil #stm32f4 #stm32cubemx

Вопрос:

Я использую 12,1-дюймовый TFT-дисплей с разрешением 800×600 и подключаю его к микроконтроллеру STM32F429BI и SDRAM IS42S16400J.Я получаю проблему с мерцанием на моем дисплее. Когда я обхожу SDRAM, он работает нормально, мерцания нет, но при подключении через SDRAM он начинает выдавать проблему с мерцанием.

 #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(amp;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(amp;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(amp;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(amp;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)amp;Color;
 pLayerCfg.ImageWidth = 800;
 pLayerCfg.ImageHeight = 600;
 pLayerCfg.Backcolor.Blue = 0;
 pLayerCfg.Backcolor.Green = 0;
 pLayerCfg.Backcolor.Red = 0;
 HAL_LTDC_ConfigLayer(amp;hltdc, amp;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(amp;hsdram1, amp;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(amp;hsdram1, amp;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(amp;hsdram1, amp;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(amp;hsdram1, amp;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(amp;hsdram1, amp;Command, SDRAM_TIMEOUT);
 HAL_SDRAM_ProgramRefreshRate(amp;hsdram1, RefreshCount); 
}
  

Ответ №1:

Это может быть проблемой EMI. SRAM создает много электромагнитных помех, дизайн печатной платы не так прост.

Это разработчик. Плата от STM или настроенный borad?

Комментарии:

1. это индивидуальная плата?

Ответ №2:

при отображении изображения (или серии изображений)

  1. экран должен быть выключен во время «повторной трассировки».
  2. любые обновления экрана должны выполняться в течение retrace времени.

Вы видели результаты несоблюдения двух вышеуказанных целей.

Человеческий глаз можно обмануть, но когда изображение обновляется во время обновления изображения, результатом является «мерцание», которое человеческий глаз уловит