STM32F750 SDRAM Erişimi

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

OptimusPrime

Test kodu dedigin ram testi mi?
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 - 24 Ekim 2019, 02:10:04Test kodu dedigin ram testi mi?

Evet.

Şimdi başka bir şey daha oldu. RAMi temizleyip içine 0 doldurursam (ram testi kapalı) pixel sorunu ortadan kalkıyor. Ama neden?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

0 yerine FF yaparsan geri geliyor mu?
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 - 24 Ekim 2019, 02:40:160 yerine FF yaparsan geri geliyor mu?

Hocam tekrar selam.

Kusura bakma geç oldu. 3 gündür yeni CubeMX ile uğraşıyorum. TouchGFX ve CubeMX güncellenmiş. Ancak proje oluştururken CubeMX garip garip hatalar veriyordu. 5.3 e geri döndüm. Ancak çözdüm sorunu.

Hocam 0x00 veya 0xFF yaparsam sorun düzeliyor. Ancak herhangi bir şey yazmazsam görüntü videodaki gibi bulanık oluyor.

Ben sorunun SDRAM ayarlarıyla ilgili olduğunu düşünüyorum. Ancak bütün değerleri SDRAM datasheetten aldım.

Ayrıca tek renk (turkuaz gibi) arka plan resmi ile denediğimde böyle bir durum olmuyor. Resmi gayet düzgün şekilde gösteriyor. Ancak o durumda sadece tek bir resim oluyor. Ancak videodaki proje tam haliyle. Acaba diyorum TouchGFX bir şekilde bütün resimleri SDRAM'e kopyalayıp o şekilde mi ekranı yeniliyor?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

Cok acayip seylerden bahsediyorsun. Bazen senin devre cinlenmis bi okuttur diyesim geliyor :D

 :du:
Ram testi icin cetrefilli birseyden bahsetmistim. Onu bi uygula derim. En azindan ram ile ilgili suphelerin ortadan kalkar.
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 ||

OptimusPrime

Bu arada derleyiciye bu alana dokunma dedin mi?
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 - 27 Ekim 2019, 08:33:20Cok acayip seylerden bahsediyorsun. Bazen senin devre cinlenmis bi okuttur diyesim geliyor :D
...
Evet. Genelde benim işlerde bu tip şeyler bolca oluyor  ;D  ;D
Alıntı yapılan: OptimusPrime - 27 Ekim 2019, 08:33:20...
Ram testi icin cetrefilli birseyden bahsetmistim. Onu bi uygula derim. En azindan ram ile ilgili suphelerin ortadan kalkar.
Aşağıdaki konudan bahsediyorsan;
Alıntı yapılan: OptimusPrime - 15 Ağustos 2019, 19:53:0232 bit uygun fakat RAM testi o kadar basit degil  ;)

Tam anlamyila test etmek istiyorsan assagidaki gibi olmali. Buradan aldigin hatalari yorumlayarak nerede sorun oldugunu bulabilirsin.

- Sabit sayi ile hafizayi doldurmak (bu senin yaptigin)
- Artan ve azalan sayi ile hafizayi doldurmak
- Yuruyen 1 ve 0 lar ile hafizayi doldurmak

Bu testlerden sag salim cikmasi lazim.  ::ok

Evet. Bu iş için bir test programı var ve buradan gerçekten sağ salim çıktı.
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);

}
//

Diğer taraftan;
Alıntı yapılan: OptimusPrime - 27 Ekim 2019, 08:44:22Bu arada derleyiciye bu alana dokunma dedin mi?

Ben öyle bir tanımlama yapmadım. Bu alan harici ramde. Yani derleyicinin oraya bir şey koyacağını pek zannetmiyorum. Nasıl diyeceğim derleyiciye karışma bu alana?

Konu SDRAM timing ile ilgili olabilir mi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Daha önce başıma geldi kritik değişkenler kesinlikle volatile olarak tanımlanmalı.. Bende anlam veremiyorum.

yldzelektronik

Cihaz 2 aşamalı çalışıyor. İlk aşamada bir yazılım sdram init ediliyor. Burada flashta yazılım varsa deinit yapılıp user app external flashtan çalıştırılıyor.

Bootloader da Sdram init etmesem ve temizlemesem yine aynı bozukluklar oluyor. Debug ile (user app ta) 0xC0000000 adresine baktığımda gerçekten sürekli değerlerin değiştiğini görüyorum. User app te hiçbir değişiklik yok.

Sadece bootloaderda sdram temizlenmezse sdrame sürekli bir şeyler yazılıyor. Bu arada sdram e 0x00, 0xFF, 0xAA55 gibi değerler yazarak boot etmeyi denediğimde her seferinde ekran sorunsuz çalışıyor. Demek ki mutlaka bir şeyler yazıp öyle boot olmak gerekiyor diye düşünüyorum.

Peki timing değerlerim yanlış mı acaba? Bu durum neden olur?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mufitsozen

Alıntı yapılan: yldzelektronik - 27 Ekim 2019, 13:48:14Bootloader da Sdram init etmesem ve temizlemesem yine aynı bozukluklar oluyor. Debug ile (user app ta) 0xC0000000 adresine baktığımda gerçekten sürekli değerlerin değiştiğini görüyorum. User app te hiçbir değişiklik yok.

Peki timing değerlerim yanlış mı acaba? Bu durum neden olur?

Programinizda hatali code olabilir, sifir adresine birseyler yazmak NULL pointer kullanimini gosteriyor olabilir. Statik kod inceleyen PC Lint veya benzeri ile kodunuzu analiz ediniz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yldzelektronik

Alıntı yapılan: mufitsozen - 27 Ekim 2019, 16:56:09Programinizda hatali code olabilir, sifir adresine birseyler yazmak NULL pointer kullanimini gosteriyor olabilir. Statik kod inceleyen PC Lint veya benzeri ile kodunuzu analiz ediniz.

Abi sıfır adresine bir şeyler yazmıyorum. Neden öyle düşündün? Yanlış anladığım bir şey mi var?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mufitsozen

#41
Alıntı yapılan: yldzelektronik - 27 Ekim 2019, 17:22:14Abi sıfır adresine bir şeyler yazmıyorum. Neden öyle düşündün? Yanlış anladığım bir şey mi var?
Kullandiginiz bir pointer programlama hatasi yada hata kontrolunun eksikliginden dolayi NULL kaliyor olabilir.
Pc-lint gibi statik analyzer programlari bu cesit problemleri ortaya cikarabilir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yldzelektronik

Bu programın indirme linkini bir türlü bulamıyorum. Ben mi kaçırıyorum acaba?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mufitsozen

Alıntı yapılan: yldzelektronik - 28 Ekim 2019, 15:38:09Bu programın indirme linkini bir türlü bulamıyorum. Ben mi kaçırıyorum acaba?

Asagidaki linkdeki formu doldur, evaluation version indirme linkini yollasinlar.

evaluate PC-Lint Plus
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

OptimusPrime

Bu arada map dosyasina bakiver senin frame buffer in disinda bu alani kullanan var mi diye. ::ok
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 ||