"Enter"a basıp içeriğe geçin

Eclipse IDE ile STM32 Mikrodenetleyicileri İçin Gömülü Yazılım Geliştirme ve Hata Ayıklama – İlk Proje

Merhaba sevgili ziyaretçiler. Bu yazım bir önceki yazımın devamı niteliğinde olacak. Önceki yazımda Eclipse IDE’sine ARM mikrodenetleyicileri için gömülü yazılım geliştirmeye olanak sağlayacak eklentileri (GNU ARM Eclipse, GNU ARM Eclipse QEMU, GNU ARM Eclipse OpenOCD, GNU ARM Embedded Toolchain) yükleyerek Eclipse’i bir gömülü yazılım geliştirme ortamına dönüştürmüştük.

Bu yazımda ise NUCLEO-F103RB board emülatörü üzerinde ufak bir led blink örneği üzerinde hata ayıklama (debug) yapmak için eklentileri yüklenmiş bir Eclipse IDE ortamını nasıl hazırlayacağımızı göreceğiz.

Dilerseniz başlayalım.

Öncelikle yeni bir proje oluşturmak için Eclipse IDE penceresi üzerinde “File->New->Project…” menü yolunu tıklıyoruz.

Eclipse IDE yeni proje oluşturma menü yolu
Eclipse IDE yeni proje oluşturma menü yolu

Karşımıza “New Project” penceresi gelecektir. Bu pencere bir adet filtre (type filter text) alanı ve bir adet de proje sihirbazları (Wizards) listesinden ibaret. Filtre alanına bulmak istediğimiz proje sihirbazının adını yazarak istediğimiz proje sihirbazı için arama yapabiliriz.

Eclipse IDE yeni proje oluşturma sihirbazı bir çok farklı türde proje için proje sihirbazı sunmakta. Biz bu çalışma için "C/C++" ögesinin "C Project" alt ögesini seçeceğiz.
Eclipse IDE’nin New Project penceresi bir çok farklı türde proje oluşturmak için farklı proje sihirbazları sunmakta. Biz bu çalışma için “C/C++” ögesinin “C Project” alt ögesini seçeceğiz.

Biz bu yazıda C/C++ projesi oluşturacağız. Bu yüzden “Wizards” listesinden “C/C++” ögesinin solundaki “>” simgesini tıklayarak bu ögenin alt ögelerinin görünmesini sağlayalım (Doğrudan “type filter text” filtre alanına “c” veya “c++” yazarak da aradığımız proje oluşturma sihirbazını getirebilirdik). Buradan “C Project” ögesini seçelim. Seçime çift tıkladığımızda ya da “Next” butonuna tıkladığımızda seçtiğimiz proje sihirbazı gelecektir.

Eclipse IDE C Projesi Oluşturma Sihirbazı. "Project Name" alanına proje ismini vermeyi unutmayın. Aksi takdirde "Next" butonu çalışmayacaktır.
Eclipse IDE C Projesi Oluşturma Sihirbazı. “Project Name” alanına proje ismini vermeyi unutmayın. Aksi takdirde “Next” butonu çalışmayacaktır.

C Project proje sihirbazı üzerinde bizi ilgilendiren üç alan mevcut. Bunlardan ilki “Project Name” alanı. Bu alana proje ismini yazıyoruz. Ben bu alana “ilkprojem” yazıyorum.

Diğer bir alanımız ise “Project Type” listesi. Bu listeden hangi STM32 mikrodenetleyicisi üzerinde çalışacaksak onu seçiyoruz. Bu yazımızda NUCLEO-F103RB board emülatörü üzerinde çalışacağımızdan (bu boardun üzerinde STM32F1 ailesinden STM32F103RB mikrodenetleyicisi mevcut) “Executable” açılır ögesi altından “STM32F10x C/C++ Project” ögesini seçin.

Sağ taraftaki “Toolchains” listesinde seçtiğimiz proje tipi için Eclipse’e tanımlı derleyici setlerinin listesi geldi. Bu listede de “Cross ARM GCC” seçerek “Next” butonuna tıklayın.

Bu arada eğer projenizin kaydedilmesini istediğiniz çalışma klasörünü değiştirmek isterseniz “Use Default Location” üzerine tıklayarak işaretini kaldırın ve “Location” alanına projenizin kaydedilmesini istediğiniz çalışma alanı yolunu girin. Ben olduğu gibi bırakmayı tercih ediyorum ama siz isterseniz değiştirebilirsiniz.

"Target Processor Settings" Penceresi
“Target Processor Settings” Penceresinden derleme yapılacak hedef mikrodenetleyiciye ait özellikler belirlenir.

Evet “C Project” penceresinde proje adı, proje sihirbazı ve derleyici araç seti tercihimizi yaptık ve “Next”e tıkladık. Karşımıza gelen “Target Processor Settings” pencerede ise üzerinde çalışacağımız hedef mikrodenetleyiciye has ayarlar mevcut. Dilerseniz bu ayarlardan bazı önemli olan başlıkları detaylı inceleyelim.

CHIP FAMILY
"Chip Family" Listesi
“Chip Family” listesinden “STM32f10x Medium Density” seçeneğini seçeceğiz.

ST firması 32 bit ARM tabanlı mikrodenetleyicilerini farklı özelliklerine göre kategorize ederek belli sınıflara ayırmıştır. Bu sınıflandırmayı da saat hızı, program hafızası, sram, fpu, dsp, çevre donanım desteği, güç tüketimi gibi ana kriterlere göre yapmıştır. Aşağıdaki listenin konuyu daha iyi açıklayacağını umuyorum.

  • High Performance
    • STM32F7 Series – Very High Performance with DSP and FPU (STM32F7x6)
      • 200 Mhz Cortex-M7 CPU
      • Up to 1 Mb Flash
      • Up to 366 Kb SRAM
    • STM32F4 Series – High Performance with DSP and FPU (STM32F401/411/405-415/407-417/427-437/429-439 and STM32F446)
      • Up to 180 Mhz Cortex-M4 DSP/FPU
      • Up to 2 Mb Flash
      • Up to 256 Kb SRAM
    • STM32F2 Series – High Performance (STM32F2x5 and 2×7)
      • 120 Mhz Cortex-M3 CPU
      • Up to 1 Mb Flash
      • Up to 128 Kb SRAM
  • Mainstream
    • STM32F3 Series – Mixed Signal with DSP (STM32F301/302/303/334/373/3×8)
      • 72 Mhz Cortex-M4 with DSP/FPU
      • Up to 512 Kb Flash
      • Up to 80 Kb SRAM CCM-RAM
    • STM32F1 Series – Mainstream (STM32F100/101/102/103 and 105/107)
      • Up to 72 Mhz Cortex-M3 CPU
      • Up to 1 Mb Flash
      • Up to 96 Kb SRAM
    • STM32F0 Series – Enry Level (STM32F0x0/0x1/0x2 and 0x8)
      • 48 Mhz Cortex-M0 CPU
      • Up to 256 Kb Flash
      • Up to 32 Kb SRAM, 20 Byte Backup Data
  • Ultra Low Power
    • STM32L4 Series – Ultra Low Power (STM32L4x6)
      • 80 Mhz Cortex-M4 CPU
      • Up to 1 Mb Flash
      • Up to 128 Kb SRAM
    • STM32L1 Series – Ultra Low Power (STM32L100/151-152/162)
      • 32 Mhz Cortex-M3 CPU
      • Up to 512 Kb Flash
      • Up to 80 Kb SRAM
      • Up to 16 Kb EEPROM
    • STM32L0 Series – Ultra Low Power (STM32L0x1/0x2/0x3)
      • 32 Mhz Cortex-M0+ CPU
      • Up to 192 Kb SRAM
      • Up to 20 Kb SRAM
      • Up to 6 Kb EEPROM

Listeden anlaşılacağı üzere ST firması ürettiği STM32 serisi çipleri peformans ve güç tüketimi üzerine 3 ana sınıf üzerine kategorilendirmiş durumda. Bu kategorizasyonda güç tüketimi ya da performans ihtiyacınıza göre tercih yapmanız gerekiyor.

Bunun yanında “Low Density”, “Medium Density” ve “High Density” parametreleri de “Chip Family” kategorizasyonu içinde göze çarpmakta. Bu parametreler ise “Program Hafızası (Flash)”nın boyutunu gösteren kategori etiketleridir. Örneğin STM32F100 serisi için bu sınıflandırma şöyle olacaktır:

  • Low Density: 16k Bytes or 32k Bytes Flash
  • Medium Density: 64k Bytes Flash or 128k Bytes Flash
  • High Density: 256k Bytes, 384k Bytes or 512k Bytes Flash

Burada aile tercihini geliştireceğiniz yazılımın bellek ihtiyacına göre belirlemiş olmanız gerekiyor. Örneğin 400 Kb tutacak olan bir uygulama için “Medium Density” ailesinden bir mikrodenetleyici seçerseniz programı bu mikrodenetleyicinin hafızasına sığdıramayacağınız aşikar.

Bu yazı kapsamında üzerinde duracağımız bordun NUCLEO-F103RB olduğunu yazının başında belirtmiştik. Bu board üzerinde bulunan STM32F103RB denetleyicinin bulunduğu STM32F103 ailesine dair bilgiler ise aşağıdaki görsel ve listede detaylı bir şekilde verilmiştir.

STM32F103 Ailesi
STM32F103 Mikrodenetleyici Ailesi Aile Tablosu
  • Low Density Devices
    STM32F103x4 – STM32F103C4, STM32F103R4
    STM32F103x6 – STM32F103C6, STM32F103R6
  • Medium Density Devices
    STM32F103x8 – STM32F103C8, STM32F103R8, STM32F103V8
    STM32F103xB – STM32F103CB, STM32F103RB, STM32F103VB
  • High Density Devices
    STM32F103xC – STM32F100RC, STM32F100VC, STM32F103ZC
    STM32F103xD – STM32F100RD, STM32F100VD, STM32F103ZD
    STM32F103xE – STM32F103RE, STM32F103VE, STM32F103ZE
  • XL Density Devices
    STM32F103xF – STM32F103RF STM32F103VF STM32F103ZF
    STM32F103xG – STM32F103RG STM32F103VG STM32F103ZG

STM32 Parça Numaralandırma Sistemi:

ST Firmasının Tüm STM32 ailesi için geliştirmiş olduğu numaralandırma sistemine ait açıklamalar aşağıda verilmiştir.

Örneğin STM32F103xy için gerçekleştirilecek okumada:

STM32: ST Firmasının ürettiği ARM Tabanlı 32-bit Mikrodenetleyici

F100: Mainstream Value Line alt ailesi
F101/F102: Mainstream Access Line
F103: Mainstream Performance Line alt ailesi
F105/F107: Mainstream Connectivity Line alt ailesi

x: Pin sayısını gösteren C, R, V veya Z harfleri:

  • C = 48 Pin Paket
  • R = 64 Pin Paket
  • V = 100 Pin Paket
  • Z = 144 Pin Paket

y: Flash (program) hafızası boyutunu gösteren 4, 6, 8, B, C, D, E, F, G, H harfleri:

  • 4 = 16Kb Flash
  • 6 = 32Kb Flash
  • 8 = 64Kb Flash
  • B = 128Kb Flash
  • C = 256Kb Flash
  • D = 384Kb Flash
  • E = 512Kb Flash
  • F = 768Kb Flash
  • G = 1Mb Flash

Buradaki tanımlamalardan hareketle kullanacağımız mikrodenetleyicinin 64-pin paketinde, 128 Kb program hafızasına, 20 Kb SRAM belleğe sahip Main Stream Performance Line ailesinden ve Medium Density bir cihaz olacağını söyleyebiliriz. Öyleyse “Chip Family” listesinden tercihimizi “STM32f10x Medium Density” olarak belirleyebiliriz.

FLASH SIZE (kB)

“Flash” terimi programımızın saklanacağı hafızayı ifade etmektedir. Diğer bir ifadeyle burası “Program Memory” yani program hafızası olarak ifade edilebilir. Kullanacağımız STM32F103RB mikrodenetleyicisi 128kb flash hafızaya (program hafızası) sahip olduğuna göre buraya “128” yazacağız.

RAM SIZE (kB)

Mikrodenetleyici çalışmaya başladığında geçici olarak tutulacak veriler burada bulunacaktır. Yani diğer bir ifadeyle mikrodenetleyicimizin RAMidir. Kullanacağımız STM32F103RB mikrodenetleyicisi 20kb RAM belleğine sahip olduğundan buraya “20” yazıyoruz.

EXTERNAL CLOCK (Hz)

Mikrodenetleyicimize vereceğimiz harici saat sinyalinin frekansını buraya girmemiz gerekiyor. Bu değer devre üzerinde mikrodenetleyicimize bağlı olan kristalin frekansıdır. Bizim boardumuzda 8Mhz kristal bulunduğundan buraya “8000000” yazıyoruz.

USE SYSTEM CALLS

Freestanding: POSIX sistem çağrılarını (open, close, read, write, vs.) kullanmayan basit gömülü sistem konfigürasyonu.
POSIX (system calls implemented by application code):  POSIX sistem çağrılarının uygulama tarafından kullanıldığı ancak dosya tanımlayıcılarının özel implementasyonlar (_open, _close, _read, _write, vs.) ile yerel aygıt veya dosyalara yönlendirildiği daha detaylı bir gömülü sistem konfigürasyonudur. Bu konfigürasyon POSIX programlarını kolayca port etmeyi sağlar.
Semihosting: Tüm sistem çağrılarının GDB sunucusunun çalıştığı host işletim sistemine köprülendiği özel bir test konfigürasyonudur. Bu konfigürasyon özellikle bir test seti içinde test otomasyon yazılımlarıyla elde edilen test sonuçlarının host işletim sistemi üzerinde bir dosyada tutulması gerektiğinde kullanılır.

Biz bu uygulama için listeden “Freestanding”i yani basit gömülü konfigürasyonu seçeceğiz.

TRACE OUTPUT

None (no trace output): İzleme çıktılarını (trace output) kullanmayan temel konfigürasyon.
ARM ITM (via SWO): J-Link kullanıldığında SWO pini aracılığıyla bilgi yazdırmaya yardım eden spesifik konfigürasyon.
Semihosting STDOUT stream: Standart Çıktı Birimi’ni (stdout), bir fiziksel bağlantı noktasını UART veya çıktı mesajları verme olanağı sağlayan diğer herhangi bir çevre birimi olarak kullanmak için konfigüre eden nispeten daha karmaşık bir konfigürasyon.
Semihosting DEBUG channel: Hata ayıklama kipine (DEBUG Mod) özel semihosting konfigürasyonudur. Semihosting konifügrasyonunu DEBUG kipinde aktifleştirir. Hata ayıklayıcı (Debugger) kanalıyla hedef mikrodenetleyici sistemin kaynaklarını geliştirme ortamında kullanma olanağı sağlar. Kullanıcının, hata ayıklayıcı konsoluna izleme akımları göndermesine yardımcı olur (trace _printf, trace _puts vs. gibi).

Biz bu uygulama için listeden “Semihosting DEBUG channel”i seçeceğiz. Yani debugger kanalıyla hem hata ayıklama mesajlarını alabileceğiz hem de bordun kaynaklarını kullanabileceğiz.

Bu arada “CONTENT” açılır listesinden nasıl bir başlangıç yapacağımızı belirleyelim. Ben bu çalışma için “Blinky (blink a led)” seçiyorum. Siz sonraki çalışmalarınızda “Empty (add your own content)” seçeneğini seçebilirsiniz.

“Target Processor Settings” penceresiyle ilgili tüm parametreleri ayarladığımıza göre artık “Next” butonuna tıklayabiliriz.

Proje ayarlarıyla ilgili bir diğer penceremiz “Folder Settings” penceresi olacak. Bu pencere proje dosyalarının kaydedileceği klasörlerin isimlerini belirlediğimiz penceredir.

"Folder Settings" Penceresi
“Folder Settings” penceresinden proje dosyalarının saklanacağı klasörlerin isimlerini özelleştirebilirsiniz.

“Folder Settings” penceresinin parametreleri şunlardır:

  • Include Folder: Başlık dosyalarını (genelde “*.h” uzantılı) tutacak klasörün adı.
  • Source Folder: Kaynak dosyaları (*.c veya *.cpp uzantılı) tutacak klasörün adı.
  • System Folder: Hedef mikrodenetleyiciye özel kütüphane dosyalarını tutacak klasörün adı.
  • CMSIS Library Folder: CMSIS kütüphanesini tutacak klasörün adı.
  • C Library Folder: Gömülü sistemlerin kullanımına has standart C kütüphanesini tutacak klasörün adı.
  • Linker Scripts Folder: Bağlayıcı betiklerini tutacak klasörün adı.

Klasörlerin varsayılan isimleri bence uygun. Ben bu parametreleri varsayılan ayarlarında bırakarak “Next” butonuna tıklıyorum.

Sıradaki pencere olan “Select Configurations” penceresinde uygulamamızın derleme konfigürasyonunu belirliyoruz.

"Select Configurations" Penceresi
“Select Configurations” penceresinde hangi derleme konfigürasyonları ile çalışacağımızı belirliyoruz.

Burada bulunan parametreleri de olduğu gibi bırakarak yine “Next” butonuna tıklayalım.

Ve mutlu son. En son proje ayarları penceresi olan “Cross GNU ARM Toolchain” penceresindeyiz. Burada kullanacağımız derleyici setini (toolchain) seçiyoruz. Eğer önceki yazımdaki bütün adımları doğru olarak yaptıysanız “Toolchain Name” ve “Toolchain Path” alanlarını aşağıdaki resimdeki gibi görmeniz gerekiyor.

"Cross GNU ARM Toolchain" Penceresi
“Cross GNU ARM Toolchain” penceresinden kullanacağımız toolchain tercihini yapıyoruz.

Evet “Toolchain Name” tercihimizi yukarıdaki resimdeki gibi ayarladıktan sonra “Finish” butonuna tıklayalım.

Artık Eclipse IDE geliştirme ortamımız STM32F103RB mikrodenetleyicisi için yazılım geliştirmeye hazır durumda.

Hata Ayıklama sürecini de başka bir yazıda irdelemek üzere bu yazımı burada noktalamak istiyorum.

İyi ve verimli çalışmalar.

İlk Yorumu Siz Yapın

Bir yanıt yazın

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