STM32F407VG Gecikme Kütüphanesi

Başlatan promate, 18 Şubat 2012, 12:03:43

promate

1us den sn arası geçikme rutini belki ihtiyacı olan vardır.
gecikme hassasiyetini define deki katsayılarla ayarladım.

#define SysClock 168.0L //Sistem 168 Mhz de çalışıyor
#define DELAY_uS(A)  _usDelay(((long double) A * ((long double) SysClock)-5.50L) / 21.50L);

void _usDelay(long double Count)
{
  u32 i=0;
for(i=0;i< (unsigned long)Count;i++);
}


Kullanımı:
DELAY_uS(50.5);// 50.5 mikro saniye geçikme
DELAY_uS(55500); //55.5 mili saniye
DELAY_uS(2000000);// 2 saniye

CLR

#1
Paylaşım için teşekkürler fakat delay için systick veya başka timer kullanırsanız interrupt ile de kullanabilirsiniz, işlemci aynı yerde dönüp durmaz.
Aşağıda interrupt kısımlarınıda aktif edebilirsiniz. Tabii bu yapı cortex m3 için, m4 için benzetebilirsiniz.

void
dly_us(u16 us){
    stk_load.b32=(u32)us*k_us;      // reload reg. us*1us için deðeri yükle
    stk_val.b32=0;
    stk_ctrl.bits.ENABLE=1;
    while(!stk_ctrl.bits.COUNTFLAG);//0 iken bekle 
    stk_ctrl.b32=0;
    stk_val.b32=0;
}


void 
dly_ms(u16 ms){
    stk_load.b32=(u32)ms*k_ms;      // reload reg. 1ms için deðeri yükle
    stk_val.b32=0;                  // counterlarý ve flagleri temizle 
//  stk_ctrl.bits.TICKINT=1;        // int. enable
    stk_ctrl.bits.ENABLE=1;         // systick enable
//  while(ms);                      // zaman süresince bekle
// int.siz kullaným
    while(!stk_ctrl.bits.COUNTFLAG);//0 iken bekle 
    stk_ctrl.b32=0;                 // disable ve int kapalý, coreclock seçili 
    stk_val.b32=0;                  // counterlarý ve flagleri temizle  
}


void
Systick_Init(u8 sysfreq){
    stk_ctrl.b32=(u32)0x0;          //int disable, clock kaynagi core clock, systick disable
    k_us=sysfreq/8;		    
	k_ms=(u16)k_us*1000;
}
Knowledge and Experience are Power

promate

evet  delay için en mantıklısı systick. ama böyle bir çözümde kullanılabilir