30 Ocak 2020, 00:16:58

Haberler:

Picproje Facebook Sayfası:  https://bit.ly/2pUitll


STM32F750 SDRAM Erişimi

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

yldzelektronik

19 Ağustos 2019, 14:17:41 #15 Son düzenlenme: 19 Ağustos 2019, 15:24:55 yldzelektronik
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, &pLayerCfg1) != 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 0sizei++)
	
	
{
	
	
	
*(
__IO uint32_t*)(LCD_FB_START_ADDRESS + (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, 11: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

15 Ekim 2019, 13:53:11 #25 Son düzenlenme: 15 Ekim 2019, 16:04:39 yldzelektronik
Alıntı yapılan: OptimusPrime - 11 Eylül 2019, 22: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, 22: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 1pattern != 0pattern <<= 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 baseAddressunsigned 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) != 0offset <<= 1)
    {
        
baseAddress[offset] = pattern;
    }

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

    for (
offset 1; (offset addressMask) != 0offset <<= 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) != 0testOffset <<= 1)
    {
        
baseAddress[testOffset] = antipattern;

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

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

        
baseAddress[testOffset] = pattern;
    }

    return (
NULL);

}
//

uint32_t *memTestDevice(volatile uint32_t baseAddressunsigned 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 1offset 0offset nWordspattern++, offset++)
    {
        
baseAddress[offset] = pattern;
    }

    
/* Check each location and invert it for the second pass. */
    
for (pattern 1offset 0offset nWordspattern++, 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 1offset 0offset nWordspattern++, 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_ADDRaddress < (uint32_t *)(SDRAM_DEVICE_ADDR SDRAM_DEVICE_SIZE); address++)
	
{
	
	
if(
memTestDataBus((datum *)address) != 0)
	
	
{
	
	
	
SDRAM_Error true;
	
	
	
break;
	
	
}
	
}
	

	
if(
memTestAddressBus((datum*)SDRAM_DEVICE_ADDRSDRAM_DEVICE_SIZE) != 0)
	
	
SDRAM_Error true;
	

	
if(
memTestDevice((datum*)SDRAM_DEVICE_ADDRSDRAM_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.