sdram ve lcd kullanımı

Başlatan yusuffyk, 14 Aralık 2015, 11:00:15

yusuffyk

merhaba arkadaşlar,
stm32f429 da sdram ile tft lcd kullanmaya çalışıyorum. sdrame yazılan datayı hızlı şekilde okuyabiliyorum ama sdrame yazarken ekranı kontrol edemiyorum. ya ekran karıncalanıyor, ya da seçtiğim adrese göre hard-defaulta düşüyor. sdram de yazılacak alanı tespit edemedim sanırım, istediğim yere yazamıyor muyum ?
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

Mucit23

Ne amaçla yazmak istiyorsunuz. Normalde Ram'in bir kısmı LCD için ayrılmıştır. DMA2D donanımı bu kısmı kullanır. Siz bu kısma yazarsanız LCD de istenmeyen durumlar meydana gelebilir doğal olarak.

yusuffyk

ben nand flash kullanıyorum, açılışta flashtan ram'e yazıp oradan lcd ye yazacağım. açılışta logoyu basıyorum, logodan sonra loading tarzı beklemem gerekiyor, o sırada ram'e yazmaya devam ediyorum.
ama ekranda beklenmedik şeyler oluyor. 0xd0000000 adresine yazıyorum. sorunsuz kullanabileceğim alanı bulamadım.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

Mucit23

Örnekler içerisinde FMC+SDRAM uygulaması var. Onu inceleyebilirsin.
/**
  ******************************************************************************
  * @file    FMC_SDRAM/main.c 
  * @author  MCD Application Team
  * @version V1.0.1
  * @date    11-November-2013
  * @brief   This example shows how to write to the external SDRAM with 
  *          8bits AHB transaction or 16bits AHB transaction.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "main.h"

/** @addtogroup STM32F429I_DISCOVERY_Examples
  * @{
  */

/** @addtogroup FMC_SDRAM
  * @{
  */ 

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
#define IS42S16400J_SIZE             0x400000

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{ 
  uint8_t ubWritedata_8b = 0x3C, ubReaddata_8b = 0;  
  uint16_t uhWritedata_16b = 0x1E5A, uhReaddata_16b = 0;  
  uint32_t uwReadwritestatus = 0;
  uint32_t counter = 0x0;
  
  /*!< At this stage the microcontroller clock setting is already configured, 
  this is done through SystemInit() function which is called from startup
  file (startup_stm32f429_439xx.s) before to branch to application main.
  To reconfigure the default setting of SystemInit() function, refer to
  system_stm32f4xx.c file
  */
  
  /* Initialize LEDs and user-push button mounted on STM32F429I-DISCOVERY */
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED4);
  STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); 
  
  /* Initialize the LCD */
  LCD_Init();
  LCD_LayerInit();
  LTDC_Cmd(ENABLE);
  LCD_SetLayer(LCD_FOREGROUND_LAYER);
  LCD_Clear(LCD_COLOR_WHITE);
  LCD_SetTransparency(200);
  LTDC_ReloadConfig(LTDC_IMReload);
  
  /* SDRAM Initialization */  
  SDRAM_Init();
  
  /* FMC SDRAM GPIOs Configuration */
  SDRAM_GPIOConfig();
  
  /* Disable write protection */
  FMC_SDRAMWriteProtectionConfig(FMC_Bank2_SDRAM,DISABLE); 

  while (1)
  {
    
  /*********************** 8-bits AHB transaction test ************************/    
  /* Wait for User button to be pressed */
  while (STM_EVAL_PBGetState(BUTTON_USER) != Bit_SET)
  {}
  /* Wait for User button is released */
  while (STM_EVAL_PBGetState(BUTTON_USER) != Bit_RESET)
  {}
  
  /* Turn Off Leds */   
  STM_EVAL_LEDOff(LED3);
  STM_EVAL_LEDOff(LED4);
  
  /* Erase SDRAM memory */
  for (counter = 0x00; counter < IS42S16400J_SIZE; counter++)
  {
    *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)0x0;
  }
  
  /* Write data value to all SDRAM memory */
  for (counter = 0; counter < IS42S16400J_SIZE; counter++)
  {
    *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
  }
  
  /* Read back SDRAM memory and check content correctness*/
  counter = 0;
  uwReadwritestatus = 0;
  while ((counter < IS42S16400J_SIZE) && (uwReadwritestatus == 0))
  {
    ubReaddata_8b = *(__IO uint8_t*)(SDRAM_BANK_ADDR + counter);
    if ( ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter))
    {
      uwReadwritestatus = 1;
      STM_EVAL_LEDOn(LED4);
      STM_EVAL_LEDOff(LED3);              
    }
    else
    {
      STM_EVAL_LEDOn(LED3);
      STM_EVAL_LEDOff(LED4);
    }
    counter++;
  } 
  
  if(uwReadwritestatus == 0)
  {
    LCD_Clear(LCD_COLOR_GREEN);
    LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"  8-bits AHB      ");
    LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"  Transaction     "); 
    LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)"  Test-> OK       ");   
  }
  else
  {
    LCD_Clear(LCD_COLOR_RED);
    LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"    8-bits AHB     ");
    LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"   Transaction     "); 
    LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)"   Test-> NOT OK   ");     
  }
  
  /*********************** 16-bits AHB transaction test ***********************/    
  /* Wait for User button to be pressed */
  while (STM_EVAL_PBGetState(BUTTON_USER) != Bit_SET)
  {}
  /* Wait for User button is released */
  while (STM_EVAL_PBGetState(BUTTON_USER) != Bit_RESET)
  {}
  
  /* Turn Off Leds */   
  STM_EVAL_LEDOff(LED3);
  STM_EVAL_LEDOff(LED4);
  
  /* Erase SDRAM memory */
  for (counter = 0x00; counter < IS42S16400J_SIZE; counter++)
  {
    *(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*counter) = (uint16_t)0x00;
  }
  
  /* Write data value to all SDRAM memory */
  for (counter = 0; counter < IS42S16400J_SIZE; counter++)
  {
    *(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);
  }
  
  /* Read back SDRAM memory and check content correctness*/
  counter = 0;
  uwReadwritestatus = 0;
  while ((counter < IS42S16400J_SIZE) && (uwReadwritestatus == 0))
  {
    uhReaddata_16b = *(__IO uint16_t*)(SDRAM_BANK_ADDR + 2*counter);
    if ( uhReaddata_16b != (uint16_t)(uhWritedata_16b + counter))
    {
      uwReadwritestatus = 1;
      STM_EVAL_LEDOn(LED4);
      STM_EVAL_LEDOff(LED3); 
    }
    else
    {
      STM_EVAL_LEDOn(LED3);
      STM_EVAL_LEDOff(LED4);
    }
    counter++;
  }
  if(uwReadwritestatus == 0)
  {
    LCD_Clear(LCD_COLOR_GREEN);
    LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"  16-bits AHB     ");
    LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"  Transaction     "); 
    LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)"  Test-> OK       ");   
  }
  else
  {
    LCD_Clear(LCD_COLOR_RED);
    LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"    16-bits AHB    ");
    LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"   Transaction     "); 
    LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)"   Test-> NOT OK   ");     
  }
  }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  while (1)
  {}
}
#endif

/**
  * @}
  */ 

/**
  * @}
  */ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


yusuffyk

hocam SDRAM_BANK_ADDR şayet 0xd0000000 ise doğru yapıyorum.
bu örnek de benim yaptığım gibi. ben SDRAM_BANK_ADDR olarak 0xd0000000 kullanıyorum.
yazıp okumada sıkıntı yok, ancak yazarken ekranım bembeyaz oluyor, veyahut karancalanıyor. ama yazma işi bittikten sonra düzeliyor. olması gerektiği gibi oluyor.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

Mucit23

O halde şöyle bir tahmin yürüteceğim.

Şimdi LTDC ve sen ortak bir ramin farklı bölgelerini kullanıyorsunuz. Fakat RAM'e erişim birtek FMC donanımı ile gerçekleşiyor. Sanırım LTDC arka planda sürekli SDRAM'in ilgili bölgesini FMC ile okuyup ekrana gönderiyor. Bu sırada FMC oldukça meşgul, aynı anda sende FMC üzerinden veri aktarmaya çalışınca LTDC'nin veri transfer işlemi sekteye uğruyor herhalde.

yusuffyk

ben de şöyle bir tahmin yürüttüm. ram'in farklı bölgeleri farklı peripheraller tarafından kullanılıyor. istediğim şeyi yazabileceğim belirli bir alan var. ve ben o alana yazmıyorum.
farklı bir peripheralin alanına yazmaya çalışıyorum ve sapıtıyor. yazmam gereken yerin 0xd0000000 olduğuna emin olsam diğer ihtimallere yöneleceğim.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

leblebitozu

LCD rezülasyonu nedir, pixel clock nedir ?

RCC_PLLSAIConfig fonksiyonu ile pixel clock'u ayarladın mı..

garezza

@yktronik. Sorunum benzer olduğu için yeni konu açmak istemedim. 800x480 TFT de herhangi birşeyi değiştirdiğim anda ekranda titremeler ve kaymalar oluyor. değiştireceğim veri yazma işi bittiğinde herşey yerli yerine oturuyor. Video çekip göstermek istedim ama videoda tüm ekran sürekli titriyormuş gibi gözüktüğünden durum anlaşılmıyor. Bu durum lcd clk frekansı 25 mhz üstüne çıktığında başlıyor. Bu durumun RAM ile ilgili ayarlardan olduğunu düşünüyorum ancak işin içinden çıkamadım. Bu konudaki deneyimlerini paylaşacak arkadaşlara şimdiden teşekkür ederim. Bu arada o zaman 25 üstüne çıkma dediğinizi duyar gibiyim ancak 33ün altında görüntü kalitesinde ciddi düşüşler oluyor.
  
	  LtdcHandler.Init.HorizontalSync = 38;
		/* Configure vertical synchronization height */
    LtdcHandler.Init.VerticalSync = 0;
    /* Configure accumulated horizontal back porch */
    LtdcHandler.Init.AccumulatedHBP = 87;
    /* Configure accumulated vertical back porch */
    LtdcHandler.Init.AccumulatedVBP = 31;
    /* Configure accumulated active width */
    LtdcHandler.Init.AccumulatedActiveW = 925;
    /* Configure accumulated active height */
    LtdcHandler.Init.AccumulatedActiveH = 511;
    /* Configure total width */
    LtdcHandler.Init.TotalWidth = 1055;
    /* Configure total height */
    LtdcHandler.Init.TotalHeigh = 524;
		
    
    /* Configure R,G,B component values for LCD background color */
    LtdcHandler.Init.Backcolor.Red= 0;
    LtdcHandler.Init.Backcolor.Blue= 0;
    LtdcHandler.Init.Backcolor.Green= 0;
    
    /* LCD clock configuration */
    /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
    /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */
    /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */
    /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 48/4 = 6Mhz */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
    PeriphClkInitStruct.PLLSAI.PLLSAIN = 160;
    PeriphClkInitStruct.PLLSAI.PLLSAIR = 3;
    PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); 
    
    /* Polarity */
    LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
    LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
    LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
    LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
   

LCD ile ilgili kısım

yusuffyk

devrede başka ne var ? sdram ve lcd mi var sadece ?
bende benzer sorun flash ve ram'i fmc modülünde sürerken oluyordu. eğer böyle fmc modülünü kullandığın bir yapı varsa, ona göre bir şey söyleyebilirim.
ama yine de timing ayarlarını kontrol et derim.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

garezza

stm32f429 discovery kit üzerindeki lcdyi söküp yerine 800x480 çözünürlükte ekran taktım yani kit üzerindeki tüm donanımlar duruyor. LCD'nin timing ayarlarını daha önce ssd1963 ile kullandım bunlarda problem yok. Nand flash ise bahsettiğiniz kullanmıyorum.
  /* FMC Configuration -------------------------------------------------------*/
  /* FMC SDRAM Bank configuration */
  /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */
  /* TMRD: 2 Clock cycles */
  Timing.LoadToActiveDelay    = 1;
  /* TXSR: min=70ns (7x11.11ns) */
  Timing.ExitSelfRefreshDelay = 1;
  /* TRAS: min=42ns (4x11.11ns) max=120k (ns) */
  Timing.SelfRefreshTime      = 1;
  /* TRC:  min=70 (7x11.11ns) */
  Timing.RowCycleDelay        = 4;
  /* TWR:  min=1+ 7ns (1+1x11.11ns) */
  Timing.WriteRecoveryTime    = 1;
  /* TRP:  20ns => 2x11.11ns*/
  Timing.RPDelay              = 1;
  /* TRCD: 20ns => 2x11.11ns */
  Timing.RCDDelay             = 1;

fmc'nin buradaki ayarlarıyla oynadığımda frekansı bir miktar daha yükseltebiliyorum ancak herhangi bir bilgiye dayanarak yapmadım tamamen deneme yanılma ve açıklamada yazdığı sınırların dışında. Eğer yardımcı olabilirseniz örneğin tamamını gönderebilirim. Zaten stmcube paint örneğinin üzerinde yaptığım değişiklikler çok bişey yok.

yusuffyk

tam emin olmamakla beraber uygun frekanslarda çalışmadığından kaynaklandığını düşünüyorum. emin olmak adına bende kendi sistemimi kontrol edeyim. bir şey hatırlarsam yardımcı olmaya çalışırım.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

F493

Alıntı yapılan: garezza - 11 Mayıs 2016, 09:55:54
stm32f429 discovery kit üzerindeki lcdyi söküp yerine 800x480 çözünürlükte ekran taktım yani kit üzerindeki tüm donanımlar duruyor. LCD'nin timing ayarlarını daha önce ssd1963 ile kullandım bunlarda problem yok. Nand flash ise bahsettiğiniz kullanmıyorum.
  /* FMC Configuration -------------------------------------------------------*/
  /* FMC SDRAM Bank configuration */
  /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */
  /* TMRD: 2 Clock cycles */
  Timing.LoadToActiveDelay    = 1;
  /* TXSR: min=70ns (7x11.11ns) */
  Timing.ExitSelfRefreshDelay = 1;
  /* TRAS: min=42ns (4x11.11ns) max=120k (ns) */
  Timing.SelfRefreshTime      = 1;
  /* TRC:  min=70 (7x11.11ns) */
  Timing.RowCycleDelay        = 4;
  /* TWR:  min=1+ 7ns (1+1x11.11ns) */
  Timing.WriteRecoveryTime    = 1;
  /* TRP:  20ns => 2x11.11ns*/
  Timing.RPDelay              = 1;
  /* TRCD: 20ns => 2x11.11ns */
  Timing.RCDDelay             = 1;

fmc'nin buradaki ayarlarıyla oynadığımda frekansı bir miktar daha yükseltebiliyorum ancak herhangi bir bilgiye dayanarak yapmadım tamamen deneme yanılma ve açıklamada yazdığı sınırların dışında. Eğer yardımcı olabilirseniz örneğin tamamını gönderebilirim. Zaten stmcube paint örneğinin üzerinde yaptığım değişiklikler çok bişey yok.

Selam garezza,

    Sorun FMC ayarlarıyla ilgili değil.  void LCD_Init(void)  fonksiyonu içinde  " Timing configuration" kısmında ,

LTDC_InitStruct.LTDC_HorizontalSync,  LTDC_InitStruct.LTDC_VerticalSync, LTDC_InitStruct.LTDC_AccumulatedHBP, ..  kısımlarını elinizdeki TFT' ye göre düzenlemeniz gerekli. Bu bilgilerde TFT'nin dökümanında mevcut.

Esen kalın.