STM32 - ARM Cortex M

STM32F407VG Driver Geliştirme – 5 (EXTI.c)

Merhabalar, ilk olarak Exti Hatının ayarlarını nasıl yapılandıracağımızı anlatalım .



Yukarda görülen EXTICR1-4 Registerlarına müdehale edeceğiz.
Mesela EXTI6(PIN6/LINE6)‘ya işlem yapacağız fakat doğru registerı nasıl bulacağız?
if/else yapısı ile mi? Tabikide hayır, daha profesyonel bir yapıda kurmamız lazım, hadi başlayalım.

Algoritmayı öncelikle basit ‘C’ kodu üzerinde anlamaya çalışalım.
Dipnot : Dökümanda EXTICR1 den başlıyor fakat yazılımda EXTICR0 dan başlıyor , bunun için hesaplamaya dikkat edin.

Pin numarası 0-15 arası bu yüzden for döngüsüde bu sınırlarda olmalı. 4 adet Register var ve her registerda 4 adet pin var her pinde 4 adet bit var, bu rakamlar üzerinden birtakım formüler kuracağız.

Hangi Register : Eğer 4 adet register var ise pin numarası / 4 yaparız .
Hangi Bit          :  Her registerda 4 adet pin var her pinde 4 adet bit var  ise (pin numarası % 4) * 4  yaparız.

Detaylı Açıklama ,  (pin numarası % 4) bize kalanı verir .
Mesela pin : 6
Bölüm sonuç :  1
kalan sonuç : 2
Burada 1.Register (dokumana göre 2) , kalan(2) * 4  : 8. bit  ‘dir peki neden 4 ile çarparız.
Her bir pin 4 bitdir. Kalan 0-3 arası bir sayı alabilir ve kalanı 4 ile çarparsak bizi doğru bite götürecektir.

Bunu aşağıda basit bir bölme işlemi ile gösterelim.

EXTICR1(dökümana göre 2) , 8.Bit  –> EXTI6/PIN6
Aşağıda tüm pinlere göre hesap yapan ‘c’ kodunu görüyoruz.

Yukardaki tüm işlemler algoritmanın mantığını daha iyi anlayabilmek içindi şimdi gelin bu yapıyı bölme işlemi yerine bit kaydırma işlemi ile yapalım.

 

Yukardaki kod’da ; pinNuber >> 2 yaptık , bu 4 ile böl demek.  Kalan alma işlemi için (pinNumber & 0x3) * 4 yaptık , burada 0x3  ; 2^2 nin üst taradındaki sayı kadar 1 ekleyerek bulunuyor ve çıkan sayı pinNumber ile and(&) işlemine sokarak kalanını buluyoruz. Ardından Normal de olduğu gibi kalanı 4 ile çarparak bit numarasını elde ediyoruz. Aşağıdaki resimlerde 2 farklı örnek ile detaylıca açıkladık.


Tüm pinlerin  register ve bit sayılarının çıktısı aşağıdaki tabloda gösterildi.


Şu ana kadar burada sadece bir fonksiyon için algoritma yapsını detaylıca inceledik şimdi gelin bu fonksiyonu açıklayarak yazalım.

  • uint32_t tempValue;  –>  Geçici değişken oluşturduk, çünkü işlemleri direkt register üzerine yazmak hatalı bir seçim.
  • tempValue = SYSCFG->EXTI_CR[LineSours >> 2U];   –> EXTI_CR[x] , x yerine belirlediğimiz pin’e ait register gelmeli.
    Mesela 6. pin ;   6 >> 2U  yani 6 /4 işlemi ile  1.Register olduğunu (Dökumana göre 2.) söyleyebiliriz. Sonuc ; EXTI_CR[1] 
  • tempValue &= ~(0xFU << (LineSours & 0X3U) * 4);  –> ~(1111 << Kalan * 4) işlemi olarak düşünün ve bu sayede uygun bitleri sıfırladık.
    Mesela 6. pin ; 0110(6) & 0011(3) : 0010(2) gerçekten böylemi  bakalım.
    6 % 4 : 2 evet gerçekten de kalan (2). Şimdi tüm işlemi uygulayalım 2 * 4 : 8 , yani 8. bit’e git ve ardından orayı temizle .
  • tempValue = (PortSours << (LineSours & 0X3U) * 4); –> Burada dikkat ederseniz 0xF yerine kullanıcıdan aldığımız Port değeri  var , yani bir önceki madde gibi dişüneceğiz.
    Mesela 6. pin (LineSours & 0X3U) * 4 bu kod sayesinde belirlediğimiz pine ait bitlere gidiyoruz,
    ve ardından PortSours verisini o bitlerin üzerine yazıyoruz.
  • SYSCFG->EXTI_CR[LineSours >> 2U] = tempValue;  –> Tüm bunlar geçici bir değişkende tutuldu ve şimdi bu işlem görmüş değişken uygun register üzerine yazıldı.

Şimdi int main() içerisinde bu fonksiyonumuzu çağıralım.
SYSCFG Registerlarının bulunduğu APB2 Faz hatını aktif etmeyi unutmayalım aksi taktirde yaptığımız hiçbirşey çalışmaz.

15. Satıra ‘break point’ koyup debug işlemini başlattım. Menüden ‘SFRs’ kısmına gelip SYSCFG Registerın içerisine girdim. EXTICR1,2,3,4  görüldüğü gibi EXTI1,2,3….12 ‘ye kadar part part gidiyor.
GPIOD’nin 6.pinine işlem yapacağım için  EXTI6(LINE6)’ ya dikkat edin.

GPIOD ‘nin verisi 0011(3) olduğu için EXTI6 üzerine ‘0x3’ yazdı ve bu şekilde Kesme işlemi GPIOD nin 6. pininden alınabilir hale geldi.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu