Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: z - 22 Kasım 2015, 16:06:28

Başlık: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 22 Kasım 2015, 16:06:28
72Mhz de koşturulan işlemcimde bus frekansları 72 Mhz.

En yüksek öncelikte DMA ile "RAM"dan "GPIO"ya veri aktarımında 1 byte verinin yaklaşık 0.15 us de aktarıldığını ölçüyorum.

Bu değer bana yavaş geldi.

Hata mı yapıyorum. Veri aktarım hızını araştıran oldumu?
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: magnetron - 22 Kasım 2015, 16:57:44
https://my.st.com/public/STe2ecommunities/mcu/default.aspx

@z hocam böyle bir forum da var eğer picproje'de cevap alamazsanız ben baya yardım almıştım
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: yldzelektronik - 22 Kasım 2015, 17:17:42
@z nasıl ölçüm yapıyorsunuz?

Veri almayı başlattığınız yerde timer başlatıp veri kopyalandı isr içinde timer ölçerek mi?
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 22 Kasım 2015, 18:06:26
Scop ile.
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: X-Fi - 22 Kasım 2015, 19:45:41
Hocam DATA BUS üzerinde CPU, DMA'dan daha yüksek önceliğe sahiptir. Bus stealing yapıldığına göre CPU ram haberleşmesi için DATA BUS'a çıkıyor ise DMA işlerinde gecikme yaşanılır. Yavaş görmenizin sebebi o andaki CPU'nun işlevi olabilir.
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 22 Kasım 2015, 20:36:13
DMA veri aktarımı yaparken CPU'yu boş boş sonsuz döngüde tutuyorum.
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: CLR - 22 Kasım 2015, 21:12:26
Peripheral - dma aktarımında ST dökümanına göre  8 veya 9 clk gerektiği  yazıyor, clk hızı 72Mhz ise total 125ns yapar ki bu da doğru ölçtüğünü gösterir.

Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 22 Kasım 2015, 21:15:36
Dokümanlar kabarık ve sayıca çok olunca gözden kaçabiliyor.

Hangi dokumanda ve kaçıncı sayfada yazıyor?
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: CLR - 22 Kasım 2015, 21:23:09
Using the STM32F1x and STM32L1x DMA controller,
Bölüm 2.3,
sayfa 5/12
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 22 Kasım 2015, 22:40:25
http://www.st.com/web/en/resource/technical/document/application_note/CD00160362.pdf (http://www.st.com/web/en/resource/technical/document/application_note/CD00160362.pdf)

Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 23 Kasım 2015, 10:32:44
Ramde bekleyen 1KByt verim var. DMA'yi kurdum ve Enb yaptığımda soft start vermiş oluyorum ve 1K verim hedefe gidiyor.

Bu start verme işlemini soft olarak değil de timer ile vermek istiyorum. Timerın ilk update işlemi gerçekleştiğinde 1Kb veri transferi başlarmı anlayamadım.

Timerın her update'inde bir 1 byte mı gider?

Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: CLR - 23 Kasım 2015, 12:58:15
Dma data boyutunu ve data counter'a kaç yazdıysan o kadar gider
Dma data boyutu 1 byte ise ve dma counter 1 ise 1 byte gider, data boyutunu 32bit yaparsan dma counter max 1024/4 olmalı.(1Kb için)
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: Klein - 23 Kasım 2015, 13:31:47
Alıntı yapılan: z - 23 Kasım 2015, 10:32:44
Ramde bekleyen 1KByt verim var. DMA'yi kurdum ve Enb yaptığımda soft start vermiş oluyorum ve 1K verim hedefe gidiyor.

Bu start verme işlemini soft olarak değil de timer ile vermek istiyorum. Timerın ilk update işlemi gerçekleştiğinde 1Kb veri transferi başlarmı anlayamadım.

Timerın her update'inde bir 1 byte mı gider?
Yok hocam. 1K ayarladıysan 1K gider.
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 23 Kasım 2015, 14:05:48
Timer registerlerin açıklamalarının yapıldığı bölümde en son kısımda Timer'ın DMA ile ilgili registerlerinden hiç bir şey anlamadım.

Bu kısmın daha detaylı ele alındığı bir doküman biliyormusunuz?
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: Klein - 23 Kasım 2015, 20:55:24
Daha detaylı bir doküman bilmiyorum.
Anlamadığınız kısım  hangisi?
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 23 Kasım 2015, 22:01:51
TIMx DMA control register (TIMx_DCR)
TIMx DMA address for full transfer (TIMx_DMAR)

Bu iki registerde ne saklayacağımı anlamadım.
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: Klein - 23 Kasım 2015, 22:33:47
DCR registeri basit. TIM registerlerinin içeriğini transfer etmek için gereken ayarlar.
DBL btleri  Kaç tane registerin içeriğinin DMA ile  aktarılacağını gösteriyor.
DBA bitleri ise,  hangi registerden başlanacağını.

Eğer DBA 0x00000 ise   başlangıç registerimiz CR1 olacak ve DBL ile  verdiğimiz sayı kadar registerin içeriği transfer edilecek.
siz sadece Counter değeri transfer edilsin istiyorsanız DBA değerine 0x01001  ve DBL değeri olarak 0x00000 vereceksiniz.

Diğer registeri  biraz okuyup döneyim.


mesaj birleştirme:: 23 Kasım 2015, 22:37:03

Ekleme:

Anladığım kadarıyla DMAR registeri de ( yanlış anlamış olabilirim)

Transfer esnaasında bu registerlerin içeriğinin atıldığı adres. Yani DMA ayarlarını yaparken DMA'ya kaynak ya da hedef olarak vereceğimiz adres.

Bu adreste siz bir şey saklamıyorsunuz.  DMA trensferi esnasında  DMA indeksi arttıkça  ilgili registerin içeriği bu adrese atılıyor ve DMA buradan alıp traansfer ediliyor.
Timer yönüne doğru transferlerde de  DMA bellekten aldığı değeri buraya yazıyor ve ilgili registerin yeni değeri bu registerin içeriği oluyor.
Başlık: Ynt: STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?
Gönderen: z - 23 Kasım 2015, 22:55:58
O zaman boşu boşuna bu registerlerle ilgilenmişim. DMAyi timer ile tetikleyemeyince sorunun bu registerler olduğunu düşündüm ama alakayı kuramadım.

Büyük olasılıkla basit bir hat yaptım.

Normalde DMA'yi soft tetikleyince istediğim dataları taşıyan kurulumu yaptım. DMA_CCR2  registerinde Enable bitini soft olarak 1 yaptığımda isteğim gerçekleşiyor.

Bu biti sıfırda bırakıp  TIM2x_DIER de UDE bitini set ediyorum.

Mantığıma göre Timer 2 reload yaparken gidecek ve DMA'ya start komutunu verecek. Fakat işe yaramadı.

Zaten terslik şurada.

DMA_CCR2 de Enb bitini 1 yaparsam derhal transfer başlıyor. Bu durumda timer olayı nasıl başlatacak.

Mem2Mem bitini 1 yapıyorum çünkü memoryden GPIO porta aktarım  yapılsın istiyorum.

Fakat bu biti sıfır yapmayı denemedim.



mesaj birleştirme:: 23 Kasım 2015, 21:51:00

MEm2Mem 0 yapınca oldu ama istediğim olmadı.

Timerın her sıfırlamasında sadece 1 byte data transfer oluyor.

Halbuki timerın her sıfırlamasında 1K veri taşınsın istiyordum.

Yani demek istediğim bir K veri taşınmak için timerın tek bir palsını bekliyor olacak.

Mevcut kurulumda 1K veri ancak 1024 timer taşmasında transfer edilmiş oluyor.