9 Temmuz 2014 Çarşamba

STM32F4 İle Timer Uygulaması

  Merhaba arkadaşlar bu yazımızda stm32f4 serisi timerlarına göz atacağız.

    Peki nedir Timer ?
  Timer en basit anlamıyla zamanlayıcı demektir. Bu zamanlama işlemini aşağı veya yukarı belli aralıklarda sayarak belirler.Bu sayma işlemi için clock frekansını referans alır.Yapacağımız basit bir kaç işlemle istediğimiz zamanı timer aracılığıyla elde edebiliriz.

  Stm32f4 serisinde 14 adet timer bulunmaktadır. Bu 14 timer 8 farklı tip kullanım özelliğine açılmıştır.Aşağıdaki RM de bulabileceğiniz resimde timer tipleri ve özellikleri belirtilmiştir.
















  Biz bugün Basic timerlardan TİM7 kullanarak uygulamamızı yapacağız.

#include "stm32f4xx.h"

void Sistemyukle()
{
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 .Rehber RM224
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin.16.bit hseon biti .RM263
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin.17.bit hserdy biti.RM263
RCC->PLLCFGR = 0x07405408; // PLL katsayilarini ayarlayalim
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 263)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle.25.bir pllrdy. Rehber Sayfa263
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (RM 98)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
RCC->AHB1ENR |= 0x00000041; // GPIO A ve G clock'u aktif edelim
GPIOG->MODER = 0x14000000; // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
GPIOG->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

int main(void)
{
Sistemyukle(); //gerekli sistem ayarları yapılıyor.

RCC->APB1ENR|=0x00000020; // Timer7 CLK'u aktif edelim (84 Mhz)
TIM7->CR1=0x0080; // Otomatik Reload
TIM7->PSC =42000; // Prescaler degerimiz 42000-1
TIM7->ARR =2000; // Counter, Decimal 2000 olunca basa donsun 1 sn demek
TIM7->CR1|=0x0001; // Counter Enable

while(1)
{
if (TIM7->CNT >1000)
GPIOG->ODR= 0x00006000;
else
GPIOG->ODR= 0x00000000;
}
}


   Programımızda ne yaptığımıza bakalım. Öncelikle sistemyukle fonksiyonumuz ile stm32f429 kitimiz için gerekli pin ve osc ayarlarını yapıyoruz. Bu ayarlara ileri ki konularda değinmeye çalışacağım.
  Main kod bloğumuza gelmeden önce elde ettiğimiz zamanın nasıl hesaplandığına bakalım. Tim7 de RCC->APB1ENR registerı 1 ise 42Mhz ,1 haricindeki değerler için 84mhz clock vermektedir. Bu değeri tam sayı elde etmek için 4200 olarak belirlediğimiz prescalar değerine bölüyoruz.Elde ettiğimiz frekans değerini 1/f yaparak her bis sayma için geçen süreyi(0.005sn) buluyoruz.Bu değeri 2000 ile çarparak 1 saniye aralıklarla sayacımızın başa dönmesini sağlıyoruz.
  Sonsuz döngü içinde sayacımız 1000 den büyükse ledleri yak küçükse söndür diyerek ledleri flash ediyoruz

Hiç yorum yok :

Yorum Gönder