COIDE İLE NUCLEO-F401RE PROGRAMLAMA – SYSTICK Timer ile Gecikme

Döngü ile gecikme oluşturmak çok tavsiye edilen bir yöntem değildir. Bunun yerine timer kullanarak gecikme oluşturmak daha yaygın bir kullanımdır. Mikrokontrolümüzde bu amaçla oluşturulmuş özel bir timer bulunmaktadır. Şimdi systick timer olarak adlandırılan bu timer ile nasıl gecikme oluşturabileceğimize bakalım.


#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

static __IO uint32_t TimingDelay;

void SysTick_Handler(void);
void Delay(__IO uint32_t nTime);
void TimingDelay_Decrement(void);

int main(void)
{

/* Setup SysTick Timer for 1 msec interrupts.
------------------------------------------
1. The SysTick_Config() function is a CMSIS function which configure:
- The SysTick Reload register with value passed as function parameter.
- Configure the SysTick IRQ priority to the lowest value (0x0F).
- Reset the SysTick Counter register.
- Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
- Enable the SysTick Interrupt.
- Start the SysTick Counter.

2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
inside the misc.c file.

3. You can change the SysTick IRQ priority by calling the
NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
call. The NVIC_SetPriority() is defined inside the core_cm4.h file.

4. To adjust the SysTick time base, use the following formula:

Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)

- Reload Value is the parameter to be passed for SysTick_Config() function
- Reload Value should not exceed 0xFFFFFF
*/
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}

/* GPIO init */
// LED PIN AYARI
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // A portunun saat darbesini aktifleştidik.

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 5 numaralı pin için ayarlıyoruz.
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Pin çıkış tipini ayarladık.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Pinimizi output olarak ayarladık.
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Pull Up direncini pasif yaptık.
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Pinin maksimum çalışma frekansını ayarladık.
GPIO_Init(GPIOA, &GPIO_InitStructure); // Ayarları uyguluyoruz.

while(1)
{
GPIO_ToggleBits(GPIOA, GPIO_Pin_5); // Buton basıldı ise ledi tersliyoruz.
Delay(100);
}
}

/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}

/**
* @brief Inserts a delay time.
* @param nTime: specifies the delay time length, in milliseconds.
* @retval None
*/
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;

while(TimingDelay != 0);
}

/**
* @brief Decrements the TimingDelay variable.
* @param None
* @retval None
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}

Systick timer atadığımız değerden geriye doğru sayar ve sıfıra ulaştığında bir interrupt oluşturur. Bu sebeple interrupt fonksiyonu ve interruptları sayacak bir fonksiyon oluşturmamız gerekiyor.

Koddaki açıklamalı kısım ve fonksiyonlar ST’nin kendi örneklerinden alınmıştır ve yapılması gerekenleri gayet güzel anlatmaktadır. İf karşılaştırması içerisinde kullanılan
SysTick_Config(SystemCoreClock / 1000) fonksiyonu ile systick timera sayacağı değer atanmış olur. Bu değer ataması sonunda systick timer her 1ms de bir interrupt oluşturacaktır.

Bu ayarları yaptıktan sonra tek yapmamız gereken kodumuzda gecikme istediğimiz yere Delay() fonksiyonu eklemektir.

Proje dosyasını linkten indirebilirsiniz. –> coide_systick_gecikme_uygulamasi

Etiket(ler): , , , , , .Yer işareti koy Kalıcı Bağlantı.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir