20 Kasım 2015 Cuma


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 Gülen
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