STM32 ile ARM Programlamaya Giriş – Yürüyen Işık Uygulaması

Önceki yazımızda STM32 ile ilk programımızı yazmıştık. Şimdi ise bu programı biraz daha geliştireceğiz. Artık nasıl proje açacağınızı ve kod yükleyeceğinizi tekrar tekrar anlatmamıza gerek yok. O yüzden işin zor kısmını atlattık sayılır. Şimdi yeni fonksiyonların yanı sıra geliştirme stüdyosunun yeni özelliklerini keşfedeceğiz.

Öncelikle yeni bir proje açıyoruz ve bütün bu açıklama satırlarını silerek kalabalıktan kurtuluyoruz. Aynı zamanda SystemClock_Config ve Error_Handler fonksiyonları ile de işimiz olmadığından bunları da göz önünden kaldırmamızda fayda var. Bunun için “src” klasöründe öncelikle system_clock.h adında bir başlık dosyası oluşturuyoruz. Bunun için src klasörüne sağ tıklayıp New -> File sekmesini seçiyoruz.

Burada karşımıza çıkan ekranda yeni dosyanın adını “system_clock.h” olarak belirliyoruz.

Karşımıza boş bir dosya çıkıyor. Aslında C diline aşina olanlar bir kütüphane oluşturduğumuzu görmüş olmalılar. Biz .h dosyasında tanımlamaları yapacağız. main.c dosyasında iki adet fonksiyon parametresini görmüştük. Aynı zamanda bu dosya main.h başlık dosyasını kullanmaktaydı. O yüzden bizim de öncelikle main.h başlık dosyasını kullanarak o başlık dosyasındaki stm32f3xx_hal.h dosyasına erişmemiz lazım. O halde system_clock.h dosyasını şu şekilde düzenliyoruz.

Şimdi system_clock.h dosyasından çıkalım ve çıkışta kaydedelim. Şimdi asıl fonksiyonların yer aldığı system_clock.c dosyası oluşturmamız gerekli. Yine aynı adımları uygulayarak boş bir dosya oluşturuyoruz ve aşağıdaki kodları dosyaya yazıp kaydediyoruz.

Fark ettiyseniz bu fonksiyonlar main.c dosyasının içinde mevcuttu ve kalabalık yapıyordu. Böylelikle kalabalıktan kurtulmuş olduk. Artık bunları main.c dosyasından silebiliriz ve daha sade kod yazabiliriz. Bunu yapmamızın tek sebebi kalabalıktan kurtulmak içindi. Bu fonksiyonlar sistemin çalışması için kritik olduğu için silmemiz doğru olmaz. Saat özelliklerini daha sonra açıklayacağımız için bunlar bir köşede kalsın.

Şimdi ana programımıza dönelim ve önceki öğrendiğimiz bilgileri pekiştirmek ve yeni bir şeyler öğrenmek adına yürüyen ışık uygulamamızı yapalım. Bu program önceki programa göre oldukça farklı olacaktır. Öncelikle programı gözden geçirmeniz için kodun tamamını paylaşalım.

Kodu her zaman yaptığımız gibi yukarıdan aşağıya doğru satır satır inceleyelim ve farklı yönlerine değinelim. #include “main.h” gibi kodları tekrar açıklamaya gerek olmadığını düşünmekteyim. Önceki makalemizi okuyarak bu konuda bilgi sahibi olabilirsiniz.

Görüldüğü gibi burada hazır koddan koparak yapı değişkenimize kendimiz bir ad veriyoruz. Bu yapı değişkenine led lambalara bağlı ayakların tamamı eklendiği için led adını vermemiz gayet isabetli olur.

Bir adet global sayaç değişkeni tanımladık. Işıkları yürüten yapının temeli bu sayaç olup sürekli artarak hangi ayağın yakılacağını ve hangi ayağın söndürüleceğini belirler. Bunun kullanıldığı mekanizmayı daha sonra göreceğiz.

Burada tanımlama önceki kodla aynı olsa da led adının kullanıldığı yerlere dikkat ediniz. Siz de kendi yapınızı tanımladığınızda bu şekilde kullanmanız gerekir. Şu an sadece çıkış kullansak da parametreleri sizinle paylaşmıştık.

Delay fonksiyonunu ana program döngüsünün  başına eklemekteyiz. Bu bekleme süresini değişkene bağlayıp daha ayarlanabilir bir program yapmamız da mümkündü fakat STM32 öğretmeye değil C öğretmeye yönelik bir ders olsa bunu düşünebilirdik. Bu durumda işi en kısa yoldan çözmek daha isabetlidir.

Burada ana program döngüsünde her döngü başında led_deger değişkenini bir artırıyoruz ve led sayısından fazlasını elde ettiğimizde kontrol yapısını sıfırlıyoruz. C dilini bildiğinizi varsayarak bu basit yapıyı uzun uzun anlatmaya gerek görmüyorum. C bilmeden STM32 öğrenmeye kalkmak yapılacak en büyük hatalardan biridir.

Burada swich karar yapısının bir blokunu inceleyelim. Burada yeni bir fonksiyon görmekteyiz. Aslında bu fonksiyon Arduino’daki DigitalWrite fonksiyonundan çok da farklı bir iş yapmıyor.  Yaptığı iş aynı olsa da karmaşıklığı ve kalitesi kıyaslanamaz. Şimdi bu fonksiyonun iç yapısını ve parametrelerini öğrenelim. Ben de bu fonksiyonu başka bir yerden değil kütüphane referansından öğrendim. Bu fonksiyondan haberdar olmanız için bir bilene de ihtiyacınız yoktur. Yalnız bir kitap içinde aradığınız bilgiyi bulmak için baştan sona okumanız gerekebildiği gibi burada da dosyaları baştan sonra incelemek veya referans kılavuzunda sayfalarca gezinmek gerekebilir. Neyse ki kütüphane dosyaları görevlerine göre bölümlenmiş olduğundan bunu adında gpio geçen kütüphane dosyasında görmemiz mümkündür.

Yine CTRL + Sol Tık yaparak HAL_GPIO_WritePin fonksiyonuna giriyoruz. Fonksiyonun yapısı şu şekilde bizi karşılamakta.

Bu fonksiyonu stm32f3xx_hal_gpio.c başlık dosyasında görmemiz mümkündür. Gördüğünüz gibi kütüphanenin başında @brief, @note, @param şeklinde açıklama içinde bazı tabirler yer almaktadır. Bunlar fonksiyonun görevi, notlar ve aldığı parametreleri belirtmek için kullanılır. Bu açıklamalar geliştirme stüdyosunda bize yardımcı olan açılır diyalog kutularında gösterilmektedir. Şekilde bunun bir örneğini görebilirsiniz.

Fonksiyon üzerinde işaretçiyi beklettiğimizde bu kutu otomatik olarak açılmaktadır. Aslında açıklama kısmında da fonksiyon hakkında tüm bilgiyi edinmekteyiz. Bu fonksiyonun @brief kısmında seçili port bitini bir (1) veya sıfır (0) yaptığını öğreniyoruz. Parametreler kısmında ise GPIOx’in A ve F arasındaki harflerden bir değeri aldığını görmekteyiz. Yani kullanacağımız port adını buraya girmek zorundayız. Hangi ayakta hangi portun hangi ayağının olduğunu bilmek için de teknik veri kitapçığına bakmamız gerekli. İkinci parametre olan GPIO_Pin dediğimiz ise GPIO_PIN_x değerini almakta ve bu x değeri de 0 ve 15 arasında bir sayı olmaktadır. GPIO_PIN_x değerinin tanımlamasını önceki yazıda anlattığımız için burada tekrar ikilik değerlerini açıklamamıza gerek yoktur. PinState değerini öğrenmek için tekrar Ctrl + Sol Tık yapıyoruz.

Görüldüğü gibi bir enum tanımlaması görmekteyiz. Burada PIN_RESET sıfır (0), PIN_SET ise bir (1) anlamı taşımakta. Arduino kütüphanelerinde #define ile yapılsa da burada biraz daha üst seviye yazılım kullanılarak böyle sabitler için enum kullanılmış. Yani biz GPIO_PIN_RESET yazmak yerine sıfır (0) yazarak da aynı programı yazmamız mümkündür. Önceden dediğimiz gibi GPIO_PIN_x yerine onaltılık sayı olarak ayak numarasını yazarsak da aynı kodu yürütebiliriz. Burada bu sabit değerlerin ve tanımlamaların olması konuşma diline daha yakın bir program yazabilmemiz içindir. Ya makinenin dilini ya da programlama dilini iyi bilip anlamak lazımdır. Hangisini daha iyi biliyorsak o bize daha  kolay gelecektir.

HAL_GPIO_WritePin fonksiyonunun ana yapısının ise şu koddan ibaret olduğunu görmekteyiz. Yani bizim işimizi yapan kod bu koddur.

Burada ok operatörünün (->) ne işe yaradığını merak edebilirsiniz. İngilizce karşılığı “arrow operator” olsa da plaza dili kullanmaya hiç gerek yoktur. Bu ok operatörü bir yapı üyesine işaretçi vasıtasıyla erişmek için kullanılır. Yazmaçlara erişim sağlamak için daima bu operatör kullanılır. Yazmaçlar üzerinde işlem yaptığımızda bunu daha rahat göreceksiniz.

Görüldüğü gibi PinState değişkenini denetleyen bir kontrol yapısı iki duruma göre ayağı bir (1) veya sıfır (0) yapmaktadır. Doğrudan yazmaçları kullanarak program yazmamız daha performanslı olsa da yazacağımız uygulamaların seviyesine baktığımızda bu kütüphane fonksiyonlarının işimizi oldukça kolaylaştırdığını görmekteyiz.

Programımız aşağıdaki videodaki gibi çalışmaktadı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. irem KILIÇ dedi ki:

    Merhaba , ben İrem sakarya üniversitesi elektrik elekronik mühendisliği 1.sınıf öğrencisiyim. .stm32f4 öğrenmeye çalışıyorum ve çok yeni başladım. farklı uygulamalar yapmaya çalışıyorum. gecikme kullanarak yürüyen ışık devresini yaptım fakat çok fazla kod satırı oldu. bunun pratik bir yöntemi varmış for döngüsüyle yapılanı.2 buton ile 8 adet yürüyen Led için yürüyen ışık uygulamasını yapacağım . buton 1 e bastığımda soldan saga doğru buton 2 ye bastığımda sağdan sola doğru yürüyecek,
    Yardımcı olursanız sevinirim. Şimdiden teşekkür ederim.

    • Bit kaydırma operatörleri ile yazmaç tabanlı tek komutta yürüyen ışık yapabilirsiniz. AVR derslerinde benzer bir uygulama yapmıştım. Bunu STM32’ye uyarlayabilisiniz.

Bir cevap yazın

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