Notice: Undefined variable: ub in /home/ictrclub/blog_ictr/wp-content/plugins/advanced-page-visit-counter/public/class-advanced-page-visit-counter-public.php on line 148

Notice: Undefined variable: ub in /home/ictrclub/blog_ictr/wp-content/plugins/advanced-page-visit-counter/public/class-advanced-page-visit-counter-public.php on line 160
STM32 ile FSMC Birimini Kullanarak TFT LCD Sürmek - Blog

STM32 ile FSMC Birimini Kullanarak TFT LCD Sürmek

Ziyaretci:1883

Özellikle paralel arayüz kullanarak TFT sürmek istiyorsanız karşılaşacağınız hız problemi bir çok platformda gözle görülür bir sorun haline gelecek. Eski nesil MCU’lardan hatırlayacağınız paralel arayüzler TFT sürmek için bir çözüm olabilir. Bu yazıda STM32 içerisinde bulunan FSMC (Flexible Static Memory Controller) birimi üzerine konuşacağız. Keyifli okumalar.

Bilindiği üzere TFT sürmek aslında bir RAM’e erişmekten ibarettir. Bu RAM’e ne kadar hızlı erişirseniz, elde edeceğiniz performans o kadar iyi olur. Bu yüzden hız istenen yerlerde arayüz protokolünü seçerken SPI, IIC protokollerini içeren TFT arayüzlerinden uzak durmak gerekir. Bu aşamada 8, 16 Bit paralel arayüzleri kullanmak performansı hat safhaya çıkaracaktır. Paralel arayüzle birlikte gelen fazla pin kullanma ihtiyacı ve paralel arayüzü kontrol edecek birim ihtiyacı bu uygulamanın dezavantajı sayılabilir fakat hızlı bir TFT ihtiyacı için bu dezavantajlar rahatlıkla göz ardı edilebilir ki zaten paralel arayüzü sürecek birim FSMC olarak STM32 içerisinde bulunmaktadır.

Paralel arayüzü hızlı bir şekilde kontrol etmek adına geliştirilen FSMC birimi aslında bir SRAM sürücüsünden ibarettir. Hatta verilen Data/Command verileri için diğer RS, RW, RD gibi sinyalleri otomatik olarak üretmesi SRAM sürme işlemini sadece bir adrese erişmekten ibaret kılmaktadır. FSMC STM32 ailesinde en STM32F1 serisinden itibaren bulunmaktadır fakat her modelde bulunmadığına dikkat edin. STM32F1 için 100 pinli entegrelerde bulunur.

Benim bu uygulama için kullandığım HY-STM32-100P adlı kit üzerinde 2.4 Inc TFT bulunuyor. 240×320 piksel olan bu TFT paralel arayüze sahip. Bu uygulamada FSMC birimini 16 Bit olarak çalıştırıp ekrana bir resim basacağız.

Öncelikle D ve E portunda bulunan bağlantıları ayarlayarak başlayalım. Burada LCD Data pinleri, RS, RW, RD, NE1 pinlerini alternatif fonksiyon moduna alarak hazırlayalım.

LCD Donanımsal reset pinine sahip olduğu için standart GPIO_Mode_Out_PP olarak ayarlanır. Data pinleri ise birime özel olduğundan GPIO_Mode_AF_PP olarak ayarlanır. Burada RW, RD, RS ve NE1 pinleri birime özeldir.

  • FSMC için A16 pini, LCD için RS pinine denktir
  • FSMC için NOE pini, LCD için RD pinine denktir
  • FSMC için NEW pini, LCD için RW pinine denktirs
  • FSMC için NE1 pini, LCD için CS pinine denktir
  • FSMC için D0-15 pinleri, LCD için Data pinlerine denktir

Buradan anlaşılacağı üzere bilenen 8080 bağlantı arayüzü LCD için aşağıdaki şekilde olmaktadır.

Bağlantılardan sonra FSMC ayarlarını aşağıdaki gibi yapılır.

Burada iki ayar bulunur. Birincisi birim için yapılan ayar, ikincisi ise zamanlama ayarıdır. Bu ayarları detaylı şekilde öğrenmek isteyenler ST’nin yayınladığı FSMC uygulama notunu okuyabilirler.

Bundan sonra TFT hangi sürücü entegresini kullanıyorsa ona uygun komutları yollamak TFT’yi sürmeye hazır hale getirecektir. Bu bilgileri sürücünün datasheet dökümanından elde edebilirsiniz. Kullandığım geliştirme kiti üzerinde ILI9325 sürücüsü bulunmaktadır. Artık TFT’ye komut/veri yollamak için her şey hazır durumda. Bu verileri bir adrese erişiyor gibi kullanmaktan bahsetmiştim. Bu işlem için FSMC adreslerine erişmek yeterli. Bu adresler STM32F103VET6 için şu şekilde tanımlıdır.

Aşağıdaki fonksiyonları kullanarak gerekli erişimi sağlamak mümkün.

Son olarak LCD hazırlama rutini aşağıdaki gibi tamamlanır. Bundan sonra ekrana dilediğimiz gibi erişebiliriz.

Örnek olması adına bu TFT’ye bir resim basmak için şu fonksiyonu kullanabiliriz. Burada başlangıç adresine dönüp sırayla 240×320 yani = 76800 adet byte veri basmak gerekiyor.

Bir .h dosyasına resmin diziye dönüştürülmüş halini yükleyerek bu çalışmayı tamamlayabiliriz. Ben bitmap1 adında bir diziyi ekran bastım ve aldığım görüntü aşağıda gözükmektedir.



Kod derlenip yüklendikten bir kaç saniye sonra resim ekrana basılacaktır. Bunun sebebi Init fonksiyonu içerisinde bir takım gecikmeler olmasındandır.

Sonuç olarak

FSMC’nin aslında ilgili adreslere verilen değerler için sinyalleri otomatik olarak oluşturan ve RAM’e erişir gibi çalışmamızı sağlayan bir birim olduğu görülür. Paralel arayüzler için sağladığı hız avantajı, bir çok aygıt için FSMC’nin tercih edilme sebebi arasındadır. Bu birimin daha gelişmiş olan ve sadece LCD sürmeye yarayan birimlerine de göz atmanızı tavsiye ederim. Bunlar FSMC, FMC, LTDC olarak sıralanmaktadır.

Projeye github hesabı üzerinden ulaşabilirsiniz. Bir başka yazıda görüşmek üzere. Esen kalın.

Baran EKREM

 

[Düzenleme: Konuyla alakalı Soru Cevap Platformu için Link]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir