STM32F750 SDRAM Erişimi

Başlatan yldzelektronik, 20 Temmuz 2019, 17:36:41

yldzelektronik

#15
Edit: lcd config fonksiyonunu aşağıdaki şekilde düzenlediğimde ekranda istediğim formatta (rgb565, rgb888, argb8888) renk basabiliyorum. Demek ki lcd ile ilgili bir sorun yok. Peki hafıza kartından okuyup yazarken neden sorun oluyor?

    LTDC_LayerCfgTypeDef      pLayerCfg;
    /* LCD Initialization */
    BSP_LCD_Init();

    /* Layer1 Configuration ------------------------------------------------------*/

    /* Windowing configuration */
    /* In this case all the active display area is used to display a picture then :
       Horizontal start = horizontal synchronization + Horizontal back porch = 43
       Vertical start   = vertical synchronization + vertical back porch     = 12
       Horizontal stop = Horizontal start + window width -1 = 43 + 480 -1
       Vertical stop   = Vertical start + window height -1  = 12 + 272 -1      */
    pLayerCfg.WindowX0 = 0;
    pLayerCfg.WindowX1 = 800;
    pLayerCfg.WindowY0 = 0;
    pLayerCfg.WindowY1 = 480;

    /* Pixel Format configuration*/
    pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;

    /* Start Address configuration : frame buffer is located at FLASH memory */
    pLayerCfg.FBStartAdress = (uint32_t)LCD_FB_START_ADDRESS;

    /* Alpha constant (255 == totally opaque) */
    pLayerCfg.Alpha = 255;

    /* Default Color configuration (configure A,R,G,B component values) : no background color */
    pLayerCfg.Alpha0 = 0; /* fully transparent */
    pLayerCfg.Backcolor.Blue = 0;
    pLayerCfg.Backcolor.Green = 0;
    pLayerCfg.Backcolor.Red = 0;

    /* Configure blending factors */
    pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
    pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;

    /* Configure the number of lines and number of pixels per line */
    pLayerCfg.ImageWidth  = 800;
    pLayerCfg.ImageHeight = 480;
	
extern LTDC_HandleTypeDef  hLtdcHandler;
    /* Configure the Layer*/
    if(HAL_LTDC_ConfigLayer(&hLtdcHandler, &pLayerCfg, 1) != HAL_OK)
    {
        /* Initialization Error */
        Error_Handler();
    }
	
	uint32_t Color = 0;
	uint64_t size = BSP_LCD_GetXSize() * BSP_LCD_GetYSize() * 4;
	while(1)
		for(uint64_t i = 0; i < size; i++)
		{
			*(__IO uint32_t*)(LCD_FB_START_ADDRESS + (4 * i)) = Color;
		}
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Sorun halen devam ediyor. Konuyla ilgili bilgisi olan var mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

Konu hakkinda bir bilgim/tecrubem yok. Sadece bi el atayim dedim  8-)  ::ok

Bence ilk once SD den frame buffer a nasil data aktarildigini goz onunde bulundurmalisin. LCD de bir sorun olmadigina gore SD den LCD ye olan data zincirinde bir kopukluk olsa gerek.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

Alıntı yapılan: OptimusPrime - 19 Ağustos 2019, 08:15:50Sonuca bakarak birsey demek zor. Sanki yatay pixel i fazla veriyorsun gibide duruyor. Ama olmayadabilir. En güzeli özellikle vsync hsync i scope ile gozleyip bilinen bir data göndermen. Bu sana nerede hata olduğuna dair fikir verecektir.

Hocam haklısınız. Fazla pclk verildiği içinmiş. Sorun çözüldü. Teşekkürler.

@Mucit23 teşekkürler.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Şimdi fark ettiğim bir durum var.

ST diyor ki PCLK = toplam genişlik x toplam uzunluk x yenileme hızı

Ben de diyorum ki PCLK = 1056 x 527 x 60 = 33.390.720 Hz. Buna göre 33,5 MHz yaparsam karınca tv yayına başlıyor.

Ancak 21 MHz yaparsam resim sorunsuz görünürken yazı yazdırmak istediğimde ekrana yine karıncalanma oluyor.

PCLK yı 17 MHz yapınca da resim yenilenmeleri belli oluyor. Hiç hoş olmuyor.

Bu işin kuralı nedir?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

ekran 800x480 degilmiydi? 1056 x 527 nasil yapiyorsun?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Mucit23

@OptimusPrime
Sanırım hesap yapılırken kullanılabilir aktif alana göre değil, Back Porch, Front Porch gibi değerlerle birlikte Toplam genişlik ve yükselik hesaplanıyor.

OptimusPrime

Dogrudur.  ::ok
Sd den okunan resimlerin lcd boyutunda olmasini bekliyordum garip rakamlar cikti. Aslinda bu rakamlar nerden geliyor onu merak ettim. Sistemde kamera da yok diye biliyorum.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

@OptimusPrime @Mucit23 ün dediği gibi toplam alan.

Camera yok sistemde.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

@Mucit23 un verdigi sekilde gorunen zamanlamalari sen ne olarak girdiysen yazsana bi buraya.

Hicbir zaman senkron calismiyor sanki cihaz. Sadece Vsync ve Hsync i ani anda gorunce bi aska geliyor sonra yine sapitiyor gibi.

Elindeki xtal degerlerinide yaz.  ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

#25
Alıntı yapılan: OptimusPrime - 11 Eylül 2019, 19:02:16@Mucit23 un verdigi sekilde gorunen zamanlamalari sen ne olarak girdiysen yazsana bi buraya.

Hicbir zaman senkron calismiyor sanki cihaz. Sadece Vsync ve Hsync i ani anda gorunce bi aska geliyor sonra yine sapitiyor gibi.

Elindeki xtal degerlerinide yaz.  ;)

Hocam selam. Baya geç bir cevap oldu. Kusura bakma.

Kullandığım ekrandaki değerler şöyle;


Bu değerlere göre ben lcd clk değerini 33,5 MHz olarak belirliyorum. Bu durumda kaymalar oluyor.

Değerleri şu şekilde ayarladığımda;

/** 
  * @brief  HX8264 frequency divider  
  */    
#define  HX8264_FREQUENCY_DIVIDER    4            /* LCD Frequency divider      */

/* HX8264 LCD clock configuration */
/* PLLSAI_VCO Input = HSI_VALUE / PLL_M = 2 Mhz */
/* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 138 Mhz */
/* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 168 / 4 = 42 Mhz */
/* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_2 = 42 / 2 = 21Mhz */
periph_clk_init_struct.PLLSAI.PLLSAIN 		= 84;
periph_clk_init_struct.PLLSAIDivR 			= RCC_PLLSAIDIVR_2;
periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
periph_clk_init_struct.PLLSAI.PLLSAIR 		= HX8264_FREQUENCY_DIVIDER;
HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct);

Sorun düzeliyor. Kaymalar bitiyor.

Edit: tag @taydin
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

Alıntı yapılan: OptimusPrime - 15 Ekim 2019, 19:34:12Yani? cozdun mu?  ::)

Abi touchgfx ile yaptığımda herhangi bir titreme gözükmüyor. Bakalım biraz daha test edeyim de anlarız. :)
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Tekrar merhaba,

SDRAM test ile ilgili şöyle bir test programı hazırladım.

uint32_t memTestDataBus(volatile uint32_t * address)
{
    uint32_t pattern;
	
    /* Perform a walking 1's test at the given address. */
    for (pattern = 1; pattern != 0; pattern <<= 1)
    {
        /* Write the test pattern. */
        *address = pattern;

        /* Read it back (immediately is okay for this test). */
        if (*address != pattern) 
        {
            return (pattern);
        }
    }

    return (0);

}
//


uint32_t *memTestAddressBus(volatile uint32_t * baseAddress, unsigned long nBytes)
{
    unsigned long offset;
    unsigned long testOffset;
    unsigned long addressMask = (nBytes / sizeof(datum) - 1);

    datum pattern     = (uint32_t ) 0xAAAAAAAA;
    datum antipattern = (uint32_t ) 0x55555555;


    /* Write the default pattern at each of the power-of-two offsets. */
    for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
    {
        baseAddress[offset] = pattern;
    }

    /* Check for address bits stuck high. */
    testOffset = 0;
    baseAddress[testOffset] = antipattern;

    for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
    {
        if (baseAddress[offset] != pattern)
        {
            return ((datum *) &baseAddress[offset]);
        }
    }

    baseAddress[testOffset] = pattern;

    /* Check for address bits stuck low or shorted. */
    for (testOffset = 1; (testOffset & addressMask) != 0; testOffset <<= 1)
    {
        baseAddress[testOffset] = antipattern;

				if (baseAddress[0] != pattern)
				{
					return ((datum *) &baseAddress[testOffset]);
				}

        for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
        {
            if ((baseAddress[offset] != pattern) && (offset != testOffset))
            {
                return ((datum *) &baseAddress[testOffset]);
            }
        }

        baseAddress[testOffset] = pattern;
    }

    return (NULL);

}
//

uint32_t *memTestDevice(volatile uint32_t * baseAddress, unsigned long nBytes)	
{
    unsigned long offset;
    unsigned long nWords = nBytes / sizeof(datum);

    uint32_t pattern;
    uint32_t antipattern;


    /* Fill memory with a known pattern. */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        baseAddress[offset] = pattern;
    }

    /* Check each location and invert it for the second pass. */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        if (baseAddress[offset] != pattern)
        {
            return ((uint32_t *) &baseAddress[offset]);
        }

        antipattern = ~pattern;
        baseAddress[offset] = antipattern;
    }

    /* Check each location for the inverted pattern and zero it. */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        antipattern = ~pattern;
        if (baseAddress[offset] != antipattern)
        {
            return ((uint32_t *) &baseAddress[offset]);
        }
    }

    return (NULL);

}
//

Bu kod ile sdrami test ettiğimde herhangi bir sorunla karşılaşmıyorum. Ancak resimleri ekrana aldığımda aşağıdaki gibi sorunla karşılaşıyorum.

Hem görsel olması gerektiği gibi değil, anlamsız beyaz noktalar, olmaması gereken beyaz çizgiler, dikkatli bakıldığında fark edilen hareketli pixeller.

Bunun yanında butonlara dokunulduğunda algılanmayan touch eylemi. Aslında touch ic algılıyor. Bunu debug yaparken görebiliyorum. Konumları falan alabiliyorum. Ama gel gelelim buton touch event oluşmuyor. Zaten video da fark edilebilen anlamsız dokunuşlar, dokunulduğunda ekranda oluşan değişimler görülüyor.

Bu sorunun sebebi nedir?

Geliştirme ortamı Keil, TouchGFX.

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Şöyle bir şey oldu az evvel;

Test kodunu çalıştırdığımda test yaklaşık 29 saniye falan sürüyor. Eğer bu testi yaparak boot olursa, ekrandaki kötü pixeller görünmüyor.

Ancak o kısmı es geçersem sorun devam ediyor. Main şöyle;

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
	/* enable gpio clock */
	BSP_GPIOCLK_Enable();
	
	/* init sdram */
	if(BSP_SDRAM_Init() != SDRAM_OK)
		SDRAM_Error = true;
	
	/* init qspi init */
	if(BSP_QSPI_Init() != QSPI_OK)
		QSPIFlash_Error = true;
	
	
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */
	
	/* get qspi flash id */
	if(BSP_QSPI_ReadID(&QSPI_ID) != QSPI_OK)
		QSPIFlash_Error = true;
	
	/* get qspi flash device id */
	if(BSP_QSPI_ReadDeviceID(&QSPI_DevID) != QSPI_OK)
		QSPIFlash_Error = true;
	
	/* enable memory map mode */
	if(BSP_QSPI_EnableMemoryMappedMode(true) != QSPI_OK)
		QSPIFlash_Error = true;
	
	/* test SDRAM */
	uint32_t *address;
	for(address = (uint32_t*)SDRAM_DEVICE_ADDR; address < (uint32_t *)(SDRAM_DEVICE_ADDR + SDRAM_DEVICE_SIZE); address++)
	{
		if(memTestDataBus((datum *)address) != 0)
		{
			SDRAM_Error = true;
			break;
		}
	}
	
	if(memTestAddressBus((datum*)SDRAM_DEVICE_ADDR, SDRAM_DEVICE_SIZE) != 0)
		SDRAM_Error = true;
	
	if(memTestDevice((datum*)SDRAM_DEVICE_ADDR, SDRAM_DEVICE_SIZE) != 0)
		SDRAM_Error = true;
	
	/* test TFT LCD Touch Panel IC */
	
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {		
	/* check if there is any bootloader application? */
	if(QSPIFlash_Error == false && checkforapplication(BOOTLOADER1_ADDRESS))
	{
		/* there is a bootloader in the external flash */
		/* deinit usb */
		USBD_DeInit(&hUsbDeviceFS);
		
		/* deinit sdram */
		BSP_SDRAM_DeInit();
		
		SysTick->CTRL = 0;
		
		SCB->VTOR = BOOTLOADER1_ADDRESS; /* Vector Table Relocation in Internal FLASH */
		
		/* Initialize user application's Stack Pointer & Jump to user application */
		JumpToApplication = (pFunction) (*(__IO uint32_t*) (BOOTLOADER1_ADDRESS + 4));
		__set_MSP(*(__IO uint32_t*) BOOTLOADER1_ADDRESS);
		JumpToApplication();
	}
		
  }
}
}
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.