11 Kasım 2015 Çarşamba

STM32F407 Timer 2 ile Darbe Sayımı

Mikrodenetleyici 14 (on dört) tane Timer’a sahiptir. Diğer özellikleri figür 1’de aşağıda gösterilmiştir (DM00037051.pdf sayfa 29).  Her Timer grubunun detaylı özellikleri için RM0090 teknik dokümanına bakabilirsiniz. Biz bu uygulamamızda Timer2’yi mikrodenetleyicinin pin’ine uygulanan darbeleri saymak için kullanacağız. Sayılan darbeleri anlık LCD üzerinde göstereceğiz. 3 (üç) adet buton, saymayı başlatmak için, durdurmak için ve başa almak için kullanılacaktır. Timer2 (RM0090, bölüm 14)  giriş pin’i olarak geliştirme kartımızın (stm32f4discovery) kenarlarında bulunan bir pin’i kullanacaktır.


Figür 1. STM32F407 içerisinde bulunan Timer’ların diğer özellikleri

                Kullanılan 16-bit sayıcı TIM1 ve TIM8 Timer’ları, mikrodenetleyici içerisinde bulunan tüm Timer’lardan daha karmaşık Timer’lardır. TIM2 ve TIM5 Timer’ları TIM1/TIM8 ‘in 32-bit sürümleridir. Fakat daha az donanım içerirler ve bundan dolayı daha az seçenekleri vardır. TIM3 ve TIM4 Timer’ları TIM2/TIM5’in 16-bit sürümleridir. TIM9, TIM10 ve diğerleri TIM4 Timer’ın düşük sürümleridir.


                Tüm Timer’lar RM0090 teknik dokümanında Figür 65, sayfa 294’de blok diyagram olarak verilmiştir. Biz uygulamada TIM2 Timer’ını kullanacağız ve bu nedenle basitleştirilmiş TIM2 Timer blok diyagramı Figür 2’de gösterilmiştir (referans doküman RM0090, Figür 119, sayfa 419).

Figür 2. TIM2 ve TIM5 Timer’larının blok diyagramıdır. Sayıcılar yeşil kutular ile clock seçimi mavi kutular ile giriş sinyalleri şartlandırıcıları pembe kutular ile ve çıkış kontrolü gri kutular ile gösterilmiştir.

                CNT sayıcısının (Yeşil) içeriği TIM2_CNT register’ı içerisindedir ve bu register içerisinden okunarak anlık değer LCD üzerinde gösterilebilir. Bu register 32-bit genişliğindedir. Pre-scaler ve auto-reload register’larını biz bu uygulamada kullanmayacağız.

                Sayıcı sayma işlemi için clock sinyaline ihtiyaç duyar(CK_PSC). Clock sinyali figür 2’de üst kısımda mavi kutucuklar ile gösterilen parçalardan elde edilir. Sayma işlemi için birkaç sinyal ve clock sinyali seçimi için multiplexer’lar bulunur (bu uygulama için 2 tanesini kullanıyoruz). TIM2_CH2 Timer girişini, port A’nın PA01 pin’ini kullanacağız. Test kartımızda bulunan PA01 hattı tamponlanmıştır. Sinyal port A’nın PA01 pin’i üzerinden CK_PSC’ye gelmelidir.

1)      Bir Multiplexer mavi kutucuğun en sağında gizlenmiştir; bu Multiplexer MUX_CLK2 olarak isimlendirilir. Bu Multiplexer SMS (Slave Mode Selection) register’ı içerisinde bulunan 3 (üç) bit vasıtasıyla kontrol edilir. SMS’in 3 (üç) biti “External clock Mode 1” olarak ayarlanır ki sayaç clock’u için de TRGI (Trigger Input) hattı seçilir. Detaylı bilgi için RM0090 teknik dokümanının sayfa 458’indeki açıklamalara bakabilirsiniz.
2)      Bir Multiplexer tetikleme (Trigger) sinyalini kaynaklardan seçmek için kullanılır. Bu seçimin kontrolü için TS olarak isimlendirilen TIM2_SMCR register’ı içerisinde yer alan 3 (üç) bit kullanılır. Bu bit’ler “110” olarak ayarlandığında TI2FP2 (Timer girişi 2, Filtrelenmiş, öncelik olarak hat 2 seçilmiş) hattı seçilir. Bu sinyal pembe kutulardan çıkarak TIM2_CH2 girişindeki sinyal şartlandırıcısında sonuçlanır.
Clock sinyali kullanılmadan önce pembe kutulardaki bir modül içerisinde kullanıma uygun hale getirilir. Buraya TIM2_CH2 girişinden gelen sinyal filtrelenmiş ve doğru kenarda (yükselen veya düşen) sayma işlemi seçilebilir. Her iki ayarlamada TIM2_CCMR1 (Capture Compare Mode 1, bu register TIM2_CH1 ve TIM2_CH2 giriş/çıkışlarına hitap eder diğer 2 (iki) giriş/çıkış’lara da TIM2_CCMR2 hitap eder) register’ının üst yarısında yapılır. Bu ayarlara karşı gelen bit’ler CCS2 (Capture/Compare Selection 2) ve IC2F (Input Channel 2 Filtering) olarak isimlendirilirler. Detaylı bilgi için RM0090 teknik dokümanında sayfa 466’ya bakabilirsiniz.

                Yapılacak bir sonraki şey TIM2_CH2 girişini port A’nın PA01 pin’ine atamak olacaktır. Bunu yapmak için “alternatif fonksiyonlar” olarak adlandırılan seçenekleri port A register’larından ayarlamak zorundayız. Her port için 16(on altı) adet alternatif fonksiyon mevcuttur(RM0090, sayfa 190, Figür 14’e bakabilirsiniz). 16 olasılığın birini seçmek için 4-bit kullanılır. Komple bir port’un alternatif fonksiyonunu seçmek için; 16-bit port pin’leri ise 16x4 = 64 bit’e ihtiyaç duyulur. Bu 64 bit 32-bit’lik AFR[x] olarak adlandırılan register’lar içerisindedir. Burada gösterilen “x” 0 (sıfır) veya “1” değerini alabilir. PA00 pin’i için kullanılacak olan 4 bit AFR[0] register’ının düşük 4 bit’idir. AFR[0] register’ının bir sonraki 4 bit’i ise PA01 pin’ine karşılık gelir (detaylı bilgi için RM0090 teknik dokümanının 287 ve 288nci sayfalarına bakabilirsiniz). TIM1 ve TIM2 Timer’larının alternatif fonksiyonları “0001” yazılarak seçilidir ve biz PA01 için alternatif fonksiyonu değiştiriyoruz. AFR[0] 0x00000010 olmalıdır.

                İlk olarak doğru alternatif fonksiyon seçilidir, port A’nın bit’i için mod ayarının değiştirilmesiyle aktif edilir. Bir bit giriş(00), çıkış (01), alternatif fonksiyon(10) veya analog (11) olarak tanımlanabilir. Bit tanımlamaları GPIOA_MODER olarak adlandırılan register içerisinden yapılır, her port pin’i için 2 (iki) bit kullanılır. PA1 için mod ayarını GPIOA_MODER register’ının içerisine 0x00000008 ( 0000 0000 0000 0000 0000 0000 0000 1000 binary) yazarak yapılır.

                Daha sonra TIM2_CR1 register’ında bulunan CEN bit’inin “1” yapılması ile sayma işlemi başlatılır.

                Örnek program kodu figür 3’de gösterilmiştir. Program standart include dosyaların tanımlanması ile başlar. Port A, port E ve TIM2 Timer için clock aktif edilir. LCD kurulumu yapılır. Sonraki iki satırda port A bit 1 ve TIM1/TIM2 alternatif fonksiyonları aktif edilir. LCD’ye mesaj yazdırılır.

                Timer TIM2 ‘yi kurmak için 3 adım vardır;

1)      TIM2_CCMR1 register’ının 9..8 bit’lerine “01” yazarak TI2 için CH2 giriş kanalı olarak tanımlanır.
2)      TIM2_SMCR register’ının düşük 3 (üç) bit’ine “111” yazılarak External Clock Mode seçilir.
3)      TIM2_SMCR register’ının 6..4 bit’lerine “110” yazılarak Filtrelenmiş Timer girişi seçilir.

TM2_CR1 register’ının bit 0’ına “1” yazılarak sayma işlemi aktif edilir.

        Sonsuz döngü içerisinde sayıcının içeriği LCD ekrana biraz gecikme verilerek gönderilir. Butona basılıp basılmadığı kontrol edilir. Hangi butona basıldı ise o butona ait işlem gerçekleştirilir. Butonlara ait işlemler;
1)      Sayıcıyı reset’leme
2)      Sayıcıyı başlatma
3)      Sayıcıyı durdurmadır.

#include "stm32f4xx.h"
#include "LCD2x16.c"

void main (void){
RCC->AHB1ENR |= 0x01 + 0x10; // Port A  ve  E için clock
RCC->APB1ENR |= 0x01; // Timer2 için clock
LCD_init(); // LCD kurulumu
GPIOA->MODER |= 0x00000008; // tüm port pinleri giriş fakat: PA1 => AF mod
GPIOA->AFR[0] |= 0x00000010; // PA01 için AF1 seçilir-> TIM2_CH2
LCD_string("Timer2:", 0x00); // LCD ekrana mesaj gönder
TIM2->CCMR1 |= 0x0100; // kanal 2 olarak TI2 seçilir
TIM2->SMCR |= 0x0007; // Ext. clk mod 1
TIM2->SMCR |= 0x0060; // TI2FP2 olarak External clock
TIM2->CR1 |= 0x0001; // saymayı aktif hale getir
while (1)
 {
LCD_uInt32(TIM2->CNT,0x40,1); // sayma değerini LCD’ye gönder
for (int i = 0; i<100000; i++) {}; // zaman gecikmesi
if (GPIOE->IDR & 0x01) TIM2->CNT = 0; // sayıcıyı reset’le
if (GPIOE->IDR & 0x02) TIM2->CR1 |= 0x01; // sayıcıyı başlat
if (GPIOE->IDR & 0x04) TIM2->CR1 &= ~0x01; // sayıcıyı durdur
};
}

Ş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