STM32 HAL Kütüphanesi DMA Sürücüsünü Kullanmak

STM32’nin DMA birimine datasheet üzerinden giriş yapmış ve bize şimdilik gerekli bilgiyi öğrenmiştik. Şimdi ise DMA birimini HAL kütüphanesi ile beraber nasıl kullanabiliriz sorusuna cevap aramak için kütüphane kılavuzunu açıyoruz. Kütüphane kılavuzunda datasheette olduğu gibi kısa bir yer tuttuğunu görmekteyiz.

Öncelikle bu sürücünün nasıl kullanılacağına bir göz atalım.

Sürücüyü kullanmak için DMA kanalına bağlanacak çevre birimini etkinleştirmeli ve ayarlamalıyız. Dahili SRAM ve FLASH hafıza için bir ön tanımlama gerekmez. Bu noktada DMA talepleri ve çevre birimleri arasındaki bağlantıyı görmek için referans kılavuzuna bakmamız gerekebilir.

Her kanal için program şu ayarlamalara ihtiyaç duyar, Transfer yönü, kaynak ve hedef veri formatı, dairesel veya normal mod, kanal öncelik seviyesi, kaynak ve hedef artırım modu. Bu ayarlamaları HAL_DMA_Init() fonksiyonu ile yaparız.

DMA durumunu geri döndürmek için HAL_DMA_GetState() ve hata durumunu öğrenmek için HAL_DMA_GetError() fonksiyonları kullanılır.

HAL_DMA_Abort() fonksiyonu ise mevcut transferden çıkmak için kullanılır.

Normal program akışında HAL_DMA_Start() fonksiyonu ile DMA transferi başlatılır. Bundan önce kaynak ve hedef adresleri ayarlanmış olmalı ve gönderilecek verinin uzunluğu belirtilmelidir. HAL_DMA_PollForTransfer() fonksiyonu mevcut transfer bitene kadar programı döngüye sokar. Ayrıca belirli bir zaman aşımı süresi de belirtilebilir.

Kesme modunda ise öncelikle DMA kesme önceliği HAL_NVIC_SetPriority() fonksiyonu ile ayarlanmalıdır. Sonraısnda DMA kesme fonksiyonu HAL_NVIC_EnableIRQ() fonksiyonu ile etkinleştirilmelidir. Kaynak ve hedef adresleri belirlenip veri uzunluğu tespit edildikten sonra HAL_DMA_Start_IT() fonksiyonu ile DMA transferi başlatılır. HAL_DMA_Channel_IRQHandler() fonksiyonu DMA_IRQHandler() kesme fonksiyonunun içerisinde kullanılmalıdır. Veri transferinin bitmesinden sonra HAL_DMA_IRQHandler() fonksiyonu yürütülür. Burada kullanıcı kendi kodunu yazabilir.

HAL kütüphanesinin diğer sürücülerinde olduğu gibi DMA birimini tanımlamak için HAL_DMA_Init(), devre dışı bırakmak için de HAL_DMA_DeInit() fonksiyonu kullanılır. DMA birimi HAL kütüphanesinde aşağıdaki fonksiyonlar ile kullanılmaktadır.

HAL_DMA_Start()
HAL_DMA_Start_IT()
HAL_DMA_Abort()
HAL_DMA_Abort_IT()
HAL_DMA_PollForTransfer()
HAL_DMA_IRQHandler()
HAL_DMA_RegisterCallback()
HAL_DMA_UnRegisterCallback()
HAL_DMA_GetState()
HAL_DMA_GetError()

Bu fonksiyonların işlevlerini uygulamalı olarak göstermek daha iyi olduğu için kılavuzdan elde ettiğimiz bilgileri uygulama üzerinden tekrar göstereceğiz. Daha sonraki yazılarımızda DMA uygulamalarına yer vereceğimizden konuyu burada bırakalım.

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...

1 Response

  1. Mustafa dedi ki:

    Gokhan hocam derslere devam edecekmisiniz?

Bir cevap yazın

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