ARM – Not3: STM32F4DISCOVERY Buton ile Binary sayıcı.

Yayınlandı: 08 Ağustos 2012 / ARM STM32F4DISCOVERY Programlama...
Etiketler:, , , , , , , , ,

Bu dersimizde STM32F4DISCOVERY kiti üzerindeki kullanıcı butonunu (mavi renkli olan, diğeri işlemciyi resetliyor) kullanarak, kit üzerindeki ledlerde binary sayma işlemi geçekleştireceğiz. Ayrıca işlemcimizi mümkün olan en yüksek hızında yani 168MHZ’de koşturacağız. Bunun için işlemcimizin datasheetine göz atmakta fayda var. İşlemcinin  dökümanında blok diyagram ile gösterilen ve ismi clock tree olan şemaya göre saat frekasnımızı ayarlayacağız.  Ama isterseniz ilk olarak Kodlarımıza bir göz atalım ve giriş-çıkış işlemlerimizin nasıl yapılacağını öğrenelim. Bu yazımızda giriş çıkış işlemlerini mikroC’nin kütüphaneleri ile değil,  datasheette gösterilen registerlar ile yapacağız.

Kitimizin devre şemasına baktığımızda butonun pull-up şeklinde bağlanmış olduğunu görüyoruz. Yani butona basıldığında PORTA’nın 0. pinini 1’e çekiyor. Buna göre yazdığımız kodlarımıza bir göz atalım:

void main() {
int i=0;
RCC_AHB1ENR|=0x00000009;//A ve D portlarına clock veriliyor.
GPIOD_MODER=0x55000000;//D portunun 12,13,14,15 pinleri çıkış
GPIOD_GPIOB_OSPEEDR=0;//giriş çıkış hızları en düşükte (2MHZ)
GPIOD_ODR=0x00000000;//D portunun bütün pinleri low.
GPIOA_MODER=0;//A portunun tüm pinleri giriş.

while(1)//sonsuz döngü
{
if(GPIOA_IDR.f0==1)i++; //Eğer butona basılırsa
while(GPIOA_IDR.f0==1);//bekle
delay_ms(100); //100ms bekle
if(i>15)i=0;//i 15'ten büyükse 0 yap
i<<=12;//i değişkenininin içini 12 kez sola kaydır GPIOD_ODR=i;//d portuna i'yi yükle i>>=12;//i'yi tekrar ilk haline getir.
}
}

Kodlarımızda anlaşılmayan bir kısım olursa aşağıdan bana iletebilirsiniz.

Şimdi gelelim “clock tree” isimli blok diyagrama:

Büyütmek için tıklayın…

Diyagramdan görüldüğü üzere işlemcinin içerisindeki M,N,P,Q,R gibi katsayılar ile işlemci ve çevre birimlerin çalışma hızları ayarlanıyor. Saat frekansı ayarlaırken formül şu şekilde çalışıyor:

PLLCLK = (8/M)*(N/P)
USBCLK = (8/M)*(N/Q)

Saat frekansı ayarlanırken bazı kısıtlamalar vardır bunlar:

1.  VCO giriş frekansı 1..2Mhz aralığında olmalıdır.

2.  VCO çıkış frekansı 64-432 Mhz aralığında olmalıdır.

3.  USB sinyali ,  48 Mhz olmalıdır. USB kullanılmayacaksa bu frekans 48 Mhz den büyük olamaz.

4.  N>1,  Q>1 ve P=2,4,6 veya 8 olmalıdır.

5.  AHB Frekansi 168 Mhz'i asamaz.

6.  APB1 Frekansi 42 Mhz'i asamaz.

7.  APB2 frekansi 84 Mhz'i asamaz.

Şimdi yukarıdaki bilgiler ışığında bir örnek yapalım:

Kitimizin üzerinde bulunan harici kristalin değeri 8MHz’dir.  VCO kısmına girmeden önce bu frekansın 1-2MHz arasında olması gerkiyor. O yüzden M değerini 4 veya 8 olarak belirleyebiliriz. “4” olarak belirlediğimizi varsayalım. O halde VCO’ya giren frekans 8/4’ten 2MHZ olacaktır.

Q’dan çıkan sinyal’in 48MHz olması lazım. O halde N ile çarpımdan çıkan sonucun 48MHz’in ve 168 MHz’in ortak katı olması gerekiyor. 336 olarak belirledik bunu da. (Ortaokul bilgilerimizdeki ekok’dan) Yani N değerimiz 168 olacak ve VCo’ya giren frekans ile çarpılacak.

P çıkışından 168 MHz alarak bunu hiçbir şekilde bölmeden AHB’ye (SYSCLK) uygulayacağız.  Bu yüzden P değerini de 2 olarak belirliyoruz. (336/2)

Q değerini de 7 belirleyerek USB için 48MHz çıkış sağlamış oluyoruz.

AHB (SYSCLK) ise 168MHZ’de kullanılacağından 1 olarak belirlenir.

Sıra geldi APB1 ve APB2’ye bunların da sırası ile maks. değerlerinin 42 ve 84 MHz olduğunu söylemiştik. O yüzden bunların prescaler değerleri de  sırası ile 4 ve 2 olarak belirleniyor.

Bu işlemlerinin tamamının MikroC ortamında yapılması için ise yapmamız gereken şey “Project” sekmesi altındaki “Edit Project”‘i açmak olacaktır. Edit Project penceresi açıldıktan sonra şu şekilde ayarlamalar yaparak işlemcimizi 168MHz’de koşturabiliriz:

Resmi büyütmek için tıklayın..

Resmi büyütmek için tıklayın…

En alttaki ayar için yeni resim eklemeye gerek yok diye düşündüm.
En alttaki ayar :“Prefetch and Cache Enabled” olacak.

Bu proje ile ilgili dosyaları buradan indirebilirsiniz.

İyi çalışmalar…

yorum
  1. Serhat dedi ki:

    Merhabalar Hocam. Öncelikle böyle güzel bir amaca hizmet ettiğiniz için çok teşekkür ederim. Bende keil’da ARM üzerine çalışıyorum. MikroC dilinide öğrenmek istiyorum. Keil’ in yanında ek bir seçenek olması amacıyla , gördüğüm kadarıyla bazı işlemleri biraz daha basit yapabiliyoruz MikroC ‘ de . İlk sorumu sorayım Hocam ,

    if(GPIOA_IDR.f0==1)i++; komutunda a0 pinindeki butonun durumunu kontrol ediyorsunuz eğer 1 ise değişkeni arttırıyorsunuz , burdaki f0 ‘ ın anlamı birinci pinmi olduğunu belli ediyor keil’da biraz daha farklı.
    if( GPIOA->IDR & 0x00000001 ) —> keil’da bu şekilde kontrol ediyoruz.

    • mikrodunya dedi ki:

      F0, 0. Bit demek. Bu tanımlamalar mikroc için hazır olarak geliyor. Keilde bu şekilde bitlere erişim yapabilmek için struct oluşturmanız gerekir. MikroC’nin güzel yanı kütüphaneleri sayesinde kolayca programlama yapmayaa izin vermesidir. Keilde de hazır kütüphaneler bulabilirsiniz. Güzel yorumunuz için ben teşekkür ederim.

      • Serhat dedi ki:

        Ne demek Hocam . Forumda zaten sürekli takip ediyorum. Sadece Mikro C arayüzünü hiç kullanmadım. Biraz biraz başlayayım diyorum. Güzel gelmeye başladı. Keil’da biraz fazladan iş yapıyoruz gibime geliyor. Ticari hayat keil için gerekli süreyi beklemez gibime geliyorda 🙂

      • mikrodunya dedi ki:

        Kısa sürede proje bitirmek istiyorsanız MikroC size iyi gelecektir şüphesiz. Sürekli güncellenerek eksiklerini hızlıca kapatması ve fonksiyonel mikroelektronika forumu bu derleyiciyi ön plana çıkartan özelliklerden bazıları..

  2. mithat dedi ki:

    merhabalar paylaşımlarınız oldukça yararlı oluyor. library dosyalarına nasıl ulaşabilirim ?

  3. Serhat dedi ki:

    Anladım Hocam . Cevabınız için teşekkür ederim. Sizde bilirsinizki olmayan kütüphane hazırlamak vs biraz vakit kaybettiriyor. Ama öğretici oluşuna diyecek birşeyim yok. Pic Programlamayı Hi-Tech C ‘ de yazıyorum. Hazır fonksiyonları pek kullanmıyorum. Bunun sebebi yıllardır picle içli dışlı olmak heralde. Ama ARM’da Mikro C ile biraz gitmek gerekiyor gibi en azından işlemciyi çözene kadar hazır fonksiyonlarla götürmek hızlı ve iyi bir çözüm.

    • mikrodunya dedi ki:

      Ben de aynı yolu izliyorum. Bir yandan uygulamaları hızlı bir şekilde kütüphaneler ile çözecek dereceye ulaşırken, bir yandan da registerları öğreniyorum.

  4. mithat dedi ki:

    microc de ilginç bir yön var. örneğin keil de osc ayarları komut satırlarıyla register içerikleri değiştirilerek yapılabiliyor. aynı komut satırlarını microc ‘ye uygunlaştırıp kullanınca osc ayarları değişmiyor. sadec EDIT PROJECT seçeneğinden değiştirilebiliyor. yanlış mı düşünüyorum ?

    • mikrodunya dedi ki:

      Tamamen doğru düşünüyorsunuz. Bu ayarlamalar bir kez yapılacağı için böyle bir şey düşünülmüş. Zaten pll ayarlarını komut satırı içerisinde tekrardan yapmaya kalkışırsanız kilitlenmelere sebebiyet verebilirsiniz. Bu yüzden kodlar çalışırken clock ayarlarının yeniden yapılandırılması bütün işlemciler için pek tavsiye edilen bir durum değildir.

      • mithat dedi ki:

        fazla bir uygulama yapma şansım olmadı ama Keil’e göre daha sade ve kullanışlı gibi görünüyor şu anda , bakalım ilerledikçe göreceğiz.
        kolay gelsin 🙂 gerçekten de faydalı bir iş yapıyorsunuz teşekkür ederiz.

      • mikrodunya dedi ki:

        İyi çalışmalar..

  5. YAVUZ YILDIZ dedi ki:

    Sitenin sahibi olan kisi ile iletisime gecmek istiyorum tesekkurler..

  6. ss_ dedi ki:

    yeni başlayan bir acemi olarak sormak istiyorum.. bu kod kısmına geçmeden önce yapılması gereken konfigürasyon ayarları nelerdir? (direk olarak bu kodları kopyaladığımda birçok hata veriyor..)

  7. mikrodunya dedi ki:

    Hocam yazıyı okumadınız heralde. Yazıda konfigürasyon ayarlarını verdim dikkat ederseniz.

  8. Şahin dedi ki:

    mikroc de kütüphane nasıl ekleniyor mesala ben ivme ölçer sensörünü yazdım ama her bu sensörü kullandığımda bu kadar kod yazmak istemiyorum

    • mikrodunya dedi ki:

      Project manager kısmından “add files” seçeneğini tıklayarak kütüphane dosyalarını ekleyebilirsiniz. Herhangi bir C derleyicisinde nasıl ekleniyorsa o şekilde de ekleyebilirsiniz.
      Anahtar kelime “#include”.

  9. FIRAT dedi ki:

    Hocam kolay gelsin öncelikle.Bende micro c ile stm32f401re mikrodenetleyicisini programlamak istiyorum ancak karta bağlanamıyorum program üzerinden yardımcı olabilir misiniz ?

    • mikrodunya dedi ki:

      Sanırım nucleo kartı kullanıyorsunuz.
      Tools sekmesi altındaki programmer/debugger options seçeneğine tıklayarak, SWD radyo butonunu işaretleyiniz.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s