Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Mucit23 - 04 Şubat 2016, 01:14:42

Başlık: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 04 Şubat 2016, 01:14:42
STM32F429 Discovery'de  SDRAM kullanmam gerekiyor. Anlayamadığım birkaç nokta var.

Kart üzerinde IS42S16400J 64Mbit SDRAM bulunmakta. Ben bu SDRAM'e 320x240 boyutunda resim yazacağım. Pixel genişliği 16bit.

SDRAM'in datasheetine baktığımda 4 banktan oluştuğunu görüyorum. Her bir bank 4096 satır 256 sütündan oluşuyor. Ve anladığım kadarıyla 16 bit hafıza hücreleri var.

Şöyle bir açıklama var datasheette
(http://s24.postimg.cc/dizn56dph/Ekran_Al_nt_s.png)

64Mbit alan tam olarak 67.108.864 bitten oluşuyor

Bank için hesaplama yaparsak 256*4096*16=16.777.216 bite denk gelir

4 bank olduğundan  elde edilen değeri 4 ile çarpılırsa toplam hafıza elde ediliyor.
Ben burada 16 değerini anlayamadım. 16 hafıza bölgesinin genişliği değimi? Max 16bit data yazılabilir.

Birde benim SDRAMde yazdığım alanlar ile LCD'nin kullandığı alanlar birbirine karışmaması lazım.

SDRAM de bank adresi 0xD0000000 olarak tanımlanmış
LCD kütüphanesine baktım LCD_FRAME_BUFFER yine aynı şekilde  0xD0000000 olarak tanımlanmış. Yani aynı başlangıç adresleri SDRAM ile aynı.

Peki LCD toplamda ne kadar alan kullanıyor bunu çözemedim. 0xD0000000 adresine öyle bir ofset eklemeliyimki benim resim için kullandığım alan ile LCD'nin kullandığı alan birbirine karışmasın. Yazma ve okuma yaparkan belirlediğim adresten itibaren okuyup yazayım.

Fikri olan var mı?
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Karamel - 04 Şubat 2016, 02:18:14
hocam ben izninizle matematik ile ilgili sorunuza cevap vereyim. cunku digerlerini bilmiyorum.

gecen sene ram memory chip lerin dahasheetlerine bakinca. mesela 64mega bit yazdigini gordum. ben bunu 64 mega byte oldugunu saniyordum ama bank carpi rows carpi columns sayisi esit cikmiyordu. sonra dikkatli okuyunca anladim ki burada bir kelime oyunu var. sayi fazla gorunsun diye size bit cinsinden yazilmis. (yada belki baska bir sey icin boyle yapmislardir ama yaniltici birsey bu)

simdi sizin ram memory 16 bit cell lere sahip. 4 bank 4096 rows ve 256 columns var. bunlarin hepsini carpinca 64mega bit e ulasmaniz gerekir. buradaki 16 bu yuzden var.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 04 Şubat 2016, 03:19:49
Selam,
    Öncelikle http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf (http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf)  linkteki dökümanın  1593. sayfasını açınız. Burada FMC donanımının Memory Bank yapısının blok diagramını göreceksiniz. Dikkat ederseniz FMC donanımı güzel bir yapıda inşaa edilmis. Siz SDRAM kullanacaksanız iki adres seçenegi mevcut, 0xC000 0000 (SDRAM BANK1) ve 0xD000 0000(SDRAM BANK2). Bu adresler FMC adresleri yani siz işlemcide bu adrese bir data yazarsanız bu bigiler SDRAM'e seçilen bank' a yazılacak.

STM32F429 DMA2D LTDC' ye sahip oldugundan Layer1 için BANK1, layer 2 için Bank 2 adresini kullanıyor. FMC donanımı çok hızlı tarandığı için arka planda olay şöyle gelişiyor. TFT ekran buffer olarak Ram'i kullanıyor. Bunu şöyle yapıyor.

SDRAM_BANK1 -> DMA2D (Dma buffer) -> TFT EKRAN.

Siz yazılımda SDRAM_BANK1 (0xC000 0000 ) farz edelim, bu adrese *SDRAM_BANK1 = 100; şeklinde ulaşırsanız Ram'e data yazmış olursunuz yani TFT'ye bir yazı veya pixel yazıldığında bu işlem oluyor. Arka planda ise DMA2D donanımına bu adress atanmış ve DMA2D donanımı matris bir yapıya sahip yani her biri 24bit olan ve 1024x768 pixel den olşan iki ayrı alan düşününün(layer1,layer2) LCD frame buffer burası. İşte bu kısım okuma yaparken SDRAM_BANK1 (0xC000 0000) adresini tarıyor ve ekranda ram deki bilgiler görünüyor.
Bu işlemcide Alfa blending var işte 0xC000 0000 layer 1 0xD000 0000 layer 2 oluyor siz iki katmanı bank1 ve bank2 ye bağlıyıp ayrı frame bufferlar oluşturuyorsunuz ve DMA2D de aynı yapıda alana sahip.

Ram size ;
4096 * 256 = 1048576 bit
1048576 * 16bit = 16777216(16megaBit) ->
16777216 * 4(bank) = 67108864 (64 megabit)
                                 
Siz bu ram ile 24bitlik çözünürlükte 1024*768*24 = 18874368 (18 megabit civarı sanırım) layer1'i
aynı alanı birde Layer2 için tahsis ederseniz toplamda 36megabit alanı kullanmış olursunuz.

Ayrıca 320*240 bir TFT sürerken 1. resmi ilk 320*240'lık ram alanına yazdığınızı varsayalım, 2.resmide (320*240) offset ekleyerek yazarsanız  2 adet resmi aynı layer için tutmuş olursunuz ve okurkende offset'i ekleyerek okursanız sorun olmaz.

Burada TFT donanımı matris bir yapıya sahip olduğu için ram'i verilen çözünürlüğe göre tarıyor. Siz bir şey yapmıyorsunuz.
ST'nin resimleri diziye dönüştüren bir programı var. Örnegin siz 320*240'lık bir resmi açıp 16bit (5R 6G 5B) olarak işaretleyip dizi oluşturuyorsunuz bunuda yazılıma dahil edip init de ram'e yazarsanız bu resim lcd de görünüyor.

Bayagı karışık bir donanım, inanın size burda anlattıklarımı yazmak 45dk falan sürdü, birde tüm bu bilgilere ulaşıp ekranı kendi yaptığım bord da çalıştırmak için geçen süreyi siz hesap edin.

Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 04 Şubat 2016, 10:34:19
@F493

Hocam vakit ayırıp yazdığın için teşekkür ederim. Donanım dediğiniz gibi gerçekten karmaşık ve anlamak için iyice irdelemek gerekiyor.

Hocam peki SDRAM 4 banktan oluşuyor.  Ama FMC donanımında ise SDRAM için sadece 2 bank var. FMC kendi içerisinde SDRAM deki bankları otomatik mi arttırıyor?

Yanlışım varsa düzeltin biraz varsayım üzerine gideceğim.

FMC donanımı üzerindeki hafıza bölgesinin sdram üzerindeki hafıza bölgesine nasıl denk geldiğini anlayamadım. Mesela FMC donanımındaki Bank1 için konuşursak adres yapısı 0xC000 0000 dan başlayıp  0xD000 0000'a kadar gidiyor. Bu alanın hepsi kullanılıyormu bilmiyorum. Aradaki farka bakarsak 0x1000 0000 = 268435456 farklı adres görünür. Bu alana 4X64MB olarak tanımlamışlar. 64Mbit 67108864 bitten oluşuyordu. Gerçektende 4x67108864 = 268435456 yapar yani hesaplanan değeri tutuyor

Şimdi niye bit bazında adresleme yapıldığını anlamış gibiyim. Yanlışım yoksa eğer böyle yapılmasının sebebi daha hızlı yazma ve okuma yapılmasını sağlamak. Örneğin SD karttaki gibi 8 bitlik bölümlerden oluşmuyor. Bit bazında hafıza bölgeleri var. 4x64Mbit alana  8 bitlik değerler yazarsak 268435456/8 den 33554432 byte veri yazabiliriz. Aynı şekilde 16 bit için hesaplama yaparsak  268435456/16=16777216 tane 16 bitlik veri yazılabilir. Aynı şekilde 32 bit içinde hesaplama yapılabilir.

Bit bazında işlem yapmayı ben yüksek hız için yapılıyor şeklinde yorumladım ama gerçek sebebi nedir tam bilmiyorum.

Şimdi STM32F429'a tekrar dönersek Anlayamadığım birkaç nokta var.

Sdram kütüphanesinde bank adresi 0xD000 0000 olarak tanımlanmış. Bu FMC donanımında Bank2 nin adresi. Sdram'in boyutu ise 64Mbit yani 67108864 bitten oluşuyor. O halde FMC donanımındaki Bank2'nin hepsi kullanılmıyor diyebilirim.

@F493 Hocam bence FMC üzerindeki Bank1 de kullanılmıyor çünkü oraya karşılık gelecek bir hafıza birimi yok.

Anlamadığım nokta yine LTDC ile ilgili
Aşağıdaki kodlara bir bakın.

  /* Start Address configuration : the LCD Frame buffer is defined on SDRAM */   
  LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;
 
  /* Initialize LTDC layer 1 */
  LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);
 
  /* Configure Layer2 */
  /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */     
  LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET;
 
  /* Initialize LTDC layer 2 */
  LTDC_LayerInit(LTDC_Layer2, &LTDC_Layer_InitStruct);
 


LCD Frame Buffer 0xD000 0000 olarak tanımlı, Layer1 bu adrese tanımlı. Layer2 ise LCD_FRAME_BUFFER + BUFFER_OFFSET adresinden itibaren başlıyor.
BUFFER_OFFSET değeri 0x50000 olarak tanımlanmış. Yani LTDC deki 320x240 boyutundaki her bir katmanın boyutu 0x50000 olması gerekiyor. Fakat bunu 320x240 pixel için nasıl hesapladılar bilmiyorum. Ben hesaplayamadım.

Diğer bir sorum ise SDRAM örneği ile ilgili.

Hemen FWlin içerisinde FMC SDRAM örneğini açıp incelersek eğer SDRAM'e yazma yapma için aşağıdaki gibi bir döngü kullanıldığını görebilirsiniz.
  /* 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);
  }


Burada IS42S16400J_SIZE değeri 0x40000 olarak tanımlanmış. Veri boyutunun 16 bit olduğunu düşünürsek, 67108684/16=4194304 yani 0x400000 yapar.  Boyut meselesini de doğrulamış olduk.

Yazma işlemi SDRAM_BANK_ADDR yani 0xD000 0000 den itibaren yapılıyor. LCD de bu adresi kullandığı için veri yazıldığında ekrandaki görüntü değişmesi gerekmezmi? Ben dün yukarıdaki kod denedim ama lcd de herhangi bir değişim göremedim.

Teşekkürler.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 04 Şubat 2016, 12:01:37
Selam,

Hocam peki SDRAM 4 banktan oluşuyor.  Ama FMC donanımında ise SDRAM için sadece 2 bank var. FMC kendi içerisinde SDRAM deki bankları otomatik mi arttırıyor?

FMC donanımında size ayrılan yere yazıp aynı zamanda BA0, BA1(Bank adress) pinleri ile SDRAM bankı seçilmesi gerekiyor, 2bit ile 00,01,10,11 yani 4 kombinasyon seçilebilir. Zaten SDRAM de 4 adet bank'a sahip. FMC donanımı bahsettiğimiz SDRAM'dan çok daha büyük alana sahip yani siz 64Mbit degil 256Mbit başka ram de kullanabilirsiniz.

http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf (http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf)
sayfa 1596 da sdram fmc tablosu var, orada 12bit adress yapısıyla 32bit data bus ile 256Mbayte alan olduğundan bahsediyor. Bayağı bir alan yani.

FMC de 2 bank var doğru açıkçası denemek lazım, acaba bank1 e yazarken bank1'in sonuna geldiğimizde bank2 ye otomatik geçermi. Bana bu işlemi bizim yapmamız gerekir gibi geliyor. 24XX serisi eepromlarda da page olayı var siz page sonunda 1 byte dan fazla data yazarsanız o datanın kalan kısmı aynı page'in başından itibaren yazılmaya başlanıyor. Tahminim burada da böyle bir durum olabilir.


FMC donanımı üzerindeki hafıza bölgesinin sdram üzerindeki hafıza bölgesine nasıl denk geldiğini anlayamadım. Mesela FMC donanımındaki Bank1 için konuşursak adres yapısı 0xC000 0000 dan başlayıp  0xD000 0000'a kadar gidiyor. Bu alanın hepsi kullanılıyormu bilmiyorum. Aradaki farka bakarsak 0x1000 0000 = 268435456 farklı adres görünür. Bu alana 4X64MB olarak tanımlamışlar. 64Mbit 67108864 bitten oluşuyordu. Gerçektende 4x67108864 = 268435456 yapar yani hesaplanan değeri tutuyor


Dediğim gibi sayfa 1596 "Table 254. SDRAM address mapping" de 256 Mega Byte lık bir ram'i destekleyecek güçlü bir donanım var. Bu alanı atıyorum sdkarttan 100 adet 320*240'lık resmi buraya kopyalarsanız ve belli bir aralıklarda FMC adresini BUFFER offset kadar ileri alıp denerseniz LCD de resimleri slayt yapmış olursunuz.

LCD Frame Buffer 0xD000 0000 olarak tanımlı, Layer1 bu adrese tanımlı. Layer2 ise LCD_FRAME_BUFFER + BUFFER_OFFSET adresinden itibaren başlıyor.
BUFFER_OFFSET değeri 0x50000 olarak tanımlanmış. Yani LTDC deki 320x240 boyutundaki her bir katmanın boyutu 0x50000 olması gerekiyor. Fakat bunu 320x240 pixel için nasıl hesapladılar bilmiyorum. Ben hesaplayamadım


Burada FMC bank1 'in orta noktası gibi düşünelim  Bank1'in başlangıç adresi 0XD000 0000 bu değer,  biz 0XD000 0000 - ile 0XD005 0000 arasına Layer1 için 320*240 olacak şekilde istediğim kadar resim(ya da menu sayfası) koyabilirim.  0XD005 0000  ile 0XDFFF FFFF arasına da Layer2 için istediğim kadar resim vs koyabilirim. Olay bu siz 0X50000  değerine takılmayın istediniz gibi oranize edebilirsiniz. Ben layer1'i az kullanacagım layer2 de asıl resimler menu vs olacak derseniz ozaman Bu alanı az ayırıp kullanabilirsiniz.

Yazılıma şu fonksiyonu ekleyip resim varsa bu fonskiyonu kullanarak yazmayı deneyin.
prototip
void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize);

Kullanımı;
SDRAM_WriteBuffer((uint32_t *)AcilisEkraniLogo, 0xD0000000 , 65280);
ilk başta bende çalıştıramamıştım daha sonra böyle bir düzenleme yaptım çalıtı.


void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)
{
  //__IO uint32_t write_pointer = (uint32_t)uwWriteAddress;

  /* Disable write protection */
  FMC_SDRAMWriteProtectionConfig(FMC_Bank2_SDRAM, DISABLE);
 
  /* Wait until the SDRAM controller is ready */
  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)
  {
  }

  /* ORJINAL
  // While there is data to write
  for (; uwBufferSize != 0; uwBufferSize--)
  {
    // Transfer data to the memory
    *(uint32_t *) (SDRAM_BANK_ADDR + write_pointer) = *pBuffer++;

    // Increment the address
    write_pointer += 4;
  }*/

  for (; uwBufferSize != 0; uwBufferSize--)
  {
    // Transfer data to the memory
    *(__IO uint32_t *) (uwWriteAddress) = *pBuffer;

    // Increment the address
    //write_pointer += 4;
      //uwWriteAddress++;
    uwWriteAddress += 4;
      pBuffer++;
  } 
  /*
  // Write data to memory
  for(; BufferSize != 0; BufferSize--)
  {
    *(__IO uint32_t *)pSdramAddress = *pSrcBuffer;
    pSrcBuffer++;
    pSdramAddress++;         
  }
  */
}



Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 04 Şubat 2016, 13:32:24
Hocam yaptığım uygulamadan birazdaha bahsetmem lazım.

OV7670 ile görüntüler alıyorum. 320x240 boyutunda ve 16bit RGB565 formatında. Her bir frameyi otomatikmen RAM'e kaydetmek istiyorum. Fakat kayıt yerim LCD nin kullandığı alanlarla karışmasın istiyorum. Benim RAM'e kaydettiğim resim LCD de görünmesin.

Bu iş için kullanacağım alan Layer2 Frame buffer + 0x50000 olmalı sanırım.

Layer2 Frame buffer 0xD005 0000 adresinden başlıyordu. Bu adrese 0x50000 eklersem 0xD00A0000 adresini elde ederim yani ben bu adresten itibaren yazmaya başlarsam LCD'nin kullandığı alanlara dokunmamış olurum.

Alıntı YapBurada FMC bank1 'in orta noktası gibi düşünelim  Bank1'in başlangıç adresi 0XD000 0000 bu değer,  biz 0XD000 0000 - ile 0XD005 0000 arasına Layer1 için 320*240 olacak şekilde istediğim kadar resim(ya da menu sayfası) koyabilirim.  0XD005 0000  ile 0XDFFF FFFF arasına da Layer2 için istediğim kadar resim vs koyabilirim. Olay bu siz 0X50000  değerine takılmayın istediniz gibi oranize edebilirsiniz. Ben layer1'i az kullanacagım layer2 de asıl resimler menu vs olacak derseniz ozaman Bu alanı az ayırıp kullanabilirsiniz.

Hocam siz böyle demişsiniz ama burada da bir terslik var. Bahsettiğiniz 0xD000 0000 alanı ile 0xDFFFFFFF alanı 256Mbit alan için. Bizim kart üzerinde bu kadar ram yokki. Bizim Ram'in boyutu 64Mbit yani 67108864 bit oda 0x4000000 yapar.
Yani sonuç olarak bizim Bizim FMC Bank2 de kullanabileceğimiz alan 0xD0000000 dan başlayıp 0xD4000000 adresinde son buluyor.

LCD Layer1 ve Layer 2 ile birlikte ilk 0xA0000 adresini kullandığına göre Bizim kullanımımıza kalan kısımlar 0xD00A0000 adresinden başlayıp 0xD4000000 adresinde son buluyor. Yani hesaplarıma göre durum böyle görünüyor.

0xD4000000 adresinden 0xD00A0000 çıkarılırsa sonuç olarak 0x3F60000 elde edilir. Yani 66453504 bittik bir hafıza bölgesine denk gelir. Burayada 320x240 boyutunda 16 bit renk çözünürlüğüne sahip resimlerden yaklaşık 54 adet sığar.

Dediğiniz gibi bit bazında düşününce bile bayağı resim sığıyor. Üstelik sadece 64Mbit için.

Herneyse sdram olayını anladım sanırım. @F493 tekrardan teşekkür ederim.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 04 Şubat 2016, 14:14:13
Selam,

Hocam siz böyle demişsiniz ama burada da bir terslik var. Bahsettiğiniz 0xD000 0000 alanı ile 0xDFFFFFFF alanı 256Mbit alan için. Bizim kart üzerinde bu kadar ram yokki. Bizim Ram'in boyutu 64Mbit yani 67108864 bit oda 0x4000000 yapar.
Yani sonuç olarak bizim Bizim FMC Bank2 de kullanabileceğimiz alan 0xD0000000 dan başlayıp 0xD4000000 adresinde son buluyor.


Orada bir terslik yok, daha öncede bahsettim FMC alanı şuan kullanılan 64Mbit ram den daha buyuk. O nedenle dediğiniz gibi bu ram için FMC alanı tamamıyla kullanılamaz.

Bana kalırsa şöyle bir deney yapın.

OV7670 'dan gelen datayı 320x240'lık Ram de tanımlanmış diziye yazın. Sadece 1 kere.
Daha sonra bu diziyi 0xD000 0000 adresine komple kopyalayın.
Ekranda kameranın screenshot'ını görmeniz gerekli. İlk önce bunu başarmak lazım.

Daha sonra kamera goruntusunu başka bir offsete 0XD000 0000 + 0x50000 adresine yazın. Bir butonla LCD'nin frame buffer'ini switch edin.
0XD000 0000 adresini seçerseniz ekrandaki yazılara menu vs gorunsun.
0XD000 0000 + 0x50000 adresini seçerseniz ekranda kamera görüntüsü devamlı görünsün.

Önerim bu şekilde sonuçlarıda paylaşırsanız konu amacına ulaşır.

Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 04 Şubat 2016, 15:19:35
Evet akşam deneyip sonucu paylaşacağım.

Ben aslında hala LCD için ayrınlan 0x50000 alanı nasıl belirlemişler onu anlayamadım. Eğer gerçekten LCD layer için ayrılan frame buffer 320x240 çözünürlükte olsaydı ayrılan alan 320*240*16=1228800 bit olması gerekir Yani 0x12C000 olması lazımdı.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 04 Şubat 2016, 15:57:31
Selam,

Hesaplama şu şekilde yapılıyor;

Memory Requirement (KiloBytes) = (bpp     *  Width  *  Height)  /  8
                                153.6 KB      = (16bit   *   320    *   240   )  /  8
                       
Yani sizin 320*240 bir TFT için 16Bitlik çözünürlükte 153.6 KB alana ihtiyacınız var.

SDRAM Bank1 256 mega Byte alana sahip.  Bizim ise 153.6 KB alana ihtiyacımız var.

0x50000 ifadesi byte anlamında bir ifadedir. Yani burada  her basamak 1 byte alan ifade eder. Siz sonucu bit olan 1228800 bu degeri direk o alanda gösteremezsiniz. Dogrusu  153.6 KB = 153600 byte = 0X25800 demektir.

   0XD000 0000
           +
   0X0002 5800

=0XD002 5800 sonucu çıkar. Yani siz layer2 ye bu adresi verseniz bile olur. Yani buldugumuz bu adress 320*240'lık bir LCD için gereken buffer alanı.

0XD002 5800
0x0005  0000

Görüldüğü gibi 0X50000 verilen offset noktası bizim bulduğumuz gerekli olan degerin iki katından fazla, yani örnek uygulamayı  geliştiren ST'nin application Enginar'ı  ;) böyle uygun görmüş.

Esen kalın.


Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: engerex - 04 Şubat 2016, 18:52:32
Bildiğim kadarıyla kart üzerindeki yonga 128 Mbit ancak 64Mbitlik kısma erişilir.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 04 Şubat 2016, 23:16:12
Ekrana yazma olayını test ettim.

Normalde LAyer1 ekranda görünmüyor. Layer 2 için ayrılmış bölge üzerinde yazma yaptım

Basit bir for döngüsü ile doğrudan RAM'e yazma yaptım.

for(ram_counter=0;ram_counter<76800;ram_counter++)
{
*(__IO uint16_t*) (SDRAM_BANK_ADDR + BUFFER_OFFSET + ram_counter) = 0xFFFF;
}


Ekranı ilk başta kırmızıya boyuyorum sonra yukarıdaki kodlar çalışınca ekranın yarısı beyaz oluyor. :-\ Tamamı neden olmadı tam olarak anlayamadım. Hemen LCD_Clear Fonksiyonuna baktım.

Orada ise aşağıdaki gibi bir döngü var
  for (index = 0x00; index < BUFFER_OFFSET; index++)
  {
    *(__IO uint16_t*)(CurrentFrameBuffer + (2*index)) = Color;
  }


Döngünün boyutu Buffer Ofset kadar. Yani bu durumda Buffer_Ofset değerinin rastgele belirlemediğini söyleyebiliriz.

Bu LTDC'nin ram alanı nasıl organize edilmiş anlamak gerçekten zor.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 04 Şubat 2016, 23:35:12
Selam,

  Sorun yok,
1. olarak
for(ram_counter=0;ram_counter<76800;ram_counter++)  olan kodu
for(ram_counter=0;ram_counter<76800 * 2;ram_counter++)  şeklinde yapın deneyin,


2. olarak
Döngünün boyutu Buffer Ofset kadar. Yani bu durumda Buffer_Ofset değerinin rastgele belirlemediğini söyleyebiliriz.
Bu LTDC'nin ram alanı nasıl organize edilmiş anlamak gerçekten zor.
 

Bu normal değil mi? LCD'yi clear etmek demek ona tahsis edilmiş alanı temizlemektir. Tüm resimleri temizlemek gibi düşünün.

Yukardaki kodu deneyip tekrar dönüş yaparmısınız?

Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 05 Şubat 2016, 00:11:13
Hocam o şekilde çalışıyor problem yok ama başka bir problem var. Sıkıntı büyük gibi. Şuan kart üzerinde çalışıyorum.

Yazma işlemini şu şekilde yaptım.

   for(ram_counter=0;ram_counter<76800;ram_counter++)
   {
        *(__IO uint8_t*) (0xD00A0000 + ram_counter) = 0xFF;
         }

Yazma işlemini yukarıdaki gibi 0xD00A0000 adresinden itibaren yaptığım işlemci donup kalıyor. Bu neden olurki?
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 05 Şubat 2016, 00:19:42
Selam,

  En son for döngüsünü 76800 * 2 yani  153.6 KB yapınca düzeldi. Ekranda renk'in yarım çıkmasının nedeni de buydu zaten. Daha önce yaptığımız hesaplamada 320*240 için gereken alan buydu(153600->153,6Kb). Siz döngüyü 76800 yapınca sadece ekranın yarısına ait alanının değişme sebebi budur.

Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 05 Şubat 2016, 00:27:41
Tamamdır hocam sorunu çözdüm. Şuan istediğim gibi istediğim adrese yazma okuma yapabiliyorum. Ufak bir yazım hatası yapmışım.

Ayrıca yazma işlemi sırasında FMC donanımında yazmadan sonra flag boşaldımı onada bakmak gerekiyor.
while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)
{

}

Tekrardan teşekkür ederim.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 05 Şubat 2016, 00:33:35
Selam,

Bu tip kontrolleri fonksiyonların içine koymak lazım ki baş ağrıtmasın.

Şuan olayı bayagı anladın sanırım.  Bundan sonra donanım konusunda bayagı fikrin olmuştur. Bende kendi projemde şuan ana yazılım senaryo ile uğraşıyorum önümüzdeki günlerde Stemwin ile bir menu hazırlamam gerekecek, beni de o kısım düşündürüyor.

Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 05 Şubat 2016, 00:39:06
Elbette bilgim dahilinde ise neden olmasın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 06 Şubat 2016, 00:20:17
Konuyu kapatmadan şu aklımdaki BUFFER_OFSET meselesinede cevap bulmak istiyorum. LCD ekranın SDRAM üzerinde nasıl bir hafıza düzeni var onu kafamda oturtmaya çalışıyorum.

BUFFER OFSET değeri 0x50000 olarak tanımlı . Yani desimal olarak  327680 sayısına denk geliyor.

Kütüphanenin orjinal LCD_Clear fonksiyonu aşağıdaki gibi .

  for (index = 0x00; index < BUFFER_OFFSET; index++)
  {
    *(__IO uint16_t*)(CurrentFrameBuffer + (2*index)) = Color;
  }


Buda benim yazdığım LCD_Clear Fonksiyonu
for(ram_counter=0;ram_counter<76800*2;ram_counter++)
{
    *(__IO uint16_t*) (CurrentFrameBuffer + ram_counter) = Color;
}


Orjinal kodda adres hesaplanırken index değeri neden 2 ile çarpılıyor bunu anlayamıyorum.
Yukarıdaki kodları yavaşlatıp çalıştırdığımda ekranın dolduruluş şeklinin aynı olduğunu görebiliyorum. Her bir pixel ramde ne kadar yer kaplıyor çözemedim. Varmı çözebilecek olan?
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 06 Şubat 2016, 02:23:52
Alıntı yapılan: Mucit23 - 06 Şubat 2016, 00:20:17
Varmı çözebilecek olan?

Çok cool  :) iddaalı.

CurrentFrameBuffer = 0xC000 0000 farz ediyorum
BUFFER OFFSET = 0X50000

CurrentFrameBuffer ile BUFFER OFFSET arası  Layer1 için ayrılmış olsun 
(CurrentFrameBuffer + BUFFER OFFSET)  ile 0xCFFF FFFF arası layer2 . 

Daha öncede bahsettiğim gibi 320*240 ekran için 153.6 KB alan gerekli.

for(ram_counter=0;ram_counter<76800*2;ram_counter++) // 76800*2 = 153.6 KB demektir.
{
    *(__IO uint16_t*) (CurrentFrameBuffer + ram_counter) = Color;
}


Üst satırdaki kod ile şimdi yazdığım aynı işi yapar,

for(ram_counter=0;ram_counter<76800;ram_counter++)
{
    *(__IO uint16_t*) (CurrentFrameBuffer + (ram_counter *2) ) = Color;
}


Aslında doğru olan bu kod. ram_counter * 2 demek hep çift adres adımlarıyla arttırmak demek. Nedeni? Çünkü Color değişkeni 16bit. Döngü sonunda CurrentFrameBuffer + 153598 ileri gitmiş olacagız. Byte açısından böyle.


for (index = 0x00; index < BUFFER_OFFSET; index++)
  {
    *(__IO uint16_t*)(CurrentFrameBuffer + (2*index)) = Color;
  }

Bu kodda ise CurrentFrameBuffer ile (CurrentFrameBuffer + BUFFER_OFFSET) alanını çift adres adımlarıyla Layer2 yi temizliyor. İki işlemde aynı

76800*2 olan for döngüsünde  sadece 153.6 KB temizleniyor.
BUFFER_OFFSET degeri de byte cinsinden aslında 655Kb'lık alanı temizliyor. ( 2*index demek döngünün sonunda (BUFFER_OFFSET-1)*2 noktasına erişmek demek.)
Siz bu bilgiler ışığında kendi alanlarınızı yaratabilirsiniz. Örneğin,


#define _320_240_16BIT_FRAME_BUFFER_SIZE                   0X25800 // 153600 == 153.6KB
#define CAMERA_1_FRAME_BUFFER                             _320_240_16BIT_FRAME_BUFFER_SIZE
#define LCD_TEXT_FRAME_BUFFER                             (_320_240_16BIT_FRAME_BUFFER_SIZE*2)



Kullanımı

for(ram_counter=0;ram_counter < (_320_240_16BIT_FRAME_BUFFER_SIZE  / 2) ;ram_counter++)
{
    *(__IO uint16_t*) (CurrentFrameBuffer + (ram_counter *2) ) = Color;
}

for(ram_counter=0;ram_counter < (_320_240_16BIT_FRAME_BUFFER_SIZE  / 2) ;ram_counter++)
{
    *(__IO uint16_t*) (CurrentFrameBuffer + LCD_TEXT_FRAME_BUFFER   + (ram_counter *2) ) = Color;
}
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 06 Şubat 2016, 11:11:14
Vakit ayırdığınız için teşekkürler. Şimdi debugda clear fonksiyonlarını inceledim.

Şimdi meseleyi anladım. Aslında dediğiniz gibi durum tamamen ST mühendislerinin böyle uygun görmesinden kaynaklanıyor.
Normalde her bir pixel 16 bit yer kapladığından ram counteri 2 şer 2 şer arttırmak gerekiyor. Debugda bunu gördüm. ram_couunterin her iki artışında bir pixel renk değiştiriyordu.

for (index = 0x00; index < BUFFER_OFFSET; index++)
  {
    *(__IO uint16_t*)(CurrentFrameBuffer + (2*index)) = Color;
  }

Bu kodda ise BUFFER_OFSET 0x50000 seçilmesi bence gereksiz. Öyle görünüyor çünkü normalde her bir frame 153kb yer kaplıyor hafızada yukarıdaki kod boş yere hafızadan 655kb alanı temizliyor. Bunun anlamak için for döngüsünün başlangıç değerini 76800 verdim ekranda hiçbir yer değişmedi. 76790 verdim sadece son 10 pixel renk değiştirdi.

Bu durum ilk başta çok soru işareti oluşturdu ama şimdi anladım. BUFFER_OFSET yerine orjinal kütüphanede 76800 yazdım ben. Daha hızlı çalışır.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 08 Şubat 2016, 14:44:25
Benzer bir soruyu STM32F7 Disco üzerindeki SDRAM için sorayım.

Kart üzerinde Micron MT48LC4M32B2 ram var
https://www.micron.com/~/media/documents/products/data-sheet/dram/128mb_x32_sdram.pdf (https://www.micron.com/~/media/documents/products/data-sheet/dram/128mb_x32_sdram.pdf)

PDF'den anladığım kadarıyla toplam kapasite 128Mbyte. Ve Burada bit bazında değil bytle ile işlem yapılıyor.

STM32F7 üzerindeki SDRAM örneğinde boyut aşağıdaki gibi tanımlanmış

#define SDRAM_DEVICE_SIZE  ((uint32_t)0x800000)  /* SDRAM device size in MBytes */

desimal olarak 8388608 byte kullanıma hazır bir alan var.

128Mbyte alan için neden boyutu 0x800000 tanımlamışlar?
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: F493 - 08 Şubat 2016, 15:45:16
Selam Mucit23,

SDRAM Boyutu 128 Mega Bit (byte değil)

Öncelikle   STM32F7 yazılım tarafındaki #define SDRAM_DEVICE_SIZE  ((uint32_t)0x800000)  /* SDRAM device size in MBytes */   ne anlama geliyor bir bakalım.
0x800000 -> 8388608 byte -> 8388608 / 1024 = 8192KB -> 8192KB / 1024 = 8Mbyte


Şimdi gelelim SDRAM'e,  128 Mega Bit  = 128 / 16bit = 8 Mega Byte

Yani her bir gözeneği 16bit olan 128Mega Bit'lik bu SDRAM 8Mega Byte alana sahipmiş.


Esen kalın.
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: Mucit23 - 08 Şubat 2016, 21:24:19
Hocam teşekkürler anladım meseleyi. Ben aslında Mbyte olduğunu düşünmüştüm ilk başta. Mb=Mbit olacak. Kavram karışıklılığı
Başlık: Ynt: STM32F429 SDRAM konusunda anlayamadıklarım
Gönderen: KingSlayyer - 09 Şubat 2020, 17:18:10
@F493 Sayın Hocam , @Mucit23 Sayın üstad, aradan 4 yıl geçmiş ama bir projem hakkında yardıma ihtiyacım var eğer mesajımı görürseniz yardımcı olabilir misiniz ?