stm32f4 DMA hakkında sorularım

Başlatan seyityildirim, 29 Ocak 2017, 00:34:50

seyityildirim

Merhaba arkadaşlar. Dma ayarları yaparken hep sağdan soldan kopyalayıp yapıyorum da şu FIFO_Mode,  FIFOThreshold, MemoryBurst, PeripheralBurst kavramlarını datasheetten okusam da pek kavrayamadım. Kısaca anlatacak arkadaşlara şimdiden teşekkür ederim.


  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; 				       
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; 
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;			
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

Klein

#1
DMA Fifo mode ve fifo treshold seviyeleri nedir?
Veri aktarımı yaparken eğer kaynak ve hedef aynı büyüklükte değilse,  örneğin kaynak byte hedef word ise iki şekilde veri aktarımı yapmamız mümkün
1- dirct mode :
    veri fifo kullanmadan direk aktarılır.  kaynaktan alınan byte  hedefteki word alana kopyalanır. ikince byte geldiğinde hedefteki ikinci word alana aktarılır.
     
Örnek:
kaynaktan gelen veriler sırasıyla şöyle.
       0x12 , 0xAB, 0x1C, 0x44      direct mode kullanıldığında hedefteki word içeriklerimiz ise sırasıyla şöyle olur.  0x00000012, 0x000000AB, 0x0000001C, 0x00000044
     

2- Fifo mod:
    Diyelim ki kaynaktan gelen byte veriyi hedefteki word alana kopyalamak istiyoruz fakat gelen veri 2 byta olunca ya  da 4 byte olunca aktarsın istiyoruz.
    O zaman fifo kullanıyoruz. gelen byte veriler bir yerde biriktiriliyor, treshold ile ayarladığımız miktara ulaşınca hedefe kopyalanıyor. 

Örnek:
kaynaktan gelen veriler sırasıyla şöyle.
       fifo treshold seçimimiz full iken
       0x12 , 0xAB, 0x1C, 0x44       hedefteki word içeriklerimiz ise sırasıyla şöyle olur.  0x441CAB12, 0x0000000, 0x00000000, 0x00000000
       fifo treshold seçimimiz 1/2 iken
       0x12 , 0xAB, 0x1C, 0x44      hedefteki word içeriklerimiz ise sırasıyla şöyle olur.  0x0000AB12, 0x441C000, 0x00000000, 0x00000000

olur.

Burst mode  ise veriyi paketler halinde kesintisiz aktarmamızı sağlar. DMA ile CPU yolu ortak kullanır.  Bu bazı sorunlara yol açabilir.
Örneğin 4byte veri transfer edeceğiz. 2 byte transfer ettik , yani hedefimizn 2 baytı değişti ama kalan iki byte halen eski konumunda. Tam o arada cpu yolu teslim aldı.
ne tesadüftür ki cpu nun o anda işleteceği kod bizim hedef word alanımızdaki değere bağlı. Hedef alanımızdaki 2 byte yeni veri ile dolu iken diğer 2 byte eski değerde kaldı. 
işte o zaman seyreyle gümbürtüyü.
İşte bu tip kritik verilerimizin bölünmesini engellemek için burst transfer kullanırız.  Burst transfer yapılırken DMA yolu teslim alır. ve paket tamamlanana kadar yolu teslim etmez.

seyityildirim

@Klein  hocam yine güzel bir anlatımla yardım ettiniz. Ellerinize sağlık teşekkürler :)