Anasayfa Gömülü Sistemler ARM STM32f1xx Delay Fonksiyonları Yazalım!
ARM

STM32f1xx Delay Fonksiyonları Yazalım!

9 Dakikada Okunur
8
0
56
timer

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
/**************************************************************************************/
Daha fazla ilgili makale
Yazardan daha fazla Ayhan KORKMAZ
Load More In ARM

8 Yorumlar

  1. ozan toker

    25 Temmuz 2014 at 7:47 am

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

    Cevapla

    • Ayhan

      25 Temmuz 2014 at 8:06 am

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

      Cevapla

  2. yakup

    13 Eylül 2014 at 9:11 am

    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

    Cevapla

    • Ayhan

      13 Eylül 2014 at 7:05 pm

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

      Cevapla

  3. Mualla

    9 Temmuz 2015 at 9:44 am

    İ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.

    Cevapla

    • Ayhan

      9 Temmuz 2015 at 2:40 pm

      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.

      Cevapla

  4. Mualla

    10 Temmuz 2015 at 9:57 am

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

    Cevapla

    • Ayhan

      10 Temmuz 2015 at 12:32 pm

      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.

      Cevapla

Cevap Yaz