Keil ile Arm Programlama
Timer Interrupt
Selamlar. Bugünkü yazıda arm tabanlı stm32f4 devre kartımızda timer modülünü nasıl kullanacağımızı öğreneceğiz. O zaman timer'ın ne olduğu ve ne için kullanıldığını bilerek işe başlayalım.
Her şeyden önce timer bir sayıcıdır. Zamanda ileri yönde veya geri yönde çalışarak periyodik olarak işlemcinin ana programdan çıkarak istenilen fonksiyona gitmesini sağlarlar. Bu işlemi interrupt oluşturarak gerçekleştirirler. Interrupt kelime anlamı olarak '' kesme '' demektir. Timer'lar belirlenen zaman değerleri bittiği zaman interrupt oluşturarak interrupt bloğundaki kodu yürütürler. Bu olay mikroişlemcide şu adımlarla yürütülür ;
1 ) Program normal akışı içerisinde EEPROM üzerindeki verileri okur. Yani normal çalışma ana program döngüsündeki kodlar yerine getirilir.
2 ) Bu çalışma sırasında Timer Flag ( interrupt bayrağı ) sürekli denetlenir.
3 ) İnterrupt bayrağı " 1 " olduğu zaman kaldığı bellek değerine bir pointer ( gösterge ) koyar ve bayrağın gösterdiği kısma gider.
4 ) Program interrupt kodunun olduğu kısma gittiğinde bayrak biti " 0 " durumuna getirilmelidir. Yani interrupt bayrağı temizlenmelidir. Aksi halde program sürekli interrupt kod bloğu içerisinde kalır.
STM32F4 serisinde 8 adet timer vardır. Bu timer'ların 7 tanesi 16 bitlik, 1 tanesi 32 bitliktir. Her timer'ın birbirinden farklı özellikleri vardır ve clock frequency'leri farklı olabilir. Aşağıdaki tabloda bu özellikler gösterilmiştir.
Bu kısa giriş bilgilerinden sonra kodlarımızı buraya atacağım. Ama öncelikle bu konuya çalışırken saçlarımı ağartan timer'da zaman ayarlamasını nasıl yaptığımızı anlatmak istiyorum. İşlemcimiz çalışırken hangi zaman aralıklarında interrupt oluşmasını istiyorsak bu değeri programda kendimiz yazmalıyız. Sonuçta arm'da programın bütün konfigürasyonlarını biz yaptığımız gibi burada da bu görev bize bırakılıyor ( maalesef ).
STM32F4 mikroişlemcimizin timer2 clock frekansı 84 MHz'dir. Timer interrupt hangi frekans aralıklarında gerçekleşmesini belirlediğimiz formül ;
TİMER CLOCK FREKANSI / ( PRESCALER + 1) . ( PERİOD + 1 )
Evet arkadaşlar, her kaynaktan farklı bir bilgi alsam da sonuç olarak karar kıldığım formül budur. Ben buraya clk_frq falan yazmayacağım çünkü kendim içinde anlaşılır olmasını istiyorum. Birazdan kodda göreceğiniz üzere program içerisinde prescaler ve period değerlerini biz giriyoruz. ClockDivision değerini 1 olarak belirlememizdeki olay 84Mhz / 1 = 84 MHz'den timerın çalışma hızını ayrıca orada de belirlememizdir. Ben istiyorum ki 1 sn aralıklarla timer interrupt'ı aktif hale gelsin. O zaman T = 1 / f formülünden interrupt frekansı 1 Hz olmalıdır. ( 1 Hz saniyede 1 veri işlemek demek. )Bunun içinde bize Timer Calculator adında bir program geliştirmişler. Bu program bizim için istediğimiz frekanslara göre değerleri oluşturuyor.
Artık sona geldiğimize göre kodları buraya bırakıyorum. Hemen hemen her satırın sonuna kendimce bir açıklama yazdım. Umarım anlaşılır olmuştur. :)
Yorumlar
Yorum Gönder