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
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