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?
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
@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?
Scop ile.
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.
DMA veri aktarımı yaparken CPU'yu boş boş sonsuz döngüde tutuyorum.
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.
Dokümanlar kabarık ve sayıca çok olunca gözden kaçabiliyor.
Hangi dokumanda ve kaçıncı sayfada yazıyor?
Using the STM32F1x and STM32L1x DMA controller,
Bölüm 2.3,
sayfa 5/12
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)
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?
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)
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.
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?
Daha detaylı bir doküman bilmiyorum.
Anlamadığınız kısım hangisi?
TIMx DMA control register (TIMx_DCR)
TIMx DMA address for full transfer (TIMx_DMAR)
Bu iki registerde ne saklayacağımı anlamadım.
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.
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.