
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–> 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 /**************************************************************************************/
ozan toker
25 Temmuz 2014 at 7:47 am
Makalelerinin çok faydasını gördüm Ayhan ellerine,emeğine sağlık.
Ayhan
25 Temmuz 2014 at 8:06 am
Yardımcı oluyorsa sana ne güzel
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
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.
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.
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.
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ı.
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.