STM32 – TIMMER 1
Herkese merhabalar, bu makalede TIMMER (sayıcı) konusuna giriş yapacağız.
Timer (Zamanlayıcı) modülleri, zamanlama, ölçüm, PWM (Pulse Width Modulation) üretebilme ve çeşitli zamanlama işlemleri için kullanılabilirler. Bu nedenle, birçok uygulamada kullanılan önemli bir bileşendir.
İlk olarak basit bir sayma işlemi yaparak bir ledi yakıp söndüreceğiz.
Elimizde hesaplama yapmak için bir formül var işte bu formül;
> saniye = (period + 1 ) * (prescaler + 1) / clock
- Period –> sayma işleminin kaça kadar gideceğini belirler (kısaca)
- Prescaler –> ön bölücü (ksaca)
- clock –> TIM Faz hatına gelen frekansın 2 katı (eğer bölme orannı 1 den farklı ise)
saniye = (3999+1) * (41999) / clock
saniye = 2
Burdaki ayarlarda dikkat edilmesi gerekenler;
1- Prescaler değeri 2^16 yani 65536 ‘dan daha büyük olamaz
2– 2 , 3, 1, 23 saniye belirlediğinizde period ve prescaler değerlerini clcok sayısına tam bölünmesi için özenle istediğinz sayıyı seçin
3- formuldeki (+1) olayını dikkate alarak değer verin
Ben burda 3999 sayısına kadar sayacağım sonra tekrardan sıfırlayacağım peki bu kaç saniye içinde olacak ?
Bunun cevabına siz karar vereceksiniz ben 2sn olmasını istedim ve prescaler’a 41999 değerini verdim.
Şimdi kodlara geçelim.
1) Kütüphane ve counter adında bir değişken tanımlıyoruz.
#include "stm32f4xx.h"
int counter = 0;
2) Structure Yapılarını tanımlıyoruz.
TIM_TimeBaseInitTypeDef TIM_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
3) GPIO_Config adından bir fonksiyon tanımlıyoruz ve bunun içerisine led ile alakalı tüm yapıları giriyoruz.
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
4) TimerConfig() adında bir donksiyon tanımlıyoruz ve bunun içerisine Timmer ile alakalı tüm yapıları giriyoruz.
a) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
Bu kod ; APB1 faz hattındaki TIM2 hattını aktif eder
b) TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
Bu kod; Clcok (saat) ayarını kaça böleceğimizi ayarlar, biz 1’e böldük.
c) TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
Bu kod; Sayma işleminin hangi yöne doğru olacağını belirler , biz artan olarak saydırıcağız.
d) TIM_InitStructure.TIM_Period = 3999;
Bu kod; period sayısını ayarlar , period sayısı sayma işleminin kaça kadar olacağını belirler ve bu değeri formülde kullanır.
e) TIM_InitStructure.TIM_Prescaler = 41999;
Bu kod; Formülde kullanağız.
f) TIM_InitStructure.TIM_RepetitionCounter = 0;
Bu kod;
g) TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
Bu kod; tüm bilgileri başlatmamızı sağlıyor.
h) TIM_Cmd(TIM2,ENABLE);
Bu kod; TIM2 ye ait çevre birimlerini aktif ediyor.
5) int main() içerisine gidip bu fonksiyonları tek tek çağıracağız ve while(1) içerisinde counter değişkenimize TIM2 den gelen verileri atacağız ardından bu verileri if içerisinde kullanıp led yakıp söndüreceğiz.
TimerConfig();
GPIO_Config();
while (1)
{
counter = TIM_GetCounter(TIM2);
if(counter == 1999)
GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_SET);
else if(counter == 3999)
GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_RESET);
}
Bu kodun içerisindeki counter = TIM_GetCounter(TIM2) bu işlem, TIM2 den gelen veriyi alır ve counter değişkenine yollar ve ardından veriyi iflerde kontrol ederiz.
2 saniye de 3999 olacak yani 1 saniyeye gelmesi için 1998 sayısına ulaşması gerekecek.
Tüm kod;
#include “stm32f4xx.h”
int counter = 0;
TIM_TimeBaseInitTypeDef TIM_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
void TimerConfig(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStructure.TIM_Period = 3999;
TIM_InitStructure.TIM_Prescaler = 41999;
TIM_InitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
TIM_Cmd(TIM2,ENABLE);
}
void GPIO_Config(void){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
int main(void)
{
TimerConfig();
GPIO_Config();
while (1)
{
counter = TIM_GetCounter(TIM2);
if(counter == 1999)
GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_SET);
else if(counter == 3999)
GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_RESET);
}
}
