STM32 – SD KARTTAN .bmp DOSYA OKUMAK ve TFT ÜZERİNDE GÖRÜNTÜLEMEK

KONUYLA İLGİLİ YAYINLAR

Aşağıdaki bölümlerde STM32F103 ile SD kart ve TFT ekran kullanımını görmüştük.

Önceki aşamalarda TFT Ekranın sürülmesi, SD kartın açılıp okunması gibi temel işlemleri ele almıştık. Şimdi sıra SD karttan .bmp uzantılı fotoğraf dosyalarının okunarak TFT ekranda görüntülenmesine geldi.

PROJE KURULUMU

STM32F103C8 tabanlı bir kit kullanıyorum. Üzerinde de SPI girişli 2.4″ ILI9341 320×240 TFT ekran var. Kit üzerindeki mavi modül “pico” olarak anılan Çin yapımı harcı alem bir ürün. Yeşil adaptör plaketi benim tasarımım olan bir plaket; TFT ekranın kolayca takılmasını, SPI, I2C, UART ve GPIO pinlerine kolay erişim sağlıyor.

Adaptör plaketi üzerinde STM32F103C8 Pico modül, alt taraftaki soketlere takılı olan TFT kısmen görülüyor.

Programlama çalışmaları içi STM32 CubeIDE platformunu kullanıyorum.

ÖNCESİNDE YAPILMASI GEREKEN ÇALIŞMALAR

Önceki yayınlarda anlattığım gibi, yeni bir proje oluşturulup TFT ve, SD kart ile ilgili dosyaların eklenmesi gerekiyor. Burada bu işlerin yapılışını tekrarlamayacağım. Projenin dosya yapısı aşağıdaki gibi olacak :

SD Karttan .bmp dosya okuyup TFT üzerinde görüntülemek üzere program yapısı

Burada project explorer penceresinde seçili olarak görünen dosya ve klasörler var. Bunlar, SMM32 CubeIDE ile proje kurulduktan sonra eklenmesi gereken dosyalar. Kopyala yapıştır tekniği ile projeye eklenebiliyorlar. Bu doyalardan fatfs_sd.c/h ikilisini controllersTech.com sitesinden aldım, başka yerlerden de bulunabilir mi bilmiyorum. Display sürücü klasöründekiler ve SD_Card_2020.c dosyaları bana ait.

OKUMA VE GÖRÜNTÜLEME FONKSİYONLARI

SD karttan .bmp dosyaları okumak için readBmpFile(..), okunan dosyayı TFT üzerinde görüntülemek için de TFT_DrawBitmap(..) fonksiyonlarını kullanıyoruz. Bunlardan ilki SD_Card_2020.c dosyası içinde, ikincisi de tft_basic.c içinde bulunuyor. Bu iki dosyanın ilk sürümleri 2017 yılına ait. Bu yayından önce biraz güncelleme ve temizlik yaptım.

readBmpFile() FONKSİYONU

Bu fonksiyondan önce sdCard_spi_init(void) fonksiyonu çağrılarak SD kartın açılması gerekiyor.

Fonksiyon argümanları; TFT nin üzerinde fotpğrafın yerleştirileceği koordinatlar, ve çizilecek olan .bmp dosya adresinden ibaret. Fotoğraf boyutunun TFT ekran yatay/düşey piksel sayılarına sığacak şekilde ayarlanmış olması gerekir. Dosyanın da 16, 24 ya da 32 bit Windows BMP standardına uygun olması gerekir. Bu kodlar uygunluk kontrolu yapmıyor.

Burada kullanılacak dosyaları JPEG den BMP’e çeviri yapıp boyut ayarlayabilen uygulamalardan birisi ile elde edebiliyoruz. Ben MacOS üzerinde PaintFX uygulamasını kullandım. Save as BMP seçeceği ile istenen format elde edilebiliyor.

Bu fonksiyon önce argümanları arasında yer alan bmpName isimli (örneğin “selcuk.BMP” olarak verilmiş olabilir) dosyayı f_open() ile açarak dosya bilgilerini “FIL” yapısındaki bmpFile içine yükler. bmpFile içeriğinde dosyamıza ilişkin epey bilgi var ama biz bunlarla ilgilenmiyoruz. Dosyayı açıp .bmp dosyanın özelliklerine bakacağız.

f_lseek() ile dosyamızın başına gidip, f_read() ile BMP dosyanın başlığını bmpHeader içine okuyoruz.

Burada adı geçen f_…() seklindeki fonksiyonların FATFS kütüphanesinin ff.c/h dosyaların içinde bulunduğunu hatırlatayım.

54 byte uzunluğundaki “bmpHeader” veri yapısı BMP dosyamızın boyut ve özelliklerini içeren bilgileri içeriyor. Bunun yapısı ve fonksiyon içinde kullanılan değişkenler SD_Card_2020.c içinde aşağıdaki gibi tanımlı :

Fonksiyonun ilk bölümünde buradaki fsize, offset, bpp, w, h bilgilerini kullanarak resim genişliğini, yüksekliğini, piksel başına bit sayısını, hesaplıyoruz.okunacak toplam byte sayısını hesaplıyoruz.

Resim boyutlarını bildiğimize göre 444. satırda TFT üzerinde çizileceği pencereyi tanımlıyoruz. Ardından da TFT_RS, TFT_CS pinleri ile TFT yi pixel veri dinleme moduna sokuyoruz.

450.-479. satırlar arasındaki do çevrimi ile buffer[] a sığacak sayılarda byte okuyarak TFT_DrawBitmap() fonksiyonuna gönderiyoruz. 2, 3 ve 4 byte lık bmp piksel formatları ile uyumlu çalışabilmek için buffer kapasitesinin 3 ve 4 ün katları halinde yani 12 nin katı olması gerekiyor.

TFT_DrawBitmap() FONKSİYONU

Bu fonksiyon 565 RGB 16 bit piksel bilgilerini TFT ye gönderiyor. Her piksel için 2 byte olacak şekilde buff[] dizisine doldurarak, hangisi kullanılıyorsa, SPI ya da Paralel port üzerinden gönderiyor.

buff dizisi tft_basic.c de aşağıdaki gibi tanımlı:

#define SPIbuffSize 264  /* 16, 24 ve 32 bit BMP dosyalarla uyumlu olması için 4 ve 3 ün katları olması gerekiyor */
uint8_t buff[SPIbuffSize];

TFT_DrawBitMap() fonksiyonu 24 ve 32 bit formatında gelen piksel verilerini de TFT ye göndermeden önce 565 RGB formatına çeviriyor.

FONKSİYONLARIN ÇAĞRILMASI VE SONUÇ

Test için main.c içinden readBitMapFile(“selcuk.BMP”) şeklinde bir komut ile istenen bmp dosyanın okunup görüntülenmesi sağlanabiliyor. Dosyaların SD kart üzerinde root directory içinde bulunması gerekiyor. Aşağıda 320×252 px, 24 bir bir fotoğrafın verdiği sonuç görülüyor. Burada pek belli değil ama fotonun enindeki 12 piksellik taşmadan dolayı bir sol kenarda bir bozulma var.

SLIDE SHOW FONKSİYONU

Main.c içinde SD karttaki BMP dosyaları tarayarak ard arda tekrarlayarak görüntüleyen bir fonksiyonumuz da var.

Bu yayının sonu – Selçuk Özbayraktar Temmuz 2020

Leave a Reply

Your email address will not be published. Required fields are marked *