System Timer Hakkında (SysTick)

Başlatan catan, 05 Mart 2012, 22:26:47

catan

İyi günler herkese.
Adım adım cortex-m3 öğrenmeye başladım. Sıra system timer kullanımına geldi. Ama ne yazıkki bütün kaynaklarda yazanları okumama rağmen kullanımı hakkında bazı sorunlar yaşadım.
SysTick->LOAD  = 500000;
	SysTick->VAL   = 0;
        SysTick->CTRL  = 7;

Bu kod ile system timer'ı hazırlıyorum. Ancak neden böyle yaptığım konusunda bir fikrim yok. Aslında timer'ın mantığı çok basit. LOAD değişkenine yüklediğimiz sayı 0'a dönünce bir kesme oluşuyor. Daha sonra tekrardan LOAD'da ki sayıdan geri saymaya başlıyor. Buraya kadar herşey normal ama kalibrasyon ve clock source biti herşeyi karıştırıyor.
Kalibrasyonundan anladığım şunlar; bu register'a üretim aşamasında bir değer yazılıyormuş. Nedenini tam anlamamakla birlikte eğer AHB'den gelen clock sinyalini kullanırsak zamanda uyumsuzluk mu ne oluyormuş yüksek frekanstan dolayı. Öle bişeymiş. Reference Manualda bu değerin 0x9000 olduğu yazıyor ama ben 0 okuyorum. Zaten Clock source'u System Clock'u olarak seçtiğim zaman kod çalışmıyor. Ama external source'u seçtiğim zaman ( SysTick->CTRL  = 3;) program çalışıyor. Aslında Clock Tree'ye baktığım zaman zaten sytem clock'unun tamamını kullanamıyor. Bu frekansı 8'e bölüyr. Yani 9Mhz'de çalışıyor. External Clock'da 8Mhz'de çalışıyor. E o zaman bu fark niye? Hadi onuda geçtim şimdi bu system timer 8Mhz frekansında mı sayma yapıyor? Aklım iiyice karıştı. Aydınlatan arkadaşlara minnettar kalırım.
Bu arada kesme kodumda şu şekilde;
extern "C"{
void SysTick_Handler(void)
{
   static int k = 0;
   if(k){ GPIOB->ODR = 0xF000; k=0;} else {GPIOB->ODR = 0x0000; k=1;} 
}
}

Birde CountFlag'ı sıfırlamazsak sürekli döngüde kalır diyede bir fikir oluştu okuduklarımdan. Doğru olmadığını programın çalışmasından anlıyoruım ama yinede bi kararsızlık oluşuyor insanda.

Aşağıdaki linktede kısaca açıklama var "System Timer" hakkında
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babieigh.html

catan

Bu arada LOAD yazmacına 0xFFFFFF değerini yükledim. Daha sonra deneme kartında denedim. Ledler arası yanış süresini kronometreyle ölçtüm ve çıkardığım sonuç sanırım timer, CTRL yazmacına 3 değerini yazdığımızda 8Mhz'de çalışıyor

z

https://www.picproje.org/index.php/topic,35896.0.html basliginda System Tick Counter kullanarak 1ms lik int uretmek orneginde komut satirlarinin yanina yapilmis aciklama yeterli olmuyormu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

catan

Arama yaparak ulaşamadım konunuza. Ancak ulaşsaydımda cevabı alamayacakmışım ztn.
Mesela siz System Clock'unu kullanarak çalıştırabilmişsiniz. Ancak ben çalıştıramadım. Ayrıca Flag'ı temizlemişsiniz her seferinde ancak temizlemeyincede çalışıyor. Bunların sebebini anlayamadım.

CLR

Knowledge and Experience are Power

z

Alıntı yapılan: catan - 05 Mart 2012, 23:09:44
Arama yaparak ulaşamadım konunuza. Ancak ulaşsaydımda cevabı alamayacakmışım ztn.
Mesela siz System Clock'unu kullanarak çalıştırabilmişsiniz. Ancak ben çalıştıramadım. Ayrıca Flag'ı temizlemişsiniz her seferinde ancak temizlemeyincede çalışıyor. Bunların sebebini anlayamadım.

Linkte verdigim ornek STM32F407 icin yazildi ve calisiyor.

Flagi silmedeki amac, program referans olmasi acisindan yazildi.

Sildigim flag, set olmus ise counterin 0 dan gectigi anlamina gelir. Eger bu flagi silmemis olsaydim kullanici bu flagi gelisi guzel bir zamanda test etseydi
tick counterin 0dan gecitigi yanilgisina varirdi.

Bu flaga bakmayacaksaniz o satiri kaldirin. Bu islem kodun calismasini engellemez. Ote yandan normalde bu flagi silmek icin sozkonusu registeri okumak yeterli. Ben ilave bir degisken kullanmamak adina registeri okuyup ilgili biti sifir yapip geri yerine yazdim. Normalde bu registerin sozkonusu biti sadece okunan bir bit. Dolayisi ile bu bite yazmanin bir sakincasi yok. Siz silmek icin sadece okuyabilirsiniz. Silmezseniz de bu bit 1 olarak kalir.

Sordugunuz sorunun cevabi icin system tick counter registerlerinin aciklandigi dokumana bakman gerekiyor.

Okumazsan anlayamazsin.

Count Flag (Bit 16): The SysTick timer has not counted to 0 since the last time this bit was read.
0 The SysTick timer has counted to 0 since the last time this bit was read.
1 This bit is cleared by a read of the register or if the STCURRENT register is written with any value.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

catan

Çok teşekkür ederim hocam. Flag konusunda aydınlandım. Ayrıca dökümanı okumuştum ama anlayamamıştım...

mistek

lpc1769(cm3) da system tick timer ı çalıştıramıyorum
   
SysTick -> LOAD = 100000;
SysTick -> VAL  = 0;
SysTick -> CTRL &=~(1 << 16);
SysTick -> CTRL |= 3;  // 7 olması lazım ama 7 yapınca işlemci kilitleniyor CCLK=100Mhz ayarlı

void SysTick_IRQHandler(void)
{
        SysTick -> CTRL &=~(1 << 16);
   SysTick -> VAL  = 0;
   mstick++;
   LPC_GPIO0 -> FIOPIN ^= 1 << 22; // Toggle LED
}

ekrana mstick değerini yazdırıyorum ctrl=3 olunca program kesmeye hiç girmiyor ctrl=7 olunca ekrana 1 kez -28308281977086025 yazıyor ve sonra kilitleniyor yukarıda önerilen linklerin hepsine baktım ama gözden kaçırdığım ne varsa henüz bulabilmiş değilim. Yardımcı olursanız memnun olurum.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R