STM32F4 Timer2 kesmede period ayarlaması sorunsalı

Başlatan unknownperson, 26 Eylül 2015, 14:33:35

unknownperson

STM32F4 discovery kitinde timer interrupt konusunu internetten çalışıyordum.
Kod aşağıda, yazdığım kodda toggle yapmasını beklerken yapmıyor bunun nedeni sanırım period ayarımda ki yanlışlıktan kaynaklanıyor.
Period'u 20 200 2000 20000 hepsini denedim, fakat değişen bir şey olmadı sürekli yanıyor.
İkinci bir sorunum ben bu kesmeyi main içinde fonksiyon çağırarak yapmam gerekmiyor mu ? Yoksa period olarak belirttiğimizden o zaman gelince otomatik kendisi mi yapıyor ?

#include "stm32f4xx.h"                  // Device header

int main(){
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	//GPIO CONF.
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	
	//TIMER CONF.
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_TimeBaseStructure.TIM_Prescaler =4199;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_Period =200;
	TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV4;
	TIM_TimeBaseStructure.TIM_RepetitionCounter= 50;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	TIM_Cmd(TIM2, ENABLE);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	//INTERRUPT CONF.
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

void TIM2_IRQHandler(){
	
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
		{
	
	TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
			//USER CODE
			
	GPIO_ToggleBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 );
			
			//USER CODE
	}
		
	}//End of Function


Klein

Main rutininde ayarları yaptıktan sonra 
while(1);
ekleyin.

Kesme rutini donanım tarafından çağırılır. 

unknownperson

Alıntı yapılan: Klein - 27 Eylül 2015, 00:10:10
Main rutininde ayarları yaptıktan sonra 
while(1);
ekleyin.

Kesme rutini donanım tarafından çağırılır. 
Dediğinizi önceden denemiştim olmamıştı şimdi oldu.

Peki diyelim ben bir program çalıştırırken şu olursa kesmeye git nasıl diyeceğim if deyiminin içine bir şey yazmam gerekmiyor mu ? her zaman periodunu hesaplayıpta mı kesmeye yollatıcam ?

muhittin_kaplan

"Su olursa kesmeye git" mi yoksa "su olursa timer kesmesini calistir" mi

unknownperson

Alıntı yapılan: muhittin_kaplan - 27 Eylül 2015, 11:43:00
"Su olursa kesmeye git" mi yoksa "su olursa timer kesmesini calistir" mi
Kesme olayı bildiğim kadarıyla bir işlem yapılırken denetlenen ve denetimde belli bir koşul gelince programın o noktasında fonksiyona giden fonksiyonu çalıştırdıktan sonra tekrar aynı kaldığı yerden devam eden bir olay.

Benim demek istediğim "su olursa kesmeye git" sanırım bunun için timer kesmesi yerine başka kesme kullanmak gerekiyor, en azından sizin sorunuzdan bunu anladım :)

muhittin_kaplan

Kesme bir tetikleme uyari geldiginde ana programin calismaya ara verip kesmenin geregini yapip ana programa devam etmesidir. Bu tetikleme timer la belirli peryotlarla yada bir pin e 1 yada 0 vererek, usart dan bir data geldiginde yada adc nin isi bittiginde olusturulabilir.
Sen yukardaki programinla normalde calisan bir programini timerla durdurup timer kesmesini. Geregini yapip tekrar ana programina yani while a donuyorsun.
Genelde blinky yapilir ama gercek bir ornek vereyim. Bir lcd olsun ve her 10ms de bu lcd yi tazelemen gerek. Tabi bu arada ana programinda adc okuyacaksin keyboard kontrol edeceksin. Burada timer i 10ms ye kurarsin ve kesme alt programina lcd yi tazeleme kodlarini yazarsin

muhittin_kaplan


Klein

Normalde donanım kesmeleri donanım tarafından tetiklenir. Kullanıcı donanım kesmesi tetiklemez.
Bazen ( Örneğin :kenar sezmeli kesmelerde başlangıç durumununu kontrol etmek için ) kullanıcı bu kesmeyi tetikleyebilir.   
NVIC_SetPendingIRQ(XXXX_IRQn);

kodu ile istenilen kesme tetiklenebilir.
Normal şartlarda donanım kesmelerinin kullanıcı tarafından tetiklenmesi bence uzak durulması gereken bir davranış.   

Eğer program akışı içerisinde kullanıcı tarafından tetiklenen bir kesme gerekirse, yazılım kesmeleri veya olaylarını kullanabilir.
Bunun için EXTI kesmelerine bakınız.

unknownperson

Yanıtlarınız için çok teşekkür ederim, güzelce çalıştıktan sonra başka sorum olursa bu konu altında yazmayı düşünüyorum yanıtlarsanız sevinirim.

İyi bayramlar  :D