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!!
Bu sitede yayınlanan yazılar orjinal içerik olup faydalanılan kaynaklar belirtilmiştir. Yazarın izni olmaksızın tamamen alıntı yapılamaz, kopyalanamaz. Kaynak göstermek kaydıyla (Yazının adı, yazar adı ve link) kısmen alıntı yapılabilir.
Abi bence sen bi kitap yapmalısın arm ile ilgili
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.