STM32F103 Timer interrupt içinde praograma dallanma

Başlatan Murat Mert, 06 Haziran 2020, 21:06:58

Murat Mert

S.A.
CubeIde ile hal library uartdan gelen veriyi timer ile işlenip flag alıp main döngü içinde alt programlara dallandırıp yapıyorum. Aynı işlemi Timer interrupt içinde dallandırdım olmadı programın başına led high yapıp çıkışa led low koydum ama high olup low olmuyor yani işlem yapmıyor.
Aynı yazılımı MikroC arm ile yazıp çalıştırdığım bir program ama hal lib ile çalıştıramadım hal lib.de  yapmam gereken bir bir ayar varmı.

timer ayarı
/* TIM2 init function */
void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 6399;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

bunda sıkıntı yok

void USART2_IRQHandler(void)
{	
	if((huart2.Instance->SR & USART_SR_RXNE ) != RESET)
	{

		HAL_UART_Receive(&huart2, &rx_data, 1, 10);
		rx_buffer[read_counter] = rx_data;
		read_counter ++;
	}
	port_timer = 1;
	
    HAL_UART_IRQHandler(&huart2);
	
}


void TIM2_IRQHandler(void)
{
 if(port_timer>0) { port_timer ++; }
 if(port_timer >= tim_set) { port_send = 1; }

  HAL_TIM_IRQHandler(&htim2);

}

void int main()
{
	if(port_send == 1) {uart_send(); port_send = 0;}
	
	..............
	..............
	..............

}

bunda dallandığı programdan donmüyor

void USART2_IRQHandler(void)
{	
	if((huart2.Instance->SR & USART_SR_RXNE ) != RESET)
	{

		HAL_UART_Receive(&huart2, &rx_data, 1, 10);
		rx_buffer[read_counter] = rx_data;
		read_counter ++;
	}
	port_timer = 1;
	
    HAL_UART_IRQHandler(&huart2);
	
}


void TIM2_IRQHandler(void)
{
 if(port_timer>0) { port_timer ++; }
 if(port_timer >= tim_set) { uart_send(); port_send = 0; }

  HAL_TIM_IRQHandler(&htim2);

}

void int main()
{
	//if(port_send == 1) {uart_send(); port_send = 0;}
	
	..............
	..............
	..............

}

bu çalışmayı MikroC arm da yaptım çalışıyor... CubeIde ve hal lib de yapmam için bir ayarı varmı ?
Diyeceksiniz ki neden MikroC de yapmıyorsunuz cracklı program kullanmak istemediğim için CubeIde de  devam etme ve öğrenmek istiyorum. Kolay gelsin.

mert07

RaMu

Ek:
Yazdım o kadar ama kodlarına bakmamıştım
şimdi baktımda yazdıklarım kınu başlığıyla alakalı ama probleminin kaynağıyla pek alakalı değil.
Kodlarını biraz daha inceleyip birdaha cevaplamam lazım.
Basit bir hata var gibi görünüyor kodlara üstünkörü bakınca.

----------------
Kesmede uzun sürecek bir şey yapmaman lazım,
yaparsan program karman çorman olur bir mantık çerçevesine oturmaz.
En basiti kesmeye girdin şedi yaktın,
kesmenin içindeyken ledi söndürmek için beklersen
o sırada uarttan yeni veri gelir bu veriyi kaçırırsın,
işlemcine göre ya hata vektörlerine gide
yada uart tamponu taşar hata bayrakları işaretlenir bayrajlar sıfırlanmadan program veya uart devam edemez vs.
Çok problem yaşarsın.
Kesinlikle böyle yapacağım ben nehrin tersinede yüzerim diyorsan o başka.

Yinede kesmeye girme veya kesmede alınan bir veriye göre
programda halihazırda yapılan işi bırakıp başka bir rutini çalıştırmak gerektiği algoritmalar çok oluyor.
Bunun içinde bahsettiğin gibi bayraklarla program çalışıyor ve programın içinde bayraklar çok çok kısa sürelerle kontrol edilecek şekilde program yazılıyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Murat Mert

Ramu hocam açıklamalar içi teşekkürler. Timer kesmesinde de ufak tefek işlemler yapılabilmeli aslında. CCS c ve MikroC arm da sıkıntı duymadan ve mcu ya zorluk çıkarmadan işlemleri yapabiliyordum. Main için de denemeler de delay lar atıp sıkıntı olup olmadığını kontrol diyordum. sıkıntı olmadan işlem yapıyordum.
Mutlaka bir yolu vardır diye düşünüyorum...
Belki hatalıyım ama rtos da timer içinde çalışan bir program. Ha derseniz neden rtos yapmadın, rtosa hiç hakim değilim. Açıklamalar için tekrardan teşekkürler.  :)  :)  :)
mert07

z

Ilk timer interrupti ardindan ne yapacaksan yap. Bu esnada oncelikli interruptlar bu yapmakta oldugun isi kesiyor olsa bile yapmak istedigin uzun is bittiginde bir sonraki timer interrupti hala gelmediyse sorun yok demektir.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Murat Mert

Açıklama yapanlara teşekkürler. Program içinde kesmeler de sadece flag gösterip main içinde halletmemiz en mantıklısı o zaman.Tekrar teşekkürler  :)
 
mert07

RaMu

Kodlara alıcı gözle baktım.
İki programın tek farkı,
birinci programda uart kesmesi ile gelen veri alınıyor,
timer kesmesiyle zaman tutulup dolduğunda bir bayrak set ediyilor,
bu bayrağa göre main de uart ile bir veri gönderiliyor.

İkinci programda ise yine uart kesmesi ile gelen veri alınıyor,
timer kesmesiyle zaman tutulup dolduğunda bir bayrak set edilmiyor,
çünkü bu bayrağın set edileceği yerde direk uart ile bir veri gönderiliyor.

uart_send();
fonksiyonunuda görmek lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html