STM32F103C8 DMA transfer hızı neden düşük? Ben mi hata yapıyorum?

Başlatan z, 22 Kasım 2015, 16:06:28

z

TIMx DMA control register (TIMx_DCR)
TIMx DMA address for full transfer (TIMx_DMAR)

Bu iki registerde ne saklayacağımı anlamadım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

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.

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com