Herkese Merhabalar. Bilindiği üzere ARM bir işlemci mimarisidir. “Advanced Risc Machines” firması tarafından geliştirilir ve mikroçip üreten firmalara satılır. ARM mimarisi yakın zamanda çok tanıdık hale geldi. Bu, genel itibariyle düşük güç tüketimi,  yüksek performanslı oluşu ve x86-x64 işlemcilere göre daha hesaplı olmasından kaynaklanıyor. Özellikle taşınabilir cihazlarda güç tüketimi çok önemli olduğu için ARM mimarisi akıllı cep telefonlarının %95’inde ve dijital fotoğraf makinalarının %80 ninde kullanılıyor.

525a3398a787e7b3af98b8310fcc26a0

STM32F429I, ARM mimarisine sahip işlemci içeren ve ST firması tarafından üretilen bir denetleyicidir. Mikroelektronika firması ise ARM programlama öğrenmek isteyenler için bir güzellik yapmış ve içerisinde bu denetleyicinin, kendi programlayıcısının,  bir çok deneme amaçlı modülün de bulunduğu bir kart hazırlamış. İsmine de discovery demiş. Bunu kendi geliştirmiş olduğu microC derleyicisini yaygınlaştırmak için yapmış olsa da bize bu fırsatı tanıdığı için teşekkür ediyoruz.

Şimdi geçelim kartımızın kullanımına. Kartımız üzerinde daha öncede dediğim gibi kendi programlayıcısı bulunuyor. Mini USB konnektörü ile bilgisayara bağladığınızda yazdığınız programı bir derleyicinin debuger özelliğini kullanarak direk işlemciye gömebiliyorsunuz. Bu en güzel özelliklerinden birisi.  Bu meredi programlamak için genelikle c dili kullanılıyor.  İsterseniz Assembly de kullanabilirsiniz ama bunun için hem mimari hakkında hem de programlama konusunda ileri düzeyde bilgi sahibi olmanız gerekiyor.

Kullanılan en yaygın derleyiciler arasında MicroC, Coocox ve Keil bulunuyor.  MicroC derleyicisi oldukça fazla kütüphaneye sahip olsa da bazı konularda limit getirmiş derleyicisine ve ful olarak kullanmak için microC derleyicisini satın almanız gerekebiliyor. Bu yüzden bana Keil kullanmak daha mantıklı geldi. Ayrıca Keil’in Ansi C ile %100 uyumluluğu söz konusudur. Bu da Keil’i meşhur yapan etkenlerden bir diğeri.

Bu sayfada Keil derleyicisinin ayarlarının nasıl yapılacağı ve kullanılacağı hakkında güzel bir yazı var.  Okumanızı tavsiye ederim.

Ben hemen örnek bir program yazıp üzerinden konuşmak istiyorum.  Yazdığım program şu şekilde;

 

#include "stm32f4xx.h"

int main()
{

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN; // D Port'u için Clock Sinyali Aktif
    
		 
GPIOA->MODER |= (0 << 1); // A Portu 0.pini Giriş Olarak Ayarlanıyor
GPIOG->MODER |= (1 << 26); // G Portu 13.pini Çıkış Olarak Ayarlanıyor
GPIOG->MODER |= (1 << 28); // G Portu 14.pini Çıkış olarak ayarlanıyor
		
GPIOA->OSPEEDR |= (1 << 0); // A Portu 0.pin için Medium Speed Ayarı
GPIOG->OSPEEDR |= (1 << 26); // G Portu 13.pin için Medium Speed Ayarı
GPIOG->OSPEEDR |= (1 << 28); // G Portu 14.pin için Medium Speed Ayarı
		
GPIOA->PUPDR |= (1 << 1); //A Portu 0.pin Pull-Up Olarak Ayarlanıyor
GPIOG->PUPDR |= (1 << 26); // G Portu 13.pin Pull Up olarak ayarlanıyor
GPIOG->PUPDR |= (1 << 28); // G Portu 13. pin Pull Up Olarak ayarlanıyor



while(1)
		 {
			 if(GPIOA->IDR &=(1 << 0)) // Pin A0 okunuyor
			 {
			 GPIOG->BSRRL |= (1 << 14); // Eğer basılıysa G14 deki ledi yak
			 GPIOG->BSRRH &= (0 << 14);
			 }
			 else
			 {
			 
			 GPIOG->BSRRL &= (0 << 14); // Değilse ledi söndür
			 GPIOG->BSRRH |= (1 << 14);

//              GPIOG->ODR &= (1 << 14);  // Ve ya bu şekilde de yapılabilir
			 
			 }
			 
			 GPIOG->BSRRL |= (1 << 13); // G13 deki ledi yak
			 GPIOG->BSRRH &= (0 << 13);

			 
                for(i=0;i<999999;i++);  // Biraz bekle
		for(i=0;i<999999;i++);
		for(i=0;i<999999;i++);
		for(i=0;i<999999;i++);
			 
			 GPIOG->BSRRH |= (1 << 13); // Ledi Söndür
			 GPIOG->BSRRL &= (0 << 13);
			 
//		GPIOG->ODR &= (0 << 13);  // Ve ya bu şekilde de yapılabilir
//		
//			 
		for(i=0;i<999999;i++);
		for(i=0;i<999999;i++);
		for(i=0;i<999999;i++);
		for(i=0;i<999999;i++);
		 }
}

 

Şimdi yukarıdaki program benim yazdığım ve temel GPIO pinlerini kontrol eden bir program.  C dilini bilseniz bile bu tür kodlara biraz yabancı olabilirsiniz.  Fakat bu kodların hepsi C dilinde yazıldı.  Assembly dilini biliyorsanız oradan biraz daha aşina olabilirsiniz. Çünkü bu programı direk olarak işlemci içerisindeki kaydedicileri (register) kullanarak yazdım.  İşlemci içerisinde her işlemi yapmak için kullanılan bir kaydedici vardır.

Kodları anlamak için Stm32f4 serisindeki mikro denetleyicilerin kaydedicilerine göz atmamız gerekiyor.  Ben burada  STM firmasının stm32f4 serisi için yayınlamış olduğu User Guide dosyasından  sadece kullandığımız kaydedicilerin fotoğraflarının paylaşacağım.

GPIO Port Mode Register 

 

1

32 bitlik bu kaydedici ile kullanacağımız pinin giriş mi çıkış mı olduğunu belirtiyoruz.   Şemada gösterildiği gibi her pin için 2 bit ayrılmış. Şemanın altında ise bu iki biti ne ile doldurursak nasıl sonuç alınacağı belirtilmiş. Görüldüğü üzere biz bu kaydedicinin  26 ve 27 bitlerini 01 olarak doldurursak  13 pin çıkış olarak ayarlanacaktır.  Bunun için; GPIOG->MODER |=(1 << 26) kodunu yazıyoruz.  Burada GPIOG olarak yazdığımız şey bir pointer dır.  G portunun port mode kaydedicisinin adresini tutar. ” ->” işareti bir pointer’ın struct yapı içerisinde kullanılması gerektiği zaman gerekiyor. MODER şeklinde yazdığımız şey ise bir struct içerisindeki değişkeni oluşturuyor.   (1 << 26) ile 1 sayısını ikilik tabanda 16 kere öteliyoruz. Yani 1 sayısı şu şekilde oluyor;

0000001000000000000000000000000  binary tabandaki bu değişken böylelikle G portunun Port Moder kaydedicisine kaydedilmiş oluyor.

GPIO Port Output Speed Register

Bu kaydedici ise kullanılan ünitenin hızını ayarlamak için kullanılan yine 32 bitlik bir kaydedici.  Örnek olarak kodumuz ; GPIO->OSPEEDR |=(1<<26);

2

GPIO Port Input Data Register

16 bitlik bu kaydedici ise sadece okunabilirdir.  Bu kaydedicileri kullanarak giriş ünitelerini okuyoruz.  GPIOA-> &=(1<<0)  kodu ile A portunun 1. pinin durumunu okuyoruz.

 

 

3

 

GPIO Port Bit Set/Reset Register

Output’ların durumunu  GPIOx ->ODR ve ya  GPIOx ->BSRR  kaydedicileri ile belirleyebiliriz.   ODR kaydedicisi 16 bitlik bir kaydedici iken BSRR kaydedicisi 32 bitlik bir kaydedicidir.  BSRR kaydedicisi iki kısımdan oluşuyor. BSRRL yani ilk 16 bitlik kısmı ki bu kısımdaki herhangi bir bit “1” yapıldığında o bite ait pin “high” olurken BSRRH ismindeki ikinci 16 bitlik kısmındaki karşılık gelen bit “1” yapıldığında o pin “low” durumuna geçer.

GPIOG->ODR &= (1 << 14); //  G portunun 14 pini bu şekilde “high” yapılır. Ve ya; BSRR kaydedicisi kullanılarak

GPIOG->BSRRL |= (1 << 14); // Bu şekilde de “High” yapılabilir.

GPIOG->BSRRH &= (0 << 14);

 


5

 

Gördüğünüz gibi gömülü sistemlerin yazılımındaki en önemli şey kullandığınız işlemci mimarisini iyi bilmektir.   Eğer çok da iyi bilmek istemiyorsanız hazır fonksiyonları kullanmanız gerekiyor. Yani yukarıdaki programı hazı bir kütüphanedeki fonksiyonları kullanarak yazmak da mümkün.

 

 

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz