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;
while (DelayCounter < ms);
YanıtlaSilburada 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..