STM32F7 Donanım ayarları

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

z

Int fonkisonunun adı vector tablosundaki ad ile aynı olmak zorunda. Kontrol et.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

magnetron

hocam  TIMx_IRQHandler mi yazdınız

yoksa  TIM10_IRQHandler gibi Timer adı belirttiniz mi ?

mesajlarınızı takip ediyorum - bayadır uğraşıyorsunuz - bir fikir söyliyim dedim

z

#47
NVIC ayarlarını düzgün yapıldımı?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

#48
Alıntı yapılan: magnetron - 11 Ocak 2016, 22:37:42
hocam  TIMx_IRQHandler mi yazdınız

yoksa  TIM10_IRQHandler gibi Timer adı belirttiniz mi ?

mesajlarınızı takip ediyorum - bayadır uğraşıyorsunuz - bir fikir söyliyim dedim

Teşekkürler. Sorunu çözdüm. Ama sorunun sebebini anlayamadım.
Şimdi benim yaptığım TIM_Base örneğini doğrudan kopyalayıp kendi projemde çalıştırmaya çalışmaktı. Oradaki kodlara bakıp aynısını kendi projeme ekledim ilk etapta.

TIM_Base örneğinde İnterrupt fonksiyonu olarak aşağıdaki fonksiyon kullanılıyor

/**
  * @brief  This function handles TIM interrupt request.
  * @param  None
  * @retval None
  */
void TIMx_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TimHandle);
}


stm32f7xx_it.c dosyasında bu fonksiyon var. Ve çalışıyor. Bende ilk etapta aynı fonksiyonu kullandım ama kesme bu fonksiyona düşmüyordu.  Örneğe takılıp kalmışım anlaşılan. @magnetron öyle diyince fonksiyon adını TIM3_IRQHandler şeklinde değiştirdim. Şimdi kesme çalışmaya başladı.

Ama anlamıyorum?? Tim_Base örneğindeki startup ile benim startup aynı. Arada fark yok. O halde Tim_base örneğindeki kesme fonksiyonu nasıl oraya yönlendiriliyor?

@z hocam

Hal kütüphanesinde Nvic ayarları biraz daha basitleştirilmiş.

iki satırda yönlendirme işlemi yapılıyor. .
  /*##-2- Configure the NVIC for TIMx ########################################*/
  /* Set the TIMx priority */
  HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);
  /* Enable the TIMx global Interrupt */
  HAL_NVIC_EnableIRQ(TIM3_IRQn);


ADC ve DMA konusuna bakayım biraz.

Edit;

Bu arada önceki projedeki timeri aktif edince donma sorunuda çözüldü. Şimdi timer konusunda problem kalmadı gibi.

mesaj birleştirme:: 12 Ocak 2016, 00:29:52

Büyük ihtimal ADC+DMA projesinde dede sorun ADC'nin çok hızlı çalışıp DMA'yı aşırı bir şekilde meşgul etmesinden kaynaklanıyor. Şimdi ben o projede debug yapıyorum. ADCyi init eder etmez her iki-3 satır kod arasında adc_dma kesmesi oluşuyor.
Yani debugda iki adım ilerliyorum kesme oluşuyor iki adım ilerliyorum kesme oluşuyor. Sorun bu olsa gerek. DMA okadar meşgul oluyor ki LCD'ye vakit ayıramıyor.

Gerçi @ahmet2015 çalıştırmıştı şimdi onun kodlarına bakıyorum

Gördüğüm tek fark HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 15, 0); satırında

NVIC_Priority 15 yapılmış. Bende öyle yaptım ama yine çalışmadı.

Mucit23

#49
Merhaba Arkadaşlar,

ADC'yi timer ile tetiklemeye çalışıyorum. Şunu sormak istiyorum. ADC3'ü Timer2 TRGO kanalından tetik alacak şekilde ayarladım. Timer'da ise TRGO Update tetikleme çıkışını aktif ettim.

Timer ayarlarım aşağıdaki gibi.

  TIM_MasterConfigTypeDef sMasterConfig;
	/* Prescaler declaration */
  uint32_t uwPrescalerValue = 0;
	
  /* TIMx Peripheral clock enable */
	__HAL_RCC_TIM2_CLK_ENABLE();

	
  /* Time Base configuration */
  TimHandle.Instance = TIM2;
	
	  /* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
  uwPrescalerValue = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;


  TimHandle.Init.Period            = 5000-1;
  TimHandle.Init.Prescaler         = uwPrescalerValue;
  TimHandle.Init.ClockDivision     = 0;
  TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  TimHandle.Init.RepetitionCounter = 0x0;

  if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
  {
    /* Timer initialization Error */
  }
	
  /* Timer TRGO selection */
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&TimHandle, &sMasterConfig) != HAL_OK)
  {
    /* Timer TRGO selection Error */
  }
	
  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  {
    /* Starting Error */
  }
	
  /*##-2- Configure the NVIC for TIMx ########################################*/
  /* Set the TIMx priority */
  HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
  /* Enable the TIMx global Interrupt */
  HAL_NVIC_EnableIRQ(TIM2_IRQn);


ADC ayarlarım ise aşağıdaki gibi.

  ADC_ChannelConfTypeDef sConfig;
  /*##-1- Configure the ADC peripheral #######################################*/
  AdcHandle.Instance          = ADC3;
  
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 1;
  AdcHandle.Init.ScanConvMode          = DISABLE;                       /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  AdcHandle.Init.ContinuousConvMode    = DISABLE;                       /* Continuous mode disabled to have only 1 conversion at each conversion trig */
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_RISING;        /* Conversion start trigged at each external event */
  AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIG2_T2_TRGO;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
	


	
  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    /* ADC initialization Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_8;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-3- Start the conversion process #######################################*/
  if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1) != HAL_OK)
  {
    /* Start Conversation Error */
  }


Debug ile arka planda neler oluyor onlara bakıyorum. Timerin çalışıp çalışmadığını anlamak için TIM_IRQn kesmesini aktif ettim. Debug ile kesme oluştuğunu TIM Status Registerinin UIF bitini kontrol ederek anlıyorum. Kesme oluşursa eğer bu bit 1 oluyor ardından işlemci kesmeye gidiyor flag tekrar temizleniyor vs.

Kesme kendi başına oluşuyor. Yani Timer'ın çalışmasında sıkıntı yok diyebiliriz. Yalnız ADC'ye tetikleme sinyali gitmiyor.

Bu arada ADC ile ilgili Trigger ayarlarınıda kontrol ettim debug ile. Yaptığım ayarlamalar ADC3->CR2 registerinin ilgili bitlerine yazılıyor. Anladığım kadarıyla ADC'de trigger ayarları bundan ibaret.

Timerde ise TRGO çıkışı TIM2->CR2 Registerinin MMS bitleri ile yapılıyor  Ben bu ayarı TIM_TRGO_UPDATE şeklinde yaptım.

Başkada bir ayar yaptığım yok. Bu ayarların hepsini debug yapıp ilgili registerleri kontrol ederek doğruluyorum. Hatta debug sırasında şöyle bir test yaptım. ADC3->CR2 registerinin 29 nolu biti SWSTART bitidir. (Start conversion of regular channels) Ben debug sırasında bu biti bi anlık aktif ediyorum. Ardından ADC birkaç adım sonra dönüşümü yapıp dma vasıtasıyla değişkenime yazıyor daha sonra tekrardan beklemeye başlıyor.

Timer tetik vermiyor anlaşılan.  ADC+Timer TRGO tetiklemesi için başka ne gibi ayarlamalar yapmak gerekiyor? Problem nerede olabilir?

mesaj birleştirme:: 13 Ocak 2016, 16:20:28

Çalıştırdım. Yalnız Allah aşkına şu duruma bi bakın.

Burada birisi aynı problemi yaşamış. Bi umuttur şeklinde düşünüp denedim ve çalıştı  :o
https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FSTM32Discovery%2FSTM32F7%20Discovery%20-%20having%20trouble%20getting%20the%20ADC%20DMA%20to%20work&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F&currentviews=306

RCC'den DAC'nin Clock kaynağını aktfi etmesen TRGO ile ADC tetiklenmiyor. DAC ile ne alakası var anlamadımki

Timerin clock kaynağını açarken   __HAL_RCC_DAC_CLK_ENABLE(); ile DAC nin de clock kaynağını açmak gerekiyor. F4 de felan böyle bir durum varmı. Daha önce Timer Trigger output kullanan oldumu? 

Mucit23

Selamlar,

HAL Library'de MCO çıkışını kullanan oldumu?

Ben şimdi MCO1 den çıkış almak istiyorum. Hemen Manuale baktım MCO1 çıkışı PA8 görünüyor. Başka seçenekde yok.  PA8 pinini MCO ya yönlendirdim. MCO kaynağınıda PLLCLK'dan alacak şekilde ayarladım. Scop ile PA8'i  gözlemliyorum.

PLLCLK yı 216Mhz'ye ayarlamışım. MCO Presacaller değerinide 4 yaptım. Yani 216Mhz değeri 4'e bölünüp 54Mhz olarak PA8 den çıkması gerekir. Ama tık yok.

Ayarlarım bu şekilde.
GPIO_InitTypeDef  gpio_init_structure;
  __HAL_RCC_GPIOA_CLK_ENABLE();

  gpio_init_structure.Pin = GPIO_PIN_8;
  gpio_init_structure.Mode = GPIO_MODE_AF_PP;
  gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_init_structure.Pull = GPIO_NOPULL;
	gpio_init_structure.Alternate = GPIO_AF0_MCO;
  HAL_GPIO_Init(GPIOA, &gpio_init_structure);
  
	HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_PLLCLK,RCC_MCO_DIV4);


GPIO'yu alternate functionlara yönlendirme ile ilgili başka bir fonksiyon yok gördüğüm kadarıyla. STD librarda Alternate functionlar için başka bir fonksiyon vardı. HAL libraryde GPIO_InitTypeDef  struct'ı ile ayarlanıyor hepsi.

Fikri olan varmı.

MCO kaynağını HSI veya HSE seçiyorum yine tık yok

Mucit23

#51
MCO Probleminide çözmüş bulunmaktayım. Aslında sorun benden değil ST'nin verdiği şemadan kaynaklanıyor.

Şemada ufak bir terslik var.



Kartın şemasında 6. sayfada PA8 pini Arduino D5 konnektörüne bağlı şeklinde gözükürken 9. sayfada PA8 Arduino D10 konnektörüne bağlı Ve gerçektende öyle PA8 Arduino D10 pinine bağlı.

Bende 2 gündür acaba niye D5'de sinyal göremiyorum pin mi bozuldu diye tırmalıyorum boş yere.  >:(