15 Temmuz 2022 Cuma

HAL Library Bir Milisaniyelik Sayaç #STM32Tips

STM32 HAL Library ile bir proje derlendiği zaman System tick timer üzerinden çalıştırılan, varsayılan olarak bir milisaniye çözünürlükte bir sayaç başlatır. Bu sayaç değerine HAL_GetTick fonksiyonu ile ulaşabiliriz. Bu fonksiyon 32 bit işaretsiz tamsayı (uint32_t) tipinde bir değer döndürür. Siz bu değeri yazdığınız programın herhangi bir yerinde zaman tutmak için kullanabilirsiniz.

Bu sayaç SysTick_Handler interruptı içerisinde HAL_IncTick fonksiyonu ile her bir interrupta girişte bir arttırılır. Sistem arka planda uwTick global değişkenini kullanır.

HAL_GetTick fonksiyonunun arka planda tuttuğu uwTick değişkeni 32 bitlik olduğu için 1 milisaniyede 1 artarak tam olarak 32 bitlik sayıyı doldurması 49,7 gün sürecektir. Bu süre, çok özel bir proje olmadığı sürece bir çok uygulama için zaman tutma, işlemleri sıralama, timeout tutma gibi işlemler için fazlası ile yeterlidir.

Örnek olarak ana döngü içerisinde bir veya bir kaç fonksiyonu periyodik olarak çalıştırmak istersek aşağıdaki gibi bir kod parçası işimizi görecektir. Aşağıda görünen kod parçası 1 saniyede 1 defa çalışır. 999 olan değer 99 olursa 100 milisaniyede bir çalışır.

if ( ( HAL_GetTick ( ) - timeStamp ) > 999 )
{
    timeStamp = HAL_GetTick ( );

    fnc1 ( );
    fnc2 ( );
}

Bu yapıda timeStamp = HAL_GetTick ( ); satırı if bloğunun başında olursa her 1 saniyede 1 defa bu koşul işletilir. Eğer bu ifade if bloğunun en sonuna konursa bu sefer fnc1 fonksiyonu 1 sn+fnc1+fnc2 kadar sürede bir tekrar çağrılır. Bu yaklaşım fonksiyon dallanmalarına göre değişkenlik göstereceği için tercih edilmez.

İkinci bir örnek olarak RTCsi olmayan bir işlemcide gerçek zaman bir haberleşme kanalı üzerinden alınır ve işlemci içerisindeki HAL_GetTick ( ); ile eşleştirilir. Böylece işlemci kapanıp açılana kadar işlemci kristali ile gerçek zamanı tutabilirsiniz.

Bu zaman referansı başka bir çok noktada işinize yarayabilir.



CAN Bus Frame Tipleri

Yazıya başlamadan önce CAN Bus temelleri ve mesaj yapısının temellerini incelemek için bu linkte yer alan blog yazısını inceleyebilirisiniz ...