Butona basildikca bir bir artan, uzun sureli basislarda artisi bes yapan sayici

Başlatan z, 23 Aralık 2013, 04:31:30

z

#include "STM32F4xx.h"

int Sayac=0;

// FCPU =168Mhz
// FAHB =FCPU
// FAPB2=FCPU/2
// FAPB1=FCPU/4

void SystemInit()
{
unsigned int i;
     (*((int*)0xE000ED88))|=0x0F00000;  
     for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
     RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
     RCC->CR |= 0x00010000;          // HSE Xtal osc calismaya baslasin        
     while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
     RCC->PLLCFGR = 0x07402A04;      // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
     RCC->CR |= 0x01000000;          // PLL calismaya baslasin  (Rehber Sayfa 95)
     while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
     FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
     RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
     while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
     RCC->AHB1ENR |= 0x0000000F;     // GPIO A,B,C,D clock'u aktif edelim 
     GPIOD->MODER = 0x55000000;      // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
     RCC->APB2ENR|=0x4000;           // SYSCFG Enable
          
//   Timer 7 ile calisalim
 
     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =4200-1;              // Prescaler cikis frekansimiz 20KHz
     TIM7->ARR =4000-1;              // Her 200ms de int uretsin 
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     
//   EXTI (Butona basinca pinimiz H oluyor)

     GPIOA->MODER&=~0x00000003;      // GPIO pin ancak inp modunda interrupt uretebilir (Rehber 143)
     SYSCFG->EXTICR[0]&=~0x0000000F; // GPIO A0 interrupt uretecek
     EXTI->RTSR=1;                   // Yukselen kenar tetiklemesi yapacagiz. (EXTI0)
     EXTI->FTSR=1;                   // Dusen kenar tetiklemesi yapacagiz.  (EXTI0)
     EXTI->IMR=1;                    // EXTI0 Int enable (Rehber 202-203)
     EXTI->EMR=0;                    // Event istemiyoruz
     NVIC->ISER[0] = 0x00000040;     // NVIC EXTI0_IRQ interrupti acalim     
          
} 

void EXTI0_IRQHandler ()
{
     EXTI->PR|=0x00000001;           // EXTIO INT flagimizi silelim
          
//   Butona basildi yada birakildi          
          
     if(GPIOA->IDR&1)                // Basili ise
       {
         TIM7->CNT=0;                // Counteri sifirlayalim   
         TIM7->CR1|=0x0001;          // Counter Enable 
         Sayac++; 
         GPIOD->BSRRL=0x8000;        // Led yansin                           
       } 
     else
       {
         TIM7->CR1&=~0x0001;         // Counter Disable       
         GPIOD->BSRRH=0x8000;        // Led sonsun                           
       }               
} 

void TIM7_IRQHandler()
{
     TIM7->SR=0;                     // Timer Int Flagini silelim
          
     if(Sayac%5) Sayac+=5-(Sayac%5); // Sayac otomatik artisda 5'in katlarini saysin            
     else Sayac+=5;                  // Sayiciyi 5 ilerlet
          
//   ornegin sayac degeri 46 iken 5 ilave etmek yerine 4 ilave edelim ve 50 olsun
//   daha sonraki artislar artik bes bes gidebilir          
          
     GPIOD->ODR^=0x8000;
} 

//   Butona her basista Sayac degiskeni bir bir artar
//   Eger butona uzun sureli basilirsa Sayac bes bes artmaya baslar

int main()
{
     while(1);
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com