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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#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.
Ziyaretci : 1894