STM32 - ARM Cortex M

STM32 – STDPeriph ile SYSTICK TIMER

Bu yazımızda SYSTICK TIMER konusunu ele alacağız.

SYSTICK TIMER basit bir zamanlayıcıdır. Diğer timer’lar içlerinde birçok özellik bulundurur fakat bu timer içerisinde  zamanlama(sayma) işlemi ve kesme işlemi var.

Eğer basit bir sayma veya kesme işlemi yapılacaksa normal timer’lar bu işlem için aşırı gelebilir, daha iyi anlaşılsın diye örnekle açıklayayım; elimde 10 özellikli bir timer birde systick timer  var yapacağım işlem ise 1000’e kadar saymak olacak , bunun için 10 özellikli timerı kullanmak israf olacaktır bunun içi SYSTICK TIMER kullanmak daha akılıcadır.

SYSTICK TIMER ; ARM Çekirdeğinin içerisine gömülüdür , bunun için bu timer’a bakılacağı zaman ‘ARM Cortex’ kütüphanesine yada dökümanlarına bakılmalıdır.


Kod:

1) Kütüphane eklendi , count adında değişken tanımlandı ve GPIO işlemleri için Structure yapısı tanımlandı.
#include "stm32f4xx.h"
uint32_t count;
GPIO_InitTypeDef GPIO_InitStructure;

2) Altaki iki fonksiyon birbirlerine  bağlı çalışıyor.

void delay_ms(uint32_t time){
count = time;
while(count);
}

void SysTick_Handler(void){
if(count > 0)

– Gelen “time” verisini “count” değişkenine atadık
– Ardından SysTick_Handler() fonksiyonuna dallandı ve burada count değerini 1 azaltık.
– “count” değeri arka planda 1’er 1’er azalıyor
– Bu azalma işlemş while() fonksiyonun içerisinde kontrol ediliyor eğer 0’dan büyük ise
while() fonksiyonunda bekliyor , bu sırada arka planda count değeri azalmaya devam ediyor.

DİKKAT!!
void SysTick_Handler() fonksiyonu çalıştırılırken arka planda “stm32f4xx_it.h”
kütüphanesinin içerisinde aynı fonksiyon çalıştırılır bu nedenle derleyici hata mesajı yollar.

Bunun çözümü için kütüphaneye gidilir aynı fonksiyon silinir yada yorum satırına alınır.
Biz kütüphaneye gidip yorum satırına alacağız.

 

3) SYSTICK TIMER ile ledleri kontrol etmek için GPIOConfig() adından bir fonksiyon oluşturuyoruz ve bunun içine ledlerin ayarlarını giriyoruz.

void GPIOConfig(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}

GPIO Config hakında daha fazla detay için tıkla.

4) int main() içerisinde GPIOConfig() fonksiyonunu ve SysTick_Config() fonksiyonunu çağırıyoruz SysTick_Config fonksiyonu arka tarafta tanımlı bu yüzden bizim harici olarak tanımlamamıza gerek yok.

int main(void)
{
GPIOConfig();
SysTick_Config(SystemCoreClock/1000);
while (1)
{
GPIO_ToggleBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
delay_ms(1000);
}
}

SysTick_Config(SystemCoreClock/1000); içerisindeki bilgiler SYSTICK TIMER in ne sıklıkla kesmeye gireceğini hesaplıyor.
–> SystemCoreClock : Ana frekansım
–>
* SystemCoreClock/1000           –>  1ms    de bir interrupta dallanır
* SystemCoreClock/100000      –>  10us  de bir interrupta dallanır
* SystemCoreClock/1000000   –>  1us     de bir interrupta dallanır

Bu işlemler sonucu 4 led 1 saniye aralıklara yanıp söner.


Tüm kod;

#include "stm32f4xx.h"
uint32_t count;
GPIO_InitTypeDef GPIO_InitStructure;
void delay_ms(uint32_t time){
count = time;
while(count);
}
void SysTick_Handler(void){
if(count > 0)
count--;
}
void GPIOConfig(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
// LEDS configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
int main(void)
{
GPIOConfig();
SysTick_Config(SystemCoreClock/1000);
while (1)
{
GPIO_ToggleBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
delay_ms(1000);
}
}

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu