Bu makale, STM32H563 geliştirme kartı aracılığıyla DMA 2D modunun kullanımını tanıtmayı amaçlamaktadır. DMA 2D modu olarak adlandırılan bu mod, DMA’nın blok içi adresleme ofsetini ve blok adresleme ofsetini önceden ayarlayarak adresleme modunu ve kapasitesini dinamik olarak ayarlayabilmesini ifade eder. Diğer bir deyişle, DMA veri aktarımını gerçekleştirdiğinde, blok içi adresleme artık her zaman bitişik olarak depolanacak şekilde sabit değildir, ancak iki bitişik aktarım sırasında verilere erişmek için adres aralığı programlama yoluyla belirlenebilir. Tekrarlayan blok aktarımları için, artık her seferinde aynı konumdan yeniden başlanmaz, ancak yeni aktarımın başlangıç adresi blok adresinin ofsetine göre ayarlanabilir.
DMA 2D aktarım ilkesi
Aynı DMA isteği için üç aktarım başlatıldığını ve bunların üç DMA aktarım bloğuna karşılık geldiğini varsayalım.

Yukarıdaki şekilde gösterildiği gibi, kırmızı ile işaretlenmiş 5 veri parçası [yani ilk blok] ilk kez iletilir ve veri erişimi şekle göre gerçekleştirilir. İkinci ve üçüncü seferler de ilk seferle benzerdir; sırasıyla 5 yeşil veri [yani ikinci blok] ve 5 mavi veri [yani üçüncü blok] iletilir. Açıkçası, her bir iletim bloğundaki veri erişim kuralları aynıdır ve iki depolama alanı iki ile ayrılmıştır. Aynı zamanda, ilk iletim tamamlandıktan sonra ikinci iletim başlatıldığında veya ikinci iletim tamamlandıktan sonra üçüncü iletim başlatıldığında, başlangıç adresi başlamadan önce mevcut konumdan 14 adres alanı geriye ayarlanır.
DMA 2D işlevi nasıl kullanılır?
Bu örnekte STM32H563ZI Nucleo kartını kullanıyoruz. Çipin USART3'ü, kart üzerindeki STLINK'in VCP'sine bağlanmalıdır. PC tarafındaki seri port hata ayıklama yardımcısını kullanarak MCU'ya üç set veriyi toplu olarak dağıtın; içerik 5 karakter R, 5 karakter G ve 5 karakter B'dir. USART3 tarafından alınan DMA 2D işlevini etkinleştirin.
Bu arada, hatırlatmak gerekirse, STM32H5 serisinin GPDMA'sının tüm kanalları DMA 2D adresleme işlevini desteklemez. DMA kanalının 2D işlevini destekleyip desteklemediği, CubeMx yapılandırma arayüzünde açıkça belirtilmiştir. CubeMx yapılandırmasını kullanıyorsanız, uygun seçenekleri seçebilirsiniz. Burada, DMA 2D işlevini destekleyen GPDMA1'in DMA CH6'sını seçiyorum.
STM32CubeMX'i kullanmak için temel yapılandırma şu şekildedir:

Yapılandırmamızın odak noktası 2D adresleme olup, ayrıntıları şu şekildedir:
Şu anda USART3DMA alıcı konumundadır, açıkçası kaynak adresi sabittir, yani USART3 veri alma kaydıdır, bu nedenle buradaki kaynak adresiyle ilgili ofset 0'dır. DMA erişiminin hedef adresi bellektir ve bu değişkendir. Blokta her bir veri parçası depolandığında, aşağıdaki Hedef Adres Ofseti değerine karşılık gelen iki konum ileriye kaydırılır. Her blok iletimi tamamlandıktan sonra bir sonraki iletim turu başladığında, başlangıç adresi aşağıdaki Blok Hedef Adres Ofseti değerine karşılık gelen tam olarak 14 konum geriye kaydırılır; geriye kaydırma negatif, ileriye kaydırma ise pozitiftir. Burada, aşağıdaki Tekrar sayacı değerine karşılık gelen toplam 3 blok aktarımı tekrarlanır.

Aslında, DMA blok iletiminin 3 tur tekrarından sonra, alınan veriler aşağıdaki şekilde okla gösterilen desene benziyor.

STM32CubeMx'i kullanarak yapılandırmayı tamamlayın, hata ayıklama ve doğrulama için kullanıcı kodunu ekleyin. Elle eklenmesi gereken kullanıcı kodu temel olarak şu iki satırdan oluşur:
__HAL_LINKDMA(&huart3, hdmarx, handle_GPDMA1_Channel6);
HAL_UART_Receive_DMA(&huart3,(uint8_t *)aRxBuffer, 5); //Receive 5 data per block
Aşağıdaki şekil, hata ayıklama çalışmalarına dayalı sonuçları göstermektedir. Üç bağımsız DMA alımı sonucunda, veriler düzenli olarak RGB sırasına göre kaydedilmektedir.





