2 Temmuz 2018 Pazartesi

STM32 VL Discovery ile ARM Programlama - Delay Kütüphanesi

Bu yazımda sizlerle yeni bulduğum ve sağlıklı olduğunu düşündüğüm bir delay kütüphanesi paylaşacağım. Daha önce paylaşmış olduğum delay fonksiyonu çok sağlıklı değildi , fakat bu paylaşacağım kütüphane, sistem saatini kullanmakta ve bu yüzden de tam sonuç vermekte.

delay.c

// Delay functions using SysTick timer
// Minimal delay length is 1ms

#include "delay.h"


// Delay counter
static __IO uint32_t DelayCounter;


// SysTick interrupt handler
void SysTick_Handler(void) {
   DelayCounter++;
}

// Initialize delay functions
// note: configures the SysTick counter, must be called each time when the core
//       clock has been changed
void delay_init(void) {
   // Set reload register to generate IRQ every millisecond
   SysTick->LOAD = (uint32_t)(SystemCoreClock / (1000UL - 1UL));

   // Set priority for SysTick IRQ
   NVIC_SetPriority(SysTick_IRQn,(1 << __NVIC_PRIO_BITS) - 1);

   // Set the SysTick counter value
   SysTick->VAL = 0UL;

   // Set SysTick source and IRQ
   SysTick->CTRL = (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk);
}

// Do a delay for a specified number of milliseconds
// input:
//   ms - number of milliseconds to wait
void delay_ms(uint32_t ms) {
   // Enable the SysTick timer
   SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

   // Wait for a specified number of milliseconds
   DelayCounter = 0;
   while (DelayCounter < ms);

   // Disable the SysTick timer
   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

// Do a delay for a specified number of milliseconds, MCU in sleep mode
// input:
//   ms - number of milliseconds to wait
// note: all wake-up flags must be cleared before calling this function
//       to ensure proper sleep during delay
void delaysleep_ms(uint32_t ms) {
   // Enable the SysTick timer
   SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

   // Set delay counter
   DelayCounter = 0;

   // Wait for a specified number of milliseconds
   while (DelayCounter < ms) {
      __WFI();
   }

   // Disable the SysTick timer
   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

delay.h


#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"                  // Device header


// Function prototypes
void delay_init(void);
void delay_ms(uint32_t ms);
void delaysleep_ms(uint32_t ms);

#endif // __DELAY_H


Ya da;

delay.h

#include "stm32f0xx.h"                  // Device header
#ifndef __DELAY_H
#define __DELAY_H


void SysTick_Handler(void);
void delay_ms(__IO uint32_t time);
void delay_init(void);
#endif // __DELAY_H

delay.c

#include "delay.h"

uint32_t TimingDelay;
void SysTick_Handler(void) // Her 1ms'de bir olusacak kesmeyi yakaladigimiz fonksiyonumuz
{
if (TimingDelay != 0) // TimingDelay'in degeri sifirdan farkli ise çalistir.
    {
    TimingDelay --; //TimingDelay'in degeri bir azaltir.
    }
}

void delay_ms(__IO uint32_t time) // Delay Fonksiyonumuz
{
  TimingDelay = time; //Kesme fonksiyonunda kullanacagimiz degiskenin degerini ayarliyoruz
  while(TimingDelay != 0); //TimingDelay degiskeninin degeri sifirdan farkli oldugu sürece döngüde kal.
} 
void delay_init(void)
{
 SystemInit();
 SysTick_Config(SystemCoreClock/1000);
}


Bu iki dosyayı oluşturduktan (ister üstteki ister alttaki) sonra kullanmak istediğimiz proje klasörünün içine kopyalıyoruz. GPIO ayarlarını yaptıktan sonra delay_init() fonksiyonunu kullanarak kütüphaneyi hazır hale getiriyoruz. delay fonksiyonumuz artık hazır hale gelmiş oluyor :).

Kullandığınız mikrodenetleyiciye göre include kısmını değiştirmeyi unutmayın :).

Video;



1 yorum:

  1. while (DelayCounter < ms);

    burada işlemci çakılıp kalıyor, yanı kısır bir döngüye girer...

    çözüm ise; Timer ile gecikme kullanmak..
    veya interrupt kullanmak..


    Saygılarımla..

    YanıtlaSil