Kesmeler ve Timer TIM5
Daha önceki
yazılarımızda kesme işlemini anlatmıştık (Kesmeler ve Portlar yazısı). Bu
uygulamada Timer ve kesme işlemini kullanarak işlemcinin kesin olarak
tanımlanmış zaman aralıklarında bazı yararlı işler yapması sağlanmıştır. Bu durumda
işlemci port E’nin bit-3’ünde her kesme isteğinde 2 (iki) ardışık darbe sinyali
oluşturur.
Mikrodenetleyicinin bu uygulamadaki davranışları basit bir
şekilde Figür 1’de gösterilmiştir.
Figür 1. Periyodik kesme istekleri uygulamasında kullanılan
basitleştirilmiş yapı
Bu uygulamada TIM5 Timer’ı kullanılmıştır. TIM2
Timer önceki yazılarımızda anlatılmıştı. TIM5
Timer kullanımına TIM2 Timer kullanımına
benzer. TIM5 Timer 32-bit sayıcı ve sayma için
kontrol ve giriş sinyali seçimi için ek donanıma sahiptir. TIM5 Timer mikrodenetleyici içerisindeki 84MHz
frekansı ile sürülür. Bu sayıcı için çok hızlı bir clock’tur. Varsayılan olarak
Multiplexer daha önce tanımlanan multiplexer’lar ile bu clock sayıcı girişine
bağlanmıştır.
TIM5 Timer önceden tanımlanmış
değerden yukarı doğru sayar ve sıfır olduğunda reset’lenir. Sayaç değeri sıfıra
döndüğünde güncelleme olayı çağırılır. Ön değer TIM5_ARR(Auto Reload Register) register’ı
içerisinde tutulur. TIM5_ARR
register değeri sıfır ise o zaman sayıcı 4.294.967.295’e
kadar sayar. TIM5_ARR register’ı
84000 olarak ayarlanır ve clock 84MHz kullanılarak figür 1’de görüldüğü gibi T zaman aralıklı sinyaller 1ms olacak şekilde üretilir. Bu güncelleme
kesme isteği kullanılarak yapılabilir.
Güncelleme
olayları NVIC denetleyicisinin girişi için kesme istekleri
konumlandırılır. TIM5 Timer’ından
gelen kesme isteği için kanal aktif edilmelidir. Bu “NVIC_EnableIRQ” fonksiyonu çağırılarak NVIC denetleyici aktif edilerek yapılır.
Kesme
fonksiyonu kesme isteği ile çalıştırılır. Sinyal oluşturmak için işletilecek
olan komutlar Kesme fonksiyonu içinde yapılmalıdır. Bu durumda 4 duruma ihtiyaç
vardır; port E pin 8 high-low-high-low yapılır. Ek olarak güncelleme olayı TIM5_SR (Status Register) bit-0’ da tutulur. Bu bit
aynı kesme isteğinin tekrarlayabilmesi için kesme fonksiyonu içerisinde
temizlenmelidir.
Ve olaylar şu
şekilde devam eder. TIM5 sayacı önceden
belirlenmiş değere geldiğinde TIM5_ARR register’ında
tekrar yüklenir, TIM5_CNT sayaç register’ının
içeriği sıfıra döndüğünde olaylar tetiklenir ve ardından sayaç sıfırdan saymaya
başlar. Tekrar yüklenen olaylar TIM5_SR register’ı
bit-0’ına kayıt edilir ve eş zamanlı olarak TIM5 Timer üzerinden
NVIC denetleyicisinde kesme isteğine izin
verilir. Daha sonra NVIC denetleyici bu parça
kesme isteğine cevap vermek için aktif edilir.
Normal program akışında işlemci bununla kesme işlemini yapmaya zorlanır.
Ve kesme fonksiyonu çalıştırılır. Kesme fonksiyonu içerisinde işlemci port E
pin bit-3’ünü 2 kez ardışık darbe sinyali oluşacak şekilde değiştirir ve kesme
fonksiyonunun çalışmasını kabul etmek için güncelleme olayı kaydının tutulduğu TIM5_SR register’ının bit-0’ını temizler. Daha sonra işlemci
normal programa devam eder.
Uygulama
kodları figür 2’de verilmiştir. Program port A, port E ve TIM5 Timer clock’larının aktif edilmesi ile başlar.
Port E’deki pin çıkış olarak ayarlanır darbe sinyalleri burada oluşacaktır ve
port A’nı pin’i çıkış olarak ayarlanır. Burada bir adet LED bağlıdır. Butona basılı
tutulduğunda LED yanmakta, buton bırakıldığın LED sönmektedir. Bu işlem normal
program içerisinde yapılmaktadır.
#include
"stm32f4xx.h"
int main () {
RCC->AHB1ENR |= 0x0010; // GPIOE ve GPIOA clock aktif edilir.
RCC->APB1ENR |= 0x00000008; // Timer 5 clock aktif edilir.
GPIOE->MODER |= 0x00010000; // port E pin’i çıkış olarak ayarlanır.
GPIOA->MODER |= 0x00001000; // LED’in bağlı olduğu pin çıkış olarak
ayarlanır.
NVIC_EnableIRQ(TIM5_IRQn); // TIM5 kesmesi aktif edilir.
TIM5->ARR = 84000; // Auto Reload Register değeri => 1ms
TIM5->DIER |= 0x0001; // DMA/IRQ Enable Register – kesme güncellemesi
aktif edilir.
TIM5->CR1 |= 0x0001; // sayma işlemi başlatılır
while (1) {
if (GPIOE->IDR
& 0x01) GPIOA->ODR |= 0x0040; // butona basıldı ise LED’i yak.
else
GPIOA->ODR &= ~0x0040; // LED’i söndür.
};
}
void
TIM5_IRQHandler(void)
{
TIM5->SR &= ~TIM_SR_UIF; // TIM5 kesme bayrağını temizle
GPIOE->ODR |= 0x0100; // PE08 yukarı (high)
GPIOE->ODR &= ~0x0100; // PE08 aşağı (low)
GPIOE->ODR |= 0x0100; // PE08 yukarı (high)
GPIOE->ODR &= ~0x0100; // PE08 aşağı (low)
}
Figür 2. Port E bit-3 kesme isteği kurulumu
Kesme
denetleyicisi “NVIC_EnableIRQ” fonksiyonunun TIM5 timer tarafından çağrılmasıyla aktif edilir. Kurulum
TIM5 timer ayarlarının yapılması ile sona erer. Geri
yükleme değeri TIM5_ARR register’ı içerisine
yazılır ve güncelleme olayı TIM5_DIER register’ının
LS bit’inin ayarlanması ile kesme isteği
tarafından konumlandırılır. Sonuç olarak timer TIM5_CR kontrol
register’ının LS bit’ini set ederek çalıştırmak
için aktif eder.
Ana döngü
içerisinde buton kontrol edilir. Butona basılı tutulduğu sürece LED yanar
durumda kalır.
Kesme
fonksiyonu kesme vektör tablosunda ki isme göre isimlendirilir(TIM5_IRQHandler). Fonksiyon herhangi bir değişken
içermez, tanımlamada “void” kelimesi kullanılır. Fonksiyon içerisinde ilk
olarak güncelleme olayı bayrağı temizlenir ve daha sonra 2(iki) darbe sinyali
üretilir.
Şimdilik bu kadar arkadaşlar
Sorularınız ve önerileriniz için m.hakki.kaplan@gmail.com adresinden her zaman bana ulaşabilirsiniz.
Hakkı KAPLAN
Hiç yorum yok:
Yorum Gönder