STM32F7 Donanım ayarları

Başlatan Mucit23, 29 Aralık 2015, 01:18:57

Mucit23

Hocam ama farklı kanallarda çalışıyorlar.

ST'nin RM0385 kodlu STM32F74xxx manualini inceliyorum.

Sayfa 222'de böyle bir tablo var.



Ben karttaki Arduino analog pinlerinden okuma yapıyorum. 6 adet analog giriş var ve bunlar ADC3'e bağlı. Şuanda ADC3'de kanal değiştirip farklı kanallardan okuma yapabiliyorum.

SDRAMin kullandığı DMA tanımlamaları aşağıdaki gibi
/* DMA definitions for SDRAM DMA transfer */
#define __DMAx_CLK_ENABLE                 __HAL_RCC_DMA2_CLK_ENABLE
#define __DMAx_CLK_DISABLE                __HAL_RCC_DMA2_CLK_DISABLE
#define SDRAM_DMAx_CHANNEL                DMA_CHANNEL_0
#define SDRAM_DMAx_STREAM                 DMA2_Stream0  
#define SDRAM_DMAx_IRQn                   DMA2_Stream0_IRQn
#define SDRAM_DMAx_IRQHandler             DMA2_Stream0_IRQHandler


Bunlar ise ADC için yapılan DMA Tanımlamaları
/* Definition for ADCx's DMA */
#define DMAx_CLK_ENABLE()               __HAL_RCC_DMA2_CLK_ENABLE()
#define ADCx_DMA_CHANNEL                DMA_CHANNEL_2
#define ADCx_DMA_STREAM                 DMA2_Stream0
#define ADCx_DMA_IRQn                   DMA2_Stream0_IRQn
#define ADCx_DMA_IRQHandler             DMA2_Stream0_IRQHandler


SDRAM DMA'ın 0. kanalını kullanıyor. ADC ise DMA'nın 2. kanalını kullanıyor.

Stream meselesi ise zorunlu gibi 1. tablodan dma2 ye bakılırsa ADC3 ancak Stream0 ve Stream1 ile kullanılabiliyor. 2. Kanalda çalışmasıda zorunluluk. Gerçi Tabloda SDRAM ile ilgili bir açıklama yok. Bunun sebebini anlamadım.

Aslında kartta keşke bütün IO pinlerini dışarı çıkarsalardı. Biraz daha esnek davranabilirdim.

Şimdi DMA'yı tam olarak anlayamadım aslında. Üstatlarım biraz açıklarsa sevinirim. DMA2'yi düşünürsek, Sadece DMA2 ile kaç farklı köprü kurulabilir? Bu durumdayken ne yapmamı önerirsiniz? DMA olsa süper olacak. 3 farklı kanaldan ADC okuyup 3 farklı değişkene atmaya çalışıyorum DMA ile.

Başka nasıl yaparım bu işi?

ecunnu

ADC3 u Stream1 ile kullanmayi denedinmi?

Mucit23

Denedim evet adc tek başına stream1 ilede çalışıyor.  Fakat lcd devreye girince ayni sorun devam ediyor

Mucit23

#18
Benim bu işe bir türlü aklım ermiyor arkadaşlar. @Klein hocam bi el atın kafa yoralım şu işe  :-\

Neden SDRAM ile ADC aynı DMAyı farklı kanallardan çalışmaz. Arada problem çıkaran ne? Bu soruma cevap bulursam sorun çözülür. Şu anda komple DMA yı kapattım. Projenin ilerlemesi için kendim kesmelerle felan uğraşarak sıra ile ADC den veri almaya çalışacam.

mesaj birleştirme:: 03 Ocak 2016, 01:01:04

Sormak istediğim birşey daha var.

Şuan DMA olmadan 3 kanal adcden veri okuyabiliyorum. DMA'yı tümüyle pasif ettim. Ayrıca ADC_IRQn kesmesinide aktif ettim. Kesme oluşuyor. Yalnız şöyle bir durum var. STM32f7xx_it.c içerisine Kesme fonksiyonunu ekliyorum şöyle bir fonksiyon.

void ADC_IRQHandler(void)
{
  HAL_ADC_IRQHandler(&AdcHandle);
}


Kesme buraya düşüyor. Ama bu fonksiyon içerisinde en basitinden led yakmak istesem bile eklediğim ekstra kodda program işlemci donuyor.
Sadece bu kodu ekliyorum. BSP_LED_On(LED1);
Bu işe de anlam veremedim.

yldzelektronik

Donuyor demişsin. Donuyordan kastın nedir?Ben de benzeri durumları yaşamıştım m0+, m0 ile. Ama ben sonradan gördüm ki hardfault handlera düşüyordu.Sebebini hatırlamıyorum şuan.Ancak ben de donuyor diye düşünüyordum.Debug da oraya düşüyordu kodu dondurduğumda.Hatta forumda bir yerlerde videosu da vardı.

Sendeki de böyle bir durum mu?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Emin değilim bilmiyorum tam olarak hard faulta düşüyor olabilir. Normalde lcd adc vs çalışıyorken kesme fonksiyonu içinde bir fonksiyon çağırsam lcd ve adc çalışmıyor. 

Ne kadar problem bir iş böyle.  St foruma yazıyorum orada bile cevap veren yok. St globala mail atacam.

Şunu sorayım.  Simdi timer ile adc yi tetikledim diyelim. Adc den peşi sıra 3 farklı kanaldan 1'er adet örnek alıp adc yi durdurmam lazım.  Timer ile tetikleme kolay. Contiouns mode'yi disable yapsam adc işi bittigi zaman duruyor. Buda tamam. Ama adc'nin peşi sıra kanal tarayıp örnek alma özelliği varmı? Bunu f4 için soruyorum onda böyle bir ozellik varsa f7 de de vardır.

3 kanal adc nin fft si alınacak bunun için alt yapıyı oluşturmaya çalışıyorum.  Dma bütün işleri alt üst etti. FFT için sabit frekansta örnekleme yapmam lazım.  Daha önce tek kanal adc ve dma timer üçlüsü ile yapmıştım. Gayet iyi çalışıyordu.  Burada birtek dma oyun bozanlık yapıyor.

Öyle bir durum var ki kart üzerindeki analog girişlerin hepsi adc3'e bağlı.  Adc3 de birtek dma2 ile çalışıyor.  Sdram içinde aynı durum geçerli.  Ama mesela adc1'i kullansam dma1 ile veri aktarımı yapacam ama adc1 inde kanalları uyuşmuyor. Sadece tek bir kanalı I/O lara çıkarmışlar.  Diğer pinler yok ortada.  Saçmalık işte. 

>:( Raspi de bile daha çok I/O var. Bu ne iştir böyle anlamadımki

DMA sorununu çözmem lazım


Mucit23

Bu konuda henüz bir çözüme ulaşmış değilim. ST Forumdan böyle bir cevap geldi

If it's like the F4 DMA implementation you need to use unique streams, not channels

Tam anlayamadım ama farklı kanal yerine farklı streamlar kullanın diyor sanırım. Denedim onuda denedim ama olmadı.

Şimdi DMA olmadan 3 kanal adc ölçümü yapıyorum. Benim ADC yi 10khz hızda ölçüm yapacak şekilde ayarlamam lazım. Yani saniyede 10000 defa 3 kanal adc den örnek almam lazım. Bunu doğrudan adc yi tetikleyerek yapmam mümkün mü?

Karamel

Alıntı yapılan: Mucit23 - 07 Ocak 2016, 23:20:57
Bu konuda henüz bir çözüme ulaşmış değilim. ST Forumdan böyle bir cevap geldi

If it's like the F4 DMA implementation you need to use unique streams, not channels

Tam anlayamadım ama farklı kanal yerine farklı streamlar kullanın diyor sanırım. Denedim onuda denedim ama olmadı.

Şimdi DMA olmadan 3 kanal adc ölçümü yapıyorum. Benim ADC yi 10khz hızda ölçüm yapacak şekilde ayarlamam lazım. Yani saniyede 10000 defa 3 kanal adc den örnek almam lazım. Bunu doğrudan adc yi tetikleyerek yapmam mümkün mü?

hocam eger f4 dma i gibi birsey yapmak istiyorsaniz. unique streams seklinde kullanmalisiniz. channels seklinde degil. burada boyle yaziyor. reference manual da bunlarin ne oldugu anlatiliyor olmali. ben simdi bir cumleden pek birsey anlamadim ama bu cevap bir anlam ifade ediyor olmali.

example code isteyin isterseniz?  :-\

Gökhan BEKEN

Bütün işleri tek bir mcu'da halletmen şart değil ise bence modüler çalış.
ADC ölçümü yapılacaksa bu işi yapan mcu ayrı olsun, spi veya paralel port ile master karta hızlıca göndersin, belki dma'yı bu iletişim için kullanabilirsin.
Özel mesaj okumuyorum, lütfen göndermeyin.

Mucit23

Hocam böyle bir mcu ile böyle basit bir işlemi yapamıyorsak kart bana göre çöp gibi birşey.

ADC+DMA dan vazgeçtim. Timer kesmesi oluşturup kesme içerisinde her bir kanalın verisini ayrı ayrı okuyacam. Şuanda timer için tırmalıyorum.
Gerçi ilginç bir şekilde kesme içerisinde de herhangi bir fonksiyon çalışmıyor. Onuda anlamış değilim.

@Karamel keşke örnek fazla olsa. Bir kaç tane örnek var onlarda ST nin kendi verdikleri zaten.

Karamel

Hocam sorunu yazin. Bu ornek duzgun calismiyor. Ben boyle istiyorum ama.bu boyle oluyor vs diyin. Bence st microelectronics support team sizinle ilgilenir. Kimse ilgilenmese ornek olmaz?

Ben konudan hicbirsey anlamadim. Eger birsey anlayabilsem. Final lar bitince reference manuel i okuyup. Size anladiklarimi akatarabilirim. ::)

Mucit23

#26
Benim takıldığım konu şudur.

Mesela Şuanda Timer interrupt için uğraşıyorum. Örnekler içerisinde Tim_Base uygulaması var. Karta yükledim doğrudan gayet güzel çalışıyor. Sıkıntı yok. Şimdi timer kesmesini ben kendi projemde de aktif etmek istiyorum. Yaptığım işlem timer örneğindeki kodları inceliyorum. Timer için nerede hangi ayarları yapmış adım adım takip edip kendi projeme ekliyorum. Sonuç olarak program hatasız bir şekilde derleniyor. Ama yinede çalıştıramadım bir türlü. konfigürasyon işlemi sırasında Timer interrupt aktif edildiği anda işlemci donuyor. Debug sırasında bunu farkediyorum.

İşte bunun gibi problemler var. İşlemcide bir ayar yapılacaksa nerelere dikkat etmek gerekiyor bilmiyorum. Tamam ayarlar felan F4'e çok benziyor ama Hal kütüphanesinde nedense aynı ayarları çalıştıramıyorum. Nereler atlanıyor onlarıda bulamıyorum.

Gökhan BEKEN

Diğer donanımları init yapma ve kullanma, bir de öyle dene. Belki birbirlerini etkileyen birşeyler vardır.
Kolaylık olması açısından her donanım için aktif olup olmayacağını belirten birer #define tanımla.
Ben şöyle yapıyorum:
programın başında
#define EKRAN_AKTIF
#define ADC_AKTIF

sonra kullanacağım bütün yerlerde şöyle yapıyorum:
#ifdef EKRAN_AKTIF
ekranInit();
#endif
#ifdef ADC_AKTIF
adcInit();
#endif
Özel mesaj okumuyorum, lütfen göndermeyin.

Mucit23

Yok hocam onu denedim elbette. Sadece Timer ile ilgili ayarları bırakıyorum. Başka çağırdığım birşey yok.

Şu satırda donup kalıyor.
  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  {
    /* Starting Error */
    Error_Handler();
  }


Gökhan hocam şöyle bir teorim var. Bu yere batası hal library  sadece CubeMX ile birlikte çalışacak şekilde yazılmış. CubeMX ile proje oluştururken kütüphanenin yapısını bildiği için nerde ne yapacağını biliyor herşey yerli yerinde çalışıyor. İncelediğim Bütün örnekler CubeMX ile hazırlanmış gibi. Belkide sorun bundan dır. Ben kendim kodlara bakıp aynısını yazıyorum ama belki daha fazla birşeyler yapmak gerekiyordur. İşte bana kafayı yedirtecek kısım burası.

Yahu CubeMX ile nasıl proje oluştururum. Daha önce deneyen oldumu?
Mesela CubeMX ile Sadece LCD ayarları ile işlemcinin çalışabileceği min konfigürasyon ayarlarının yapıldığı  bir proje oluşturabilecek birisi var mıdır forumda?

SDRAM ayarları nasıl yapılacak? FMC'nin bir sürü modu var. 
LCD ayarları nasıl yapılacak?

Birde bu yolu deneyeyim diyorum ama başta takılıp kalıyorum.

Gökhan BEKEN

Cubemx ile proje oluşturmak çok kolay, ama donanım ayarlarını yapabilmek için seçenekleri bilmek lazım. Mesela LCD'nin özelliklerini bilmediğim için yapamam ama sendeki örnekten bakarak aynısını yapmaya çalışırsan çalışabilir.
Özel mesaj okumuyorum, lütfen göndermeyin.