Ayhan 18 Temmuz 2013 ARM

tick

Merhaba Arkadaşlar bu yazımda STM32VLDiscovery kartında kullanmak için Delay(gecikme) fonksiyonlarını yazacağız. Öncelikle bu yazımda bir kez söyleyeyim ki kitin üzerinde STM32F100B çipi mevcut. Bundan sonraki yazılarımda da bunu bilerek davranacağız.

Öncelikle gecikme fonksiyonlarını System Tick Timer ile oluşturacağız.System Tick Timer kesmesi kullanarak öncelikle 1 ms değerinde kesmeler oluşturacağız. Daha sonra yazacağımız fonksiyonlar ile milisaniye ve saniye bazında gecikmeler oluşturacağız.


Öncelikle belirli fonksiyonlarımız olacak ve bunların ne işe yaradıklarına değinelim.

Bu bölümde fonksiyona girilecek değerin kesme tarafından çağrılarak azaltılmasını ve gerekli değeri elde etmemizi sağlayan fonksiyondur. Kesme alt fonksiyonunda çağıracağız. Dikkat edilmesi gereken nokta ise bir adet TimingDelay adlı global değişken tanımlanmalıdır.

//Azaltma fonksiyonu
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

Kesme alt fonksiyonumuzdur. Bir önceki yazımda verdiğim örnek kodların içinde gördüğünüz _it.c şeklindeki kesme sayfasına yerleştireceksiniz bu fonksiyonu.

void SysTick_Handler(void)
{
  TimingDelay_Decrement();
}

Bu bölümde ise kesme ayarlamak istediğimiz süreyi ayarlayacağız.Formül çok basit.

kesme değeri=Cihazın Frekansı*istenen değer

Buna göre 1ms için–> SystemCoreClock*10^-3=SystemCoreClock/1000 eder.
Bu kodu main fonksiyonunun hemen altına yazacağız.

  if (SysTick_Config(SystemCoreClock / 1000))
  {
    /* Capture error */
    while (1);
  }

Bu kısımda 1 ms değerinde gecikme elde eden fonksiyonu oluşturduk.

//1 ms Kesme
void Delay_ms(uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);
}

Bu fonksiyonda ise 1 saniyelik gecikme elde edeceğiz.Ancak birazcık dolaylı bir şekilde olacak :)

//1 s Kesme
void Delay_s(uint32_t nTime)
{
 uint32_t s;
s=nTime*1000;
Delay_ms(s);
}

Parçaları açıkladığıma göre artık bir örnekle yazımı noktalayayım.Örneğimiz bir önceki UART örneğinin modifiye edilmiş hali olacaktır. Herzaman anlamadığınız veya sormak istediğiniz noktaları yorumlar kısmından sorabilirsiniz.

/************************************************
*                                               *
*@Dosya          :UART.c                        *
*@Açıklama       :UART Veriyi gönderi , kesme   *
*                ile alır. 5sn gecikme yapar    *
*@Versiyon       :v1.0.0                        *
*                                               *
*@Yazar          :Ayhan KORKMAZ                 *
*                  www.ayhankorkmaz.net         *
*@İletişim       :info@ayhankorkmaz.net         *
*@Tarih          :18.07.2013/23:47              *
*Test            :STM32VLDiscovery Üstünde      * 
*                Test Edilmiştir                *  
*************************************************/
 
#include "stm32f10x.h"
  
uint32_t TimingDelay;
  

/**************************************************************************************
Fonksiyon:TimingDelay_Decrement
Amaç     :Kesmeden çağırılarak azaltma yapar
Kullanım :TimingDelay_Decrement();
Dikkat:KESME FONKSİYONUNA MUTLAKA KESME ALT FONKSİYONUNU EKLEMELİSİNİZ!!!
***************************************************************************************/
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}
/**************************************************************************************
Fonksiyon:Delay_s
Amaç     :1 s gecikme yapar
Kullanım :Delay_s(10);
***************************************************************************************/
void Delay_s(uint32_t nTime)
{
uint32_t s;

s=nTime*1000;
Delay_ms(s);
}
/**************************************************************************************
Fonksiyon:Delay_ms
Amaç     :1 ms gecikme yapar
Kullanım :Delay_ms(100);
***************************************************************************************/
void Delay_ms(uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);
}
/**************************************************************************************
Fonksiyon:RCC_Configuration
Amaç     :Kullanılan sistemin clock ayarlamalarını yapar
Kullanım :RCC_Configuration();
***************************************************************************************/
void RCC_Configuration(void)
{
/* GPIO CLOCK Ayari */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* UART CLOCK Ayari */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
 
/**************************************************************************************
Fonksiyon:GPIO_Configuration
Amaç     :Kullanılan sistemin GPIO ayarlamalarını yapar
Kullanım :GPIO_Configuration();
**************************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* USART TX Pın Ayarı */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  // PA.09 USART1.TX-
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* USART RX Pin Ayarı */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA.10 USART1.RX-
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
  
/***************************************************************************************
Fonksiyon:USART_Configuration
Amaç     :Kullanılan sistemin USART1 ayarlamalarını yapar
Kullanım :USART_Configuration(BaudRate);
***************************************************************************************/
void USART_Configuration(unsigned int BaudRate)
{
  //
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = BaudRate;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  
  /* USART ilk ayar */
  USART_Init(USART1, &USART_InitStructure);
  /* USART1 Aktif et */
  USART_Cmd(USART1, ENABLE);
  /*USART1 RX kesme Aktif et*/
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
  
/***************************************************************************************
Fonksiyon:NVIC_Configuration
Amaç     :Kullanılan sistemin KESME ayarlamalarını yapar
Kullanım :NVIC_Configuration();
***************************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
  
/***************************************************************************************
Kesme ALT PROGRAMI
Amaç     :RX Bufferına gelen değerleri Veri[] dizisine alır
***************************************************************************************/
void USART1_IRQHandler(void)
{
 
  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Received characters modify string
  {
    Veri[i] = USART_ReceiveData(USART1);
    i++;
    if (i >= 255)
      i=0;
  }
}
/***************************************************************************************
Fonksiyon:USART_Yaz
Amaç     :Gönderilmek istenen Yazıyı USART üstünden basar
Kullanım :USART_Yaz("Yazı Buraya Gelecek");
***************************************************************************************/
void USART_Yaz(unsigned char *string){
  
    while(*string){
        // wait until data register is empty
        while( !(USART1->SR & 0x00000040) );
        USART_SendData(USART1,*string);
        *string++;
    }
}
/***************************************************************************************
Fonksiyon:Main
Amaç     :Main Fonksiyonudur
***************************************************************************************/
 int main(void)
 {
     if (SysTick_Config(SystemCoreClock / 1000))
        {
      /* Capture error */
                while (1);
        }
  RCC_Configuration();
  GPIO_Configuration();
  NVIC_Configuration();
  USART_Configuration(9600);
  
   
 
   USART_Yaz("AyhanKorkmaz.Net UART1 Calismasi");
while(1)
  {
Delay_s(5);
USART_Yaz("AyhanKorkmaz.Net Gururla Sunar!");
  }
}
  
/**************************************************************************************/
  
#ifdef  USE_FULL_ASSERT
 
void assert_failed(uint8_t* file, uint32_t line)
{
  while (1)
  {
  }
}
#endif
  
/**************************************************************************************/

Yazar :

Elektrik-Elektronik mühendisiyim. 2 yıldır bu blogda yazıyorum. Ve 6 aydır aktif olarak internet siteleri yönetiyorum. Kişisel olarak da teknoloji ve fotoğrafçılıkla ile ilgileniyorum.



Beni sosyal medya hesaplarım üzerinden takip edin:

YORUMLAR

  1. ozan toker

    2 sene ago  

    Makalelerinin çok faydasını gördüm Ayhan ellerine,emeğine sağlık.

    • Ayhan

      2 sene ago  

      Yardımcı oluyorsa sana ne güzel :)

  2. yakup

    2 sene ago  

    makaleniz için teşekkürler. ben bunları keil c++ ile yapmam lazım sanırım siz IAR c ile yapıyorsunuz çok farkı olur mu acaba ? birde ben pic programlama bilmediğim için galiaba 1ms 1s olayını anlıyamadım teşekkürler

    • Ayhan

      2 sene ago  

      C++ ile programlamadım o konuda bilgim yok maalesef.1ms dediğimiz 1 mili saniyedir. 1us de 1 mikro saniyedir.

  3. Mualla

    1 sene ago  

    İyi günler . Ben stm32f407 ile çalışıyorum ve iki ledi beşer saniye yakmam gerekiyor. cmsis_os.h kütüphanesindeki osDelay fonksiyonunu kullanmam gerekiyor ama ben kodu yazdığımda osDelay(2000) diyorum 2 saniye çalışması gerekirken 5 saniye çalışıyor ekstra gecikme oluyor. Bu ekstra gecikmeyi nasıl düzeltebilirim.

    • 1 sene ago  

      Büyük ihtimalle osDelay fonksiyonu char değer kabul ediyor olabilir. Yani maksumum 255 değerine kadar. osDelay(250)osDelay(250)osDelay(250)osDelay(250) şeklinde yapın. 1 sn yapacak mı? Diğer yandan da osDelay(4000) yapın. 10 saniye yapıyor mu? Öncelikle analiz etmek gerek.

  4. Mualla

    1 sene ago  

    Denedim ama bu seferde 250 250 250 250 yaptığımda üç saniye çalıştı 4000 yaptığımda 12 saniye çalıştı.

    • 1 sene ago  

      O zaman o dosyanın içini inceleyin. Belki de timer kullanmıyordur. Bendeki kodu deneyebilirsiniz. Tani kulandığınız işlemcinin çekirdek hızını göze alarak.

Daha fazla ARM
usart
STM32F1xx UART Çalışması

Merhaba arkadaşlar bu yazımda her mikro denetleyici temel bir bağlantı birimi olan UART çalışması yapacağız. Öncelikle STM32VLDiscovery kitini kullanacağım. Özellikle...

stlink
ST-Link Windows 8’e nasıl yüklenir?

Merhabalar, ARM ile uğraşan herkes eninde sonunda bir adet geliştirme kartı alıp yazılım çalışmalarını gerçekte gözlemlemek isteyecektir.Eğer sizde benim gibi...

Kapat