STM32 DMA (Doğrudan Bellek Erişimi) Birimine Giriş

Önceki makalelerimizde HAL kütüphanesini kullanırken HAL kütüphanesinin sürücülerinde üç farklı fonksiyon çeşidi görmekteydik. Bunlardan biri polling yani normal program akışında kullanılan fonksiyonlar, diğeri kesme fonksiyonları ve bir diğeri de DMA yani doğruden bellek erişimi birimi için kullanılan fonksiyonlardı. Kesmeleri daha önce gördüğümüz için bunlara yabancı değiliz fakat her birimin fonksiyonlarını incelediğimizde DMA ile alakalı kısımlar karşımıza çıkmaktadır. O yüzden DMA’nın ne olduğunu öğrenmekle konumuza devam edelim dedim. DMA hakkında ilk bilgiyi daha önce datasheeti incelediğimizde sizlere vermiştik ama şimdi referans kılavuzunu okuyarak daha ayrıntılı öğreneceğiz.

Doğrudan bellek erişimi anlamına gelen DMA birimi çevre birimleri ve hafıza ünitesi arasında yüksek hızlı veri iletimini sağlamaktadır. Mikroişlemclilerin en çok kullanılan komutlarının veri yazma komutları olduğunu ve veri yazmak için mikroişlemciyi fazlaca meşgul ettiğimizi bilirsek DMA’nın önemini daha rahat kavrayabiliriz. DMA birimi sayesinde CPU tarafından herhangi bir işlem yapılmadan veri taşınabilir ve bu süreçte CPU diğer komutları işlemek üzere serbest bırakılmış olur. Böylelikle DMA kullandığımız bir programda işlemci yükü hafiflemiş olur ve daha performanslı çalışma imkanı buluruz.

Kulağa oldukça basit bir görevi üstlenen birim gibi gelse de 8-bit mikrodenetleyiciler üzerinde çalışırken hiç görmediğimiz bir birim olduğundan yeni öğreneceğimiz bir konu olarak karşımıza çıkmaktadır. STM32F303, STM32F398 denetleyicilerde iki adet DMA denetimcisi bulunmaktadır ve toplamda 12 adet DMA kanalımız vardır. Her kanal bir veya birden fazla çevre birimine yönlendirilip kullanılabilir.

DMA biriminin ana özelliklerine geldiğimizde ise şunları görürüz.

  • 12 bağımsız ayarlanabilir kanal (talep)
  • Her kanal donanımın DMA talebine yönlendirilmiştir ve yazılımsal tetikleme yapılabilir. Ayarlama yazılım tarafından yapılır.
  • DMA birimine kanallardan gelen talepler öncelik sırasına göre sıraya koyulabilir. Bu ayar da yazılım tarafından yapılır.
  • Bağımsız kaynak ve transfer boyutu mevcuttur. Bayt, yarım word ve word biçiminde veri transfer edilebilir.
  • Dairesel tampon denetimi desteği vardır.
  • 3 adet olay bayrağı bulunmaktadır. Yarım transfer, transfer tamamlanma ve transfer hatasında bu bayrak bitlerini okuyabiliriz.
  • Hafızadan hafızaya transfer desteği vardır.
  • Çevre biriminden hafızaya, hafızadan çevre birimine ve çevre biriminden çevre birimine transfer desteği vardır.
  • Flash, SRAM, APB ve AHB çevre birimlerine kaynak ya da hedef olarak erişim desteği vardır.
  • 65535’e kadar gönderilecek verinin sayısı programlanabilir.

DMA biriminin blok diyagramı aşağıda verilmiştir.

DMA denetimcisi doğrudan hafıza transferinde bulunabilmektedir. Bu yüzden Cortex M4 çekirdeği ile aynı sistem veri yolunu paylaşır. DMA olayı gerçekleştiğinde çevre birimi DMA denetimcisine talep sinyali gönderir. DMA denetimcisi öncelik sırasına göre buna karşılık verir. DMA denetimcisi çevre birimine eriştikten sonra yanıt sinyali çevre birimine gönderilir. Yanıt sinyali alındıktan sonra çevre birimi DMA talebini kaldırır. Tekrar bir talep olduğunda DMA denetimcisi bu yanıt sinyalini kaldırır. Özet olarak DMA transferinde şu üç işlem yürütülür,

  • Çevre biriminin veri yazmacı ya da adreslenecek verinin konumu DMA_CPARx ya da DMA_CMARx yazmaçlarına programlanır.
  • Belirlenen yazmaçlardaki veri transfer edilir.
  • Sonrasında DMA_CNDTRx yazmacı eksiltilir. Burada kaç adet verinin transfer edileceği yazılıdır.

DMA biriminde “arbiter” adı verilen hakem ünitesi bulunmaktadır. Bu ünite öncelik sırasında göre talepleri sıralandırır ve yürütür. Yazılımsal olarak DMA_CCRx yazmacında kanalların önceliği programlanabilir. Her kanal için dört ayrı öncelik bulunmaktadır.

  • Çok yüksek öncelik
  • Yüksek öncelik
  • Orta öncelik
  • Düşük öncelik

Donanımsal olarak eğer iki talep aynı öncelik seviyesine sahipse daha düşük numaralı kanal daha yüksek önceliğe sahip olur. DMA transfer kanalları belli bir adrese ve hafıza adresine sahiptir. Transfer edilecek verinin azami boyutu 16-bit (65535) olabilir. Veri boyutu programlanabilir olup DMA_CCRx yazmacındaki PSIZE ve MSIZE bitlerinden ayarlanabilir.

DMA hakkında geri kalan bilgi yazmaçların nasıl kullanılacağına ve yazmaçların açıklamasına dair olduğundan DMA’nın ne olduğunu öğrenmemiz bizim için yeterlidir. Daha sonra HAL kütüphane kılavuzundan bakacağız ve HAL kütüphanesini kullanarak bir DMA örneği yapacağız.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.