Merhaba,

Bu yazımızda sizlere vakit kaybettirmeden programları ve fonksiyonlarını tanıtıp LED Blink uygulamamızı gerçekleyeceğiz. İlk adımımız CubeMX programını açmak olacaktır. Program ara yüzünde karşımıza çıkanları incelemekle başlayalım.

Şekil 1 : Cube MX Genel Görünümü

Daha önce üzerinde çalışmış olduğunuz proje dosyalarına ait konfigürasyonlar sol bölmede “Recent Opened Projects” menüsünde tekrar kullanılabilmek üzere listelenir. Yaratılacak olan proje dosyalarını açmanıza gerek kalmadan yaptığınız konfigürasyonlara bu menüden erişim sağlayabilirsiniz. Yeni bir proje açmak istediğinizde, bunun birden fazla yolu olduğunu söylemekte yarar var. Tahmin edeceğiniz üzere “File” menüsünü kullanarak yeni proje dosyası oluşturabileceğiniz gibi, “ACCESS TO MCU SELECTOR” veya “ACCESS TO BOARD SELECTOR” ‘a tıklayarak yeni açılan pencereden kullandığınız mikroişlemciyi seçip çalışmalarınıza başlayabilirsiniz. Bu noktada “ACCESS TO MCU SELECTOR” diyerek kullanmayı planladığımız mikroişlemciyi seçerek devam edelim.

Şekil 2: MCU Selector

Sol bölmede ilk gözünüze çarpması gereken bir arama barının olacağıdır. Bu barı kullanarak elinizdeki geliştirme kitinin adını yazarak sağ bölmede görülen listeden kitinizi seçebilirsiniz. Sol bölmenin bir diğer özelliği ise arama barının hemen altında bulunan listeden ihtiyacınız olacak birimleri seçerek, eğer henüz kullanmanız gereken ürünü bilmiyorsanız, kullanabileceğiniz uygun mikroişlemciyi seçebilecek olmanız. Şimdi arama barını kullanarak bulduğumuz geliştirme kartımızı seçerek devam ediyoruz. Bu benim için STM32F767ZI olacaktır.

Şekil 3: Konfigürasyon Ekranı

Karşılaşacağımız yeni ekran bir tarafında mikroişlemcinin paket görünümünü, diğer tarafında ise mikroişlemcinin sahip olduğu sistemsel ve çevresel birimlere ait özelliklerin olduğu menüyü içermektedir. Diğer platformlarda olduğu gibi bu birimlere aşina olduğunuzu varsayıyorum. Uygulamalarımıza “Merhaba Dünya!” diyerek başlayacağımızı söylemiştik. Bu durumda bir GPIO’yu “çıkış” olarak belirlemek atacağımız ilk adım olacaktır. İşaretçinizle pinlerin üzerine tıkladığınızda o pinlerin hangi fonksiyonları yerine getirebildiğini görebilirsiniz. Daha önce de anlaştığımız üzere STM32F767ZI’ nın kullanıcı LED’lerinden birine bağlı olan PB14 pinini “GPIO Output” olarak belirtmemiz bu uygulamamız için yeterli olacaktır. PB14 pinini mikroişlemci görünümünün sağ altında bulunan arama barını kullanarak bulabilirsiniz. Eğer STM32F303K8 Nucleo gibi 32 pinli bir kit kullanıyorsanız, pin sayısı makul sayıda olacağından kendiniz de bulabilirsiniz. Konfigüre ettiğiniz pin yeşil renkte gösterilecektir.

Şekil 4: PB14′ e ait çıkış konfigürasyonu

Şimdilik “Clock Configuration” kısmını pas geçerek, “Project Manager” bölmesine geçiyoruz. Bu bölmede proje adınızı ve projenizi nereye kaydetmek istediğinizi belirtip, bu aşamada yapacağımız en önemli adım olan “Toolchain / IDE” kısmına geliyoruz. Eğer benim gibi KEIL kullanıyorsanız MDK-ARM’ı seçmeniz yeterlidir. Böylece şu ana kadar ihtiyacımız olan konfigürasyonları yapmış olacağız ve KEIL tarafına C kodumuzu üretmek üzere sağ yukarıdan “Generate Code” diyebileceğiz.

Şekil 5: Project Manager

Kod üretme işlemi bittiğinde karşınıza çıkacak olan pencereden “Open Project” diyerek kodlama kısmına başlayabiliriz. Program otomatik olarak sizi kullandığınız Toolchain/IDE’ ye yönlendirecektir (Bu uygulamamız bağlamında KEIL). KEIL ekranı geldiğinde karşınıza herhangi bir program gelmeyecektir. Peki bu durumda yazacağımız program dosyasını nereden bulabiliriz? Bu sorunun yanıtı da oldukça basit. Hemen sol bölmede yer alan “Project” menüsünde proje dosyanızın adını göreceksiniz. Yanında bulunan “+” ‘ya tıkladığınızda projenizin içerdiği tüm kütüphane dosyaları ile birlikte bir “main.c” dosyası bulacaksınız. Bizleri şu an için ilgilendiren dosya da bu dosya olacaktır.

Şekil 6: main.c

Şimdi yazıya ara verip küçük bir gezinti yapın ve main dosyasını yavaşça yorum kısımları ile birlikte kabaca inceleyin. Main fonksiyonun altında bulunan fonksiyonlar CubeMX ‘in bizlerin işini kolaylaştırmak adına yapmış olduğu konfigürasyonları içermektedir. Bu fonksiyonları herhangi bir şekilde çağırmanıza gerek kalmayacaktır. Çünkü CubeMX zaten main içinde bu fonksiyonları çağırmış durumdadır. Yorumları incelediğinizde bazı kısımları “USER BEGIN” ve “USER END” gibi ifadelerle başlayıp bittiğine dikkat etmemizde fayda var. Bunun sebebi bu ifadelerin arasına kullanıcı komutlarını yerleştirmemiş olursanız ve programınıza CubeMX üzerinden yeni bir konfigürasyon ekleyip kod üretirseniz bu anahtar kelimelerin dışında kalan komutların silinecek olmasıdır. Hüzünlü bir başlangıç olmaması açısından buna dikkat etmemiz gerekiyor. Ancak dilerseniz bu anahtar kelimelerin dışında kalan kısımlara da programınızı yazarsanız programınızın çalışmama gibi bir problemi olmayacaktır.

Kısa ve öz tanıtımımızın ardından ilk programımızı yazmaya başlayalım. Programımızı oluşturacak olan fonksiyonlar son yıllarda HAL (Hardware Abstraction Layer) adı verilen bir kütüphane içerisinde tanımlanmıştır. Sizleri araştırmaya teşvik etmek adına tekrar yakın dostumuza yönlendiriyor ve “STM32 HAL Reference Manual” yazarak programlama dokümanını elinizin altında tutmanızı öneriyoruz. Yapacağımız uygulamada diğer platformlarda olduğu gibi belirli bir gecikmeyle kullanacağımız pinin durumunu değiştireceğiz. Bunun için HAL kütüphanesi sizlere “HAL_GPIO_WritePin” ve “HAL_GPIO_TogglePin” gibi fonksiyonlar sunmaktadır. “HAL_GPIO_WritePin” fonksiyonunu daha sonra sizlerin denemesi üzere bu uygulamada “HAL_GPIO_TogglePin” fonksiyonuyla başlayalım. Peki biz fonksiyonları nereden biliyoruz? Bu sorunun iki yanıtı var. İlki henüz sizleri incelemeniz üzere teşvik ettiğimiz programlama dokümanı, ikincisi ise KEIL’in bize sunmuş olduğu “functions” menüsüdür. Buradan görülebileceği üzere projemizin barındırmış olduğu kütüphanelere ait tüm bilgilere, fonksiyon parametrelerine ulaşabilmek mümkün.

Şekil 7: functions

Main fonksiyonun içinde diğer platformlarda da görmeye alışkın olduğunuz bir while döngüsü olacaktır. “HAL_GPIO_TogglePin” fonksiyonu adından da anlaşılabileceği üzere bir pinin durumunu lojik 0’dan 1’e, lojik 1’den 0’a çeker. Bu fonksiyonun hemen ardından bir gecikme fonksiyonu (HAL_Delay) eklediğinizde ise ilk uygulamamızı tamamlamış olacağız.  Toggle Pin fonksiyonu iki adet parametre almaktadır. Birinci parametre olarak kullanacağınız pinin hangi portta yer aldığı ve ikinci parametre olarak o portun kaçıncı pini olduğudur. PB14′ ü kullanmak üzere kofigürasyon yapmamızın sonucu olarak program Şekil 8’de gösterildiği gibi olacaktır.

Şekil 8: Program

Son olarak önce programı derleyecek ve ardından mikroişlemcinin içine yükleyeceğiz. Programı derlemek için Şekil 8′ de “1” ile gösterilen “Build” butonunu kullanabilir ya da F7 tuşunuza basabilirsiniz. Derleme işlemi bittikten sonra ise “2” ile gösterilen “Flash Download” butonuna basabilir, alternatif olarak F8 tuşunuzu kullanabilirsiniz. Geriye kalan tek şey kartınızın “Reset” tuşuna basıp programınızın çalışmasını izlemek.

Umarım ARM programlamaya giriş yapmak adına sizler için güzel bir yazı olmuştur. Sıradaki uygulamamızda görüşmek üzere hoşça kalın!

Bir Cevap Yazın