4

Watchdog Timer Nasıl Çalışır?

Bu yazıda Gömülü Sistemlerin kritik çevrebirimlerinden biri olan Watchdog Timer‘dan bahsetmek istiyorum. Öncelikle Watchdog Timer’a geçmeden önce aşağıdaki kodu bir inceleyelim. Aşağıdaki kod parçasını içeren sistemde her 100 ms de bir timer kesmesi oluştuğunu ve mikronetleyiciye pull-down olarak bağlı bir buton olduğunu farz edelim. Şimdi size bir soru; Butona bir kere basıldıktan 5 sn sonra ne olur?

Doğru cevap; 5 saniye sonra sistem aynı şekilde çalışmaya devam eder. Yani led toggle işlemi 200 ms de bir yürütülür. Kodda dikkat edilirse butona basıldığı anda program bir sonsuz döngüye girer. Peki butona basıldıktan 5 saniye sonra nasıl oldu da program led toggle işlemini yapmaya devam etti?

Kesme fonsiyonunun içerisinde her 100 milisaniyede bir count değişkeni azaltıldı. Butona basılmadığı sürece count değişkeni main fonksiyon içeresinde her 200 milisaniyede bir başlangıç değeri olan 30 a eşitlendi. Butona basıldıktan sonra program bir sonsuz döngüye girdiği için count değişkeni tekrar 30 a eşitlenemedi. Kesme fonksiyonu içerisinde count değişkeni sürekli azaltıldığı için bir süre sonra sıfıra eşit olacaktır. Yine kesme fonksiyonu içerisinde count değişkeni sıfıra eşitse yazılımsal reset fonksiyonun çağrıldığı bir if bloğu bulunmaktadır. Yani kısaca bu kod parçası butona basıldıktan 3 saniye sonra(30×100=3000 ms) mikrodenetleyici resetlemektedir.

İşte Watchdog Timer da buna benzer bir şekilde çalışmaktadır. Yazılım herhangi bir yerde bir döngüden çıkamadığında veya programın herhangi bir sebepten dolayı kitlendiği durumlarda mikrodenetleyiciyi resetlemek için kullanılan bir çevrebirimidir. Her mikrodenetleyicide watchdog timer birimi bulunmaktadır. Bu yazıda stm32f1 serisi için nasıl kullanıldığını inceleyelim.

Stm32f103 te iki tane watchdog timer birimi bulunmaktadır. Bunlar IWDG(Independent Watchdog) ve WWDG(Window Watchdog) ‘tur. Bunların arasında bazı farklar olsa da kullanım amacı aynıdır. Bu iki watchdog arasındaki başlıca farklar şunlardır.

  • IWDG dahili clock(40 kHz) kullanırken , WWDG APB1 clock’undan beslenir.
  • IWDG bir kesme oluşturmazken ,WWDG de kesme oluşur.
  • IWDG donanımsal veya yazılımsal olarak başlatılabilir. WWDG ise sadece yazılımsal olarak başlatılabilir.
  • IWDG 12 bit’liktir. WWDG ise 7 bitliktir.

Bu yazıda basit olan IWDG birimine değineceğim. Reference Manual incelendiğinde watchdog timer için iki değişken bizim için önem kazanmaktadır. Bunlar Prescaler ve  Reload değeridir. Bu değerlere göre ne kadar sürede mikrodenetleyicinin resetleneceği hesaplanmaktadır.

Yukarıdaki tablo reference manual’dan alınmıştır. Bu tabloya göre prescaler 32 ve reload register 4095 olarak ayarlanırsa ve yaklaşık 3.2 saniyede bir IWDG baştan başlatılmazsa işlemcinin kendini resetleyeciğini söyleyebiliriz.

CubeMX ayarları

Giriş çıkış olarak sadece led ve buton pinleri ayarlanmıştır. Led programın sonsuz döngüye girdiğini ve programın tekrardan başlayıp başlamadığını gözlemlemek için eklenmiştir. Buton ise yazılımı bir sonsuz döngüye sokmak için kullanılmıştır.

CubeMX ayarları

CubeMX ile IWDG clock frekansının reference manual de yazdığı gibi 40 KHz dahili olarak ayarlı olduğu görülebilir.

CubeMX ayarları

Reload register ve prescaler değerine göre watchdog timeout süresi projeye göre ayarlanmalıdır.Eğer watchdog timeout süresi 3 saniye iken programın watchdog timerı refresh etmesi 3 saniyeden fazla sürüyorsa program sürekli kendini resetleyecetir. Burada dikkat edilirse IWDG için maksimum 26 saniye olarak ayarlanabilmektedir(Prescaler = 256 ve Reload register=4095 iken).

CubeMX in yaptığı ayarları bir inceleyelim.

Hal_IWDG_Init() fonksiyonun tanımlandığı yere gidilirse bu fonksiyonun içinde __HAL_IWDG_START(hiwdg) makrosunun çağırıldığı görülmektedir. Yani main.c nin içerisinde MX_IWDG_Init() fonksiyonu çağırıldığında watchdog timer saymaya başlar. O andan itibaren ayarlanan timeout süresi aşılmadan HAL_IWDG_Refresh(&hiwdg) fonksiyonu çağrılmalıdır. Bu fonksiyon çağrıldıktan sonra watchdog timer tekrar baştan saymaya başlar. Bu fonsiyon yazının başındaki kodda  main fonksiyon içerisindeki count=30 işlemi ile benzerdir. Yazının başındaki kod örneği watchdog timerın modellenmiş halidir. Yani kendimiz yazılımsal olarak da bir watchdog timer oluşturabiliriz ama buna gerek yok çünkü adamlar bunu bir çevrebirimi olarak bize sunmuşlar.

Bu yazıda Watchdog Timer’ın çalışma mantığını anlatmaya çalıştım. Aşağıda IWDG kodların tamamını bulabilirsiniz.

STM32 Kodlarının Tamamı

 

Mehmet Topuz

4 Comments

  1. Abi ellerine sağlık watchdog timer’ın nasıl çalıştığını çok iyi anlatmışsın. Sabırsızlıkla diğer yazılarını bekliyorum.

    • Değerli yorumun için teşekkürler. Vakit buldukça yeni yazılar paylaşacağım inşallah.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir