STM32 Programlama – Kesmelere Giriş

Kesmeler mikrodenetleyicinin en temel özellikelrinden biri olarak karşımıza çıkmaktadır. Sadece mikrodenetleyicilerde değil bütün bilgisayar sistemlerinde kesmelerin kullandığını görmekteyiz. Kesmeleri kullanmayı öğrenmek bir nebze kolay olsa da aşırı derecede dikkat etmemiz gerekir. Çünkü kesmeler programın akışını belirleyen ve dikkat edilmediğinde program akışını bozacak yapılardır. Burada yapılan dikkatsizliği derleyici programın fark etmemesinin yanında sadece belli bir birimin çalışmaması ile sonuçlanmayıp bütün program akışını etkileyecektir.

STM32F3 referans kılavuzunu incelemekle kesmelere giriş yapalım. Burada da diğer mikrodenetleyicilerde olduğu gibi kesmelerin uzun uzun anlatılmadığını görmekteyiz. Yine de ARM çekirdekli mikrodenetleyicilerde kesmeler AVR’de olduğu gibi basit yapıda değildir. Bunu ilerleyen kısımlarda daha rahat anlayacaksınız.

ARM çekirdeğinde NVIC yani kümelenmiş kesme denetleyicisi bulunmaktadır. Bu kümelenme ile kesme içinde kesme yürütülebilir ve kesmeler öncelik sırasına göre tekrar sınıflandırılabilir. NVIC biriminin ana özellikleri şu şekildedir.

  • 74 maskelenebilir kesme kanalı
  • 16 programlanabilir öncelik seviyesi
  • Düşük gecikme
  • Güç denetimi
  • Sistem denetim yazmaçlarına uygulama

SysTick kalibrasyon değeri yazmacı 9000’e sabitlenmiştir. Bu da SysTick saati 9MHz olduğunda 1 ms referans zamanı vermektedir.

Kesme vektörleri listesinde iç kesmelerin listesi verilmiştir. Bu liste AVR’de hiç görmediğimiz kadar fazla olup size bir kısmını vermekle yetineceğiz. Geri kalan tablo için referans kılavuzunun 285. sayfasından itibaren bakınız.

 

Konum Öncelik Öncelik Tipi Kısaltması Açıklama Adres
-3 Sabit Reset Reset 0x00000004
6 Ayarlanabilir SysTick Sistem Tick Zamanlayıcısı 0x0000003C
41 48 Ayarlanabilir RTC_Alarm ATC Alarm Kesmesi 0x000000E0

Burada tablodan aldığım üç örnek kesme vektörüne bakalım. Öncelikle bütün kesmeler öncelik sırasına göre yukarıdan aşağıya sıralanmış durumdadır. Öncelik sırası en yukarıda olan kesme grubu önemli kesmeleri içermektedir. Öncelik tipi bazılarında sabit (fixed) olup bunlar değiştirilemez. Örneğin öncelik sırası en yüksekte olup öncelik tipi değiştirilemeyen Reset kesmesini görmekteyiz. Bu resetin her durumda yürütüleceğini ve buna mani olunamayacağını ifade eder. Önceliğin biraz daha düşük olduğu SysTick zamanlayıcısı yine sistemle ilgili bir kesme olsa da öncelik tipi ayarlanabilir. RTC saatinin alarm kesmesi olan RTC_Alarm ise öncelik sırası oldukça düşük bir kesmedir. Bu kesmenin öncelik sırasını ayarlama imkanımız vardır.

STM32 mikrodenetleyicinin iç kesmeleri bundan ibarettir. Bu iç kesmeleri etkinleştirmek veya devre dışı bırakmak için ilgili birimlerin yazmaç bitlerine bakmak gereklidir. Şimdi ise dış kesmelere bakalım.

Genişletilmiş Kesme ve Olay Denetimcisi (EXTI)

Dış kesmeler mikrodenetleyicinin iç birimlerinin yürüttüğü kesmelere göre daha fazla esnekliğe sahiptir. Örneğin bir ayağa bir düğme veya bir devrenin çıkışını bağladığımızda kendimizin belirlediği bir sebepten dolayı mikrodenetleyiciyi kesmeye götürme imkanımız olur. Bu yönüyle dış kesmeler bizim uygulamada daha çok kullanacağımız özellik olmaktadır. Çünkü iç kesmelerle alakalı işler genellikle arka planda yürütülmektedir.

Genişletilmiş kesme ve olay denetimci birimi ise hem dış hem iç asenkron olayları ve kesmeleri denetlemektedir. Her dış kesmenin kenarı bağımsız olarak seçilebilmektedir. İç kesmelerde her zaman yükselen kenarda kesme yürütülmektedir. Kesmeler beklemeye alınabilir. Her kesme hattı farklı bir kesme yürütmesi için programlanabilmektedir. EXTI biriminin ana özellikleri şu şekildedir.

  • 36 olay/kesme talebine kadar destek
  • Her hattın bağımsız ayarlanabilmesi
  • Her hattın bağımsız maskelemesi
  • Sistem STOP modunda değilse iç hatlar otomatik olarak devre dışı bırakılır.
  • Dış kesme hattı için bağımsız tetikleyici
  • Dış kesme hattı için özel durum biti

Dış kesme blok diyagramı şu şekildedir.

STM32F3 mikrodenetleyicilerde uyandırma işlemi için iç ya da dış olaylar kullanılabilir. Dış kesme hatları için bir kesme oluşturmak istiyorsak kesme hattı ayarlanmış ve etkinleştirilmiş olmak zorundadır. Bu iki tetikleyici yazmacı programlamakla gerçekleşir. Öncelikle hangi kenarda kesmenin tetikleneceğini belirlemek sonra da maske yazmacına ayağa karşılık gelen bite bir (1) yazmamız gereklidir.  İç kesmelerde yükselen kenarda kesmeye gidilir ve standart olarak maske yazmacında etkin haldedir. Dış kesme yapısının GPIO haritalandırılması şu şekildedir.

Buraya kadar kesmeler bitiyor ve yazmaçlardan bahsediliyor. Biz yazmaçlarla uğraşmayıp HAL kütüphanesini kullanacağımız için bir sonraki durağımız HAL kütüphane kılavuzu olacaktır.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

2 Responses

  1. Mehmet Ali Çifçi dedi ki:

    Abi bence sen bi kitap yapmalısın arm ile ilgili

  2. Bülent dedi ki:

    Pic den STM32 ye yeni geçtim. Yazılarınızı çok yararlı buluyorum. Bu yüzden diğer yazılarınızı merakla bekliyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.