STM32VLDISCOVERY ile Timer Kesmesi

Cortex M3 çekirdeğe sahip Stm32F100Rb işlemcisi ile yapılan Timer kesmesi. kesme kaynağı olarak Timer3 kullanılmıştır. İncelemelerime göre  Cortex M4 lerle aynı yapıya sahip. Sadece “SistemInit” değiştirilerek Cortex M4 ler le de çalışabilir.


Ayrıca MCU nun sahip olduğu timer ların kesme zamanını aşağıdaki formülle hesaplayabilirsiniz.

TIMx_Freg=(APBx_Speed/PSC) / (ARR+1)

 

#include <stm32f10x.h>
int flag;
void SystemInit(void)
{
		RCC->CR |= 0x00010000;//HSEON=1
		while(!(RCC->CR & 0x00020000));//Harici osilatörün stabil olmasi için bekleniliyor(6 komut çevrimi)
	// Asagidaki komutlar HSE OSC nin probminde HSI OSC yi devreye sokar.
		RCC->CIR |= 0x00080000;//HSERDYC: HSE ready interrupt cleared
		RCC->CR |= 0x00080000;//Clock security system Enabled.
		RCC->CIR |= 0x00800000;//CSSC: Clock security system interrupt cleared.
	//*********************************************************************************
		RCC->CR |= 0x00040000;//HSE bypassed.
		RCC->CFGR |= 0x00000080;//AHB configuration 2 ye bölme
		RCC->CFGR |= 0x00002000;//APB2 configuration 2 ye bölme
		RCC->CFGR |=0x07000000;//MCO PLL/2 YAPILDI (GPIOA.8 MCO çikis olarak ayarland1)
		RCC->CFGR |=0x00010000;//PLL girisi PLLDIV olarak ayarland1 PLL OF iken ayarlanmali
		RCC->CFGR |=0x00280000;//PLL CARPMA ORANI 3
		RCC->CFGR2 =0x00000003;//cfgr2 ile plldiv ayarlan1yor bu ayar ile osc yi önbölme yapiliyor.
		RCC->CR |=0x01000000;//PLL ON
		while(!(RCC->CR & 0x02000000));//PLL stabil oldu mu ?
		RCC->CFGR |=0x0000000A;//system clock ayari rehber 79
		RCC->APB2ENR |= 0x0000001C;//PORT C,A,B Clock Enabled.
		GPIOA->CRH &=	0x00000000;
		GPIOA->CRH |= 0x00000009;//A PORTU MAX P_UP CIKIS , MCO çikis için GPIOA.8 ALTERNATE FUNCTION
		GPIOC->CRL &= 0x00000000;//C portu Max hizda çikis olarak ayarlandi
		GPIOC->CRH &= 0x00000000;
		GPIOC->CRL |= 0x33333333;//C portu Max hizda çikis olarak ayarlandi
		GPIOC->CRH |= 0x33333333;
		GPIOA->CRL &= 0x00000000;
		GPIOA->CRL |= 0x99000000;//PA6,PA7 Alternate Output 10Mhz PullUp
		GPIOB->CRL &= 0x00000000;
		GPIOB->CRL |=	0x00000099;//PB0,PB1 Alternate Output 10Mhz PullUp
		TIM3->CCR3 = 0;
		TIM3->CCR4 = 500;
    RCC->APB1ENR|=0x00000002;//Timer3 CLK'u aktif edelim
    TIM3->CR1=0x0080;//Otomatik Reload
    TIM3->PSC =1199 ;//Prescaler degerimiz 1199, Count frekansimiz
    TIM3->ARR =1000;//Counter, Decimal 1000 olunca basa donsun
    TIM3->DIER=0x0001;//Update Int enable
    NVIC->ISER[0] = 0X20000000;//NVIC de Timer 3 interrupta izin verelim
    TIM3->CR1|=0x0001;//Counter Enable
}
void TIM3_IRQHandler()
{
	TIM3->SR=0;//Timer Int Flagini silelim
	if (flag==0x00000001)
	{
		flag=0x00000000;
		GPIOC->ODR= 0xFFFFFFFF;     // Ledler yansin
	}
  	else
	{
		flag=0x00000001;
		GPIOC->ODR= 0x00000000;
	}
}
main()
{
	while(1)
	{
	}
}

Hızlı hesaplama için kendime hazırladığım Microsoft Excel dosyasını Tıklayarak indirebilirsiniz.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogcu bunu beğendi: