Cortex M3-M4 için SysTick Kullanımı [Açıklama]

Başlatan XX_CİHAN_XX, 25 Eylül 2012, 12:20:22

XX_CİHAN_XX

SysTick timer (STK)
İşlemcinin 24 bitlik sistem timeri vardır. SysTick, yüklenen değerden sıfıra doğru sayar. Debug mod da işlemci durdurulduğunda timer da durur.
SysTick control and status register (STK_CTRL)
Alıntı YapAddress offset: 0x00
Reset value: 0x0000 0004
Required privilege: Privileged
The SysTick CTRL register enables the SysTick features.

Bits 31:17 Rezerve edilen bitler sıfır da tutulmalıdır.
Bit 16 COUNTFLAG:
Sayıcı sıfıra ulaştığında 1 değeri döndürür.
Bits 15:3 Rezerve edilen bitler sıfır da tutulmalıdır.
Bit 2 CLKSOURCE: Clock kaynak seçimi yapılır.
0: AHB/8
1: Processor clock (AHB)
Bit 1 TICKINT: SysTick kesme isteği izin biti
0: Sayıcı sıfıra ulaştığında kesme üretme
1: Sayıcı sıfıra ulaştığında kesme üret
Not:Kesme kullanmadan yazılımsal olarak COUNTFLAG bitini kontrol ederek sayacın sıfıra ulaştığını öğrenebilirsiniz.
Bit 0 ENABLE: Sayıcı izin biti.
Bu bit 1 yapıldığında LOAD registerine yüklenen değer sayıcıya yüklenir ve sayıcı bu değerden geriye doğru saymaya başlar. Sayaç sıfıra ulaştığında ise COUNTFLAG bir olur ve eğer TICKINT set edildiyse kesme oluşur. Daha sonra LOAD registerine tekrar sayacağı değeri yükleyerek sayma işlemini yendine başlatabiliriz.
0: Sayaç devre dışı                         
1: Sayaç aktif
SysTick reload value register (STK_LOAD)

Alıntı YapAddress offset: 0x04
Reset value: 0x0000 0000
Required privilege: Privileged

Bits 31:24 Rezerve edilen bitler sıfırda tutulmalıdır.
Bits 23:0 RELOAD[23:0]: RELOAD değeridir.
LOAD register sysTick sayıcısının başlangıç değerinin yüklendiği registerdir. Bu değeri hesaplarken:
Reload değeri 0x00000001-0x00FFFFFF aralığında herhangi bir değer olabilir. Başlangıç değeri olarak sıfır vermekte mümkün ancak bunun herhangi bir etkisi olmayacaktır çünkü systick sayıcısı zaten verilen değerden sıfıra doğru saymaktadır.
RELOAD değeri aşağıdaki maddelere göre hesaplanır.
•   Eğer birden fazla timer kullanıyorsak N clock palsi kadar saysın istersek N-1 değerini yüklememiz gerekir.
•   Eğer sadece SysTick kesmesi kullanıyorsak N clock palsi kadar saysın istersek N değerini yüklememiz gerekir.
SysTick current value register (STK_VAL)

Alıntı YapAddress offset: 0x08
Reset value: 0x0000 0000
Required privilege: Privileged

Bits 31:24 Rezerve edilen bitler sıfırda tutulmalıdır.
Bits 23:0 CURRENT[23:0]: Sayıcının o anki değerini verir.
Sayıcının Her hangi bir kısmına sıfır yazılabilir. Aynı şekilde COUNTFLAG de silinebilir.
SysTick dizaynı ile ilgili ipucu ve temel bilgiler
SysTick sayıcısı işlemci clocku ile koşar. Eğer düşük güç modunda bu clock durdurulursa sayıcıda durur.
SysTick Register bloğunun başladığı taban adres 0xE000 E010 dir.
Offset adresi taban adrese eklenerek registerin ulaşıldığı adres elde edilir.
İşlemcinin 24 bitlik sistem timeri vardır. SysTick, yüklenen değerden sıfıra doğru sayar.
Debug mod da işlemci durdurulduğunda timer da durur.

Kaynak:
1-   ST   PM0056
STM32F10xxx/20xxx/21xxx/L1xxxx
Cortex-M3 programming manual
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

MC_Skywalker

Birde SYSTICK Calibration Value Register adında register var. Bu tam olarak ne işe yarıyor? neden 10ms kalibrasyonu yapılıyor?

SYSTICK Calibration Value Register (0xE000E01C)

Bit: 31
Adı: NOREF
Türü: Salt Okunur
Reset Değeri : ----
1 Durumunda = Haririci referans clock (STCLK) yok
0 Durumunda =  Harici referans clock var
Bit: 30
Adı: SKEW
Türü: Salt Okunur
Reset Değeri : ----
1 Durumunda = Kalibrasyon değeri 10 ms kesinliğinde değil
0 Durumunda =  Kalibrasayon değiri doğru
Adı: TENMS
Türü: Yaz/Oku
Reset Değeri : 0
10ms için kaliprasyon değeri.  Chip üretisine göre farklılık gösterir.

XX_CİHAN_XX

Bits 23:0 TENMS[23:0]: SysTick sayıcısı HCLKmax/8 kaynağıyla koştuğu zaman ki kalibrasyon değerini gösterir.
HCLK maksimum frekansa programlandığında  SysTick periyodu 1mS olur.
Eğer kalibrasyon bilgisi bilinmiyorsa, işlemci clock frekansından kalibrasyon değerinin hesaplanması gereklidir.
Biz bu değeri hesaplamakla uğraşmamak için bu registerdeki hesaplanmış değeri kullanabilir yada teyit amaçlı kontrol edebiliriz.
SysTick kalibrasyon değeri 15000 de sabilenir. Burada 1mS lik periyot referans alınırak SysTick Clolock 15Mhz (max HCLK/8) e set edilir.


bahsettiğiniz 10mS değil 1mS olacak bu değer maxHCLK/8 frekansının periyodudur.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

MC_Skywalker

The  Definitive Guide to the ARM Cortex-m3 kitabının 142 sayfa Tablo 8.12 de 10ms  olarak yazıyor. Ayrıca regiterin 0:23 bitlerin olduğu bloğa TENMS adı verildiğinin den bahsediyor.

Açıklayıcı bilgi için teşekürler.  şimdilik mbed ile yoluma devam ediyorum. 

XX_CİHAN_XX

Rica ederim hocam muhtemelen hız farkından kaynaklanan bir durum. Yada yazım hatası olabilir.
ST nin Cortex m3 ve m4 programming manuel de 1ms olarak geçiyor.

Ah şu mbed olayına bir başlıyamadım gitti içimde kaldı valla  :) zamansızlık ve üzerinde çalışacak bir proje çıkmaması beni bağlıyor bu konuda.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

fractal

#5
aferdersiniz SysTick olayı nedir? ne işe yarar.bende m3 kullanmaya yeni başladım..
Restantum cogniscutur Quantum deligutur

XX_CİHAN_XX

24 bitlik bir sistem sayıcısıdır. Yüklenen degerden sıfıra dogru sayar ve sıfıra ulaşınca kesme üretir. Countflag bayragını da set eder. programdaki delayları genelde bu timer ile yaparlar.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.