STM32Fx Ailesinde Uygulama Geliştirmek İçin, Ubuntu İşletim Sisteminde, GNU GCC Arm Derleyicisi İle Eclipse Ortamının Hazırlanması

ubuntu+eclipse+gnu+stm

 

Bu yazıda Ubuntu işletim sistemi üzerinde GNU GCC Arm derleyicisi ve Eclipse kullanarak STM32Fx işlemci ailesi için kod geliştirme ortamının hazırlanması konusu ele alınmaktadır.

İşletim Sistemi Ubuntu 14.04
IDE Eclipse Kepler for C/C++ Developers
Derleyici GNU GCC Arm
Donanım STM32 Value Line Discovery

 

  1. Eclipse Kurulumu: Öncelikle linkte belirtildiği gibi Ubuntu işletim sisteminde Eclipse kurulumu gerçekleştirilmektedir.
  2. Derleyici Kurulumu: GNU GCC Arm derleyicisinin Linux için olanı şu linkten indirilmelidir. Eğer 64 bit işletim sistemi kullanıyorsanız derleyicinin doğru çalışabilmesi için aşağıdaki komut ile gerekli paketlerin kurulumu yapılmalıdır.
    sudo apt-get install libc6-i386 lib32ncurses5* 
  3. Derleyici Ayarı: Derleyicinin indirilmesinin(Masaüstüne indirildiğini varsayacağım) ardından derleyici dosyaları arşivden çıkarılmaktadır. Aşağıdaki komut ile HOME dizininizde GnuGccArmToolchain adlı bir dizin oluşturulmakta ve arşivden çıkarılan dosyalar (arm-none-eabi, bin, lib vs…) bu oluşturduğunuz dizine taşımaktadır.
    tar -jxf ~/Masaüstü/gcc-arm-none-eabi-*.tar.bz2
    mkdir ~/GnuGccArmToolchain
    cp -rf ~/Masaüstü/gcc-arm-none-eabi-*/* ~/GnuGccArmToolchain
  4. Standart Peripheral Kütüphanesi: STM32Fx işlemcisinin standart peripheral kütüphanesini indirebilmek için hangi x ailesi ile uygulama geliştirecekseniz(0,1,2,3,4 vs…) onun adıyla Google’da arama yapmanız gerekmekte ve ST sitesinden bulduğunuz zip dosyasını indirmeniz gerekmektedir. Örneğin: “STM32F10x Standard Peripheral Library”. Daha sonra bu indirilen zip dosyasını arşivden çıkarıp olduğu gibi bir üst adımda yarattığımız “GnuGccArmToolchain” isimli dizinin altına kopyalamanız gerekmektedir.
  5. Geliştirme Kartlarına Özel Firmware: Eğer bir geliştirme kartı (diğer bir ismiyle discovery board) kullanıyorsanız bu kartın üzerine eklenmiş LED, buton gibi bileşenlerin tanımlandığı board dosyaları vardır. Bu dosyalar işlemcinin etrafına kendi bileşenlerinizi koyduğunuzda ve kendi kartınızı yaptığınızda sizin tarafınızdan hazırlanmalıdır ve şimdi anlatacağım adım sizin için geçerli olmayacaktır. Ancak STM32 Value Line Discovery kartını kullanıyorsanız bu adım yapılmalıdır. Bu adımda da yine üstteki adımda yaptığımız gibi geliştirme kartınızın adıyla Google araması yapılacak ve ilgili dosya indirilecektir. Örneğin “STM32 Value Line Discovery firmware package”. Daha sonra bu indirilen zip dosyasını arşivden çıkarıp olduğu gibi 3. adımda yarattığımız “GnuGccArmToolchain” isimli dizinin altına kopyalamanız gerekmektedir.
  6. Gnu Gcc Arm Eclipse Plugin Kurulumu: Bu işlem bizi bir sürü proje ayarı yapmaktan kurtarmakta ve basit bir arayüz ile bütün ayarları kontrol edebilme ve değiştirme olanağı sağlamaktadır. İlgili plugin’in kurulabilmesi için Eclipse uygulaması başlatıldıktan sonra “Help > Install New Software…” menusu açılmalıdır. Açılan menuden “Add” butonuna tıklayarak açılan pencerede “name” kısmı “GNU GCC Arm”, “location” kısmı “http://gnuarmeclipse.sourceforge.net/updates” olarak ayarlanmalı ve “Ok” tuşuna basarak kapatılmalıdır. Daha sonra güncellenen aşağıdaki alanda yer alan “GNU Arm C/C++ Cross Development Tools” seçeneğinin tamamı seçilip “Next” denerek plugin kurulmalı ve Eclipse yeniden başlatılmalıdır.
  7. Yeni Proje Oluşturulması: Bu bölümden sonrası aşağıda anlatacağım iki farklı yöntemle yapılabilir. Bunlardan ilki biraz önce kurduğumuz plugin’i kullanarak plugin’in sağladığı olanaklardan faydalanan yöntemdir. Bu yöntemde proje oluşturma esnasında belli bazı dosyaları sizin yerinize otomatik olarak oluşturulup içi doldurulmaktadır. (Ancak hala bir iki tane dosyayı sizin elle projeye dahil etmeniz gerekmektedir.) İkinci yöntemde ise proje (ayarları hariç) tamamen boş gelmektedir ve içerisindeki bütün dosyaları elle projeye dahil etmeniz gerekmektedir.  
    1. İçi dolu proje oluşturulması: Eclipse’de “File>New>C Project” menusune gidilmekte ve yeni proje oluşturma sihirbazı çalıştırılmaktadır.
      Step 7.1.1
      Alttaki resimde yapacağınız ayarlar cihazınızın özellikleri ile mutlaka uyuşmalıdır. Content kısmında boş proje seçilmektedir.
      Step 7.1.1
      Daha sonra aradaki 2 adım varsayılan ayarlarıyla geçilmektedir. Son adım olan toolchain seçme adımında “Toolchain name” kısmı açılan menüden “GNU Tools for ARM Embedded Processors” seçilmekte ve GNU GCC Arm derleyicisini indirip, içindeki dosyaları taşıdığımız dizinin içindeki bin dosyası “Toolchin Path” olarak ayarlanmaktadır.
      Step 7.1.3
      Proje oluşturulduktan sonra 4. adımda indirip toolchain dizininize kopyaladığımız “STM32F10x Standard Peripheral Library” dosyalarının içindeki “Project > xyz Template” dizininde bulunan stm32fxyz_it.c ve stm32fxyz_it.h dosyaları ile 5. adımda indirip toolchain dizininize kopyaladığımız “STM32 Value Line Discovery firmware package” dosyalarının içindeki “Utilities” dizininde bulunan STM32vldiscovery.c ve STM32vldiscovery.h dosyaları Eclipse proje dizininizin altında yer alan “src” dizinine kopyalanmaktadır. (Not: Kopyalanan dosyaları Eclipse arayüzünden görebilmek için arayüzden ilgili dizin seçilip F5 ile yenilenmelidir.) Bu işlemin ardından “src” dizinin yapısı şu şekilde olmaktadır.
      Step 7.1.4
      Elle dahil etme adımlarının sonuncusu startup dosyasının dahil edilmesidir. Bunun için 4. adımda indirip toolchain dizininize kopyaladığımız “STM32F10x Standard Peripheral Library” dosyalarının içindeki “Libraries > CMSIS > CM3 > Device Support > ST > stm32fxyz > startup > TrueStudio” dizininde bulunan dosyalardan cihazınız için uygun olan startup dosyası (STM32 Value Line Discovery için “startup_stm32f10x_md_vl.s” dosyası, md:medium density, vl:value line değerini göstermektedir)  Eclipse proje dizininizin altında yer alan “include” dizinine kopyalanmaktadır. (Not: Kopyalanan dosyaları Eclipse arayüzünden görebilmek için arayüzden ilgili dizin seçilip F5 ile yenilenmelidir.) Kopyalama işleminin ardından dosyaya sağ tıklanarak “Rename” seçilmekte ve isminde yer alan “.s” uzantısı “.S” (büyük harf) çevrilmektedir.
      Daha sonra projeye sağ tıklanarak “Properties > C/C++ General > Paths and Symbols > Source Location > Add Folder…” butonuna basılmakta ve “include” dizini seçilmektedir. Bu iki işlemin ardından “include” dizini şu şekilde görülmektedir.
      Step 7.1.5
      Son olarak proje dizinindeki “src/main.c” dosyasının içi örnek bir projenin (mesela 5. adımda indirip toolchain dizininize kopyaladığımız “STM32 Value Line Discovery firmware package” dosyalarının içindeki “Project > Examples > GPIOToggle” dizininde bulunan main.c dosyası gibi) içindeki main dosyası ile değiştirilmektedir. Bu sayede örnek projenin yapması beklenen şey bizim projemizde de gerçekleşmiş olacaktır.
      Bu koşullarda derleme yaptığınız zaman iki tane hata alacaksınızdır. Bunlardan ilki projenizin “src > STM32vldiscovery.h ” dosyasının 30. satırındaki STM32f10x.h dosyasının include işlemi sırasında olmaktadır. Bu hatayı düzeltmek için include edilen dosya adının tamamını küçük harflerle (stm32f10x.h) yazmanız gerekmektedir. Bir diğer hata ise “src > main.c” dosyasında “void assert_failed(uint8_t*, uint32_t)” fonksiyonunun tanımlandığı yerde oluşmaktadır. Bu hatanın kaynağı bu fonksiyonun başka bir dosyada da tanımlanmış olmasıdır. Bu yüzden bu fonksiyon tanımını silerseniz ya da yorum haline getirirseniz başarılı bir şekilde derleme işlemi yapılmaktadır.
    2. İçi boş proje oluşturulması: Eclipse’de “File>New>C Project” menusune gidilmekte ve yeni proje oluşturma sihirbazı çalıştırılmaktadır.
      Step 7.2.1
      Daha sonra aradaki 1 adım varsayılan ayarlarıyla geçilmektedir. Son adım olan toolchain seçme adımında “Toolchain name” kısmı açılan menüden “GNU Tools for ARM Embedded Processors” seçilmekte ve GNU GCC Arm derleyicisini indirip, içindeki dosyaları taşıdığımız dizinin içindeki bin dosyası “Toolchin Path” olarak ayarlanmaktadır.
      Step 7.1.3
      Daha sonra projeye sağ tıklayıp “New > Source Folder” diyerek “src” adında bir dizin yaratılmaktadır. Aynı yöntemle bir de “startup_src” adında bir dizin yaratılmaktadır.
      4. adımda indirip toolchain dizininize kopyaladığımız “STM32F10x Standard Peripheral Library” dosyalarının içindeki “Libraries > CMSIS > CM3 > Device Support > ST > stm32fxyz > startup > TrueStudio” dizininde bulunan dosyalardan cihazınız için uygun olan startup dosyası (STM32 Value Line Discovery için “startup_stm32f10x_md_vl.s” dosyası, md:medium density, vl:value line değerini göstermektedir)  Eclipse proje dizininizin altında yer alan “startup_src” dizinine kopyalanmaktadır. (Not: Kopyalanan dosyaları Eclipse arayüzünden görebilmek için arayüzden ilgili dizin seçilip F5 ile yenilenmelidir.) Kopyalama işleminin ardından dosyaya sağ tıklanarak “Rename” seçilmekte ve isminde yer alan “.s” uzantısı “.S” (büyük harf) çevrilmektedir.
      5. adımda indirip toolchain dizininize kopyaladığımız “STM32 Value Line Discovery firmware package” dosyalarının içindeki “Project > Demo > TrueSTUDIO > DISCOVER” dizininde bulunan STM32F100RB_FLASH.ld dosyası Eclipse proje dizininizin altında yer alan “startup_src” dizinine kopyalanmaktadır. (Not: Kopyalanan dosyaları Eclipse arayüzünden görebilmek için arayüzden ilgili dizin seçilip F5 ile yenilenmelidir.)
      5. adımda indirip toolchain dizininize kopyaladığımız “STM32 Value Line Discovery firmware package” dosyalarının içindeki “Project > Examples > GPIOToggle” dizininde bulunan stm32fxyz_it.c, stm32fxyz_it.h,  stm32fxyz_conf.h ve main.c dosyaları ve yine 5. adımda indirip toolchain dizininize kopyaladığımız “STM32 Value Line Discovery firmware package” dosyalarının içindeki “Utilities” dizininde bulunan STM32vldiscovery.c ve STM32vldiscovery.h dosyaları  Eclipse proje dizininizin altında yer alan “src” dizinine kopyalanmaktadır. (Not: Kopyalanan dosyaları Eclipse arayüzünden görebilmek için arayüzden ilgili dizin seçilip F5 ile yenilenmelidir.) Bu işlemlerin ardından “src” ve “startup_src” dizinleri aşağıdaki gibi olmaktadır.
      Step 7.2.2
      Daha sonra projeye sağ tıklayarak “Properties > C/C++ General > Paths and Symbols > Source Location > Link Folder…” butonuna basılmakta ve sırasıyla aşağıdaki konfigurasyonlar yapılmaktadır. (Ekran görüntüleri de eklenmiştir.)
      Folder Name: CoreSupport, Link to folder in the file system: toolchain dizini/library dizini/Libraries/CMSIS/CM3/CoreSupport
      Step 7.2.3
      Folder Name: DeviceSupport, Link to folder in the file system: toolchain dizini/library dizini/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32Fxyz
      Step 7.2.4
      Folder Name: StdPeriphLib, Link to folder in the file system: toolchain dizini/library dizini/Libraries/STM32Fxyz_StdPeriph_Driver/src
      Step 7.2.5
      Daha sonra aynı sayfadaki “Includes > GNU C” sekmesine gidilmektedir. Sırasıyla aşağıdaki konfigurasyonlar eklenmektedir. Ekranın son hali aşağıdaki fotoğraftaki gibi olmaktadır.
      Directory: /${ProjName}/src , Is a workspace path: SEÇİLİ
      Directory: toolchain dizini/library dizini/Libraries/CMSIS/CM3/CoreSupport
      Directory: toolchain dizini/library dizini/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32Fxyz
      Directory: toolchain dizini/library dizini/Libraries/STM32Fxyz_StdPeriph_Driver/inc
      Step 7.2.6
      Daha sonra aynı sayfadaki “Symbols > GNU C” sekmesine gidilmektedir. Sırasıyla aşağıdaki konfigurasyonlar eklenmektedir. Ekranın son hali aşağıdaki fotoğraftaki gibi olmaktadır.
      Name: STM32F10X_MD_VL
      Name: USE_STDPERIPH_DRIVER
      Name:USE_STM32_DISCOVERY
      Step 7.2.7
      Bu koşullarda derleme yaptığınız zaman üç tane hata alacaksınızdır. Bunlardan ilki projenizin “src > STM32vldiscovery.h ” dosyasının 30. satırındaki STM32f10x.h dosyasının include işlemi sırasında olmaktadır. Bu hatayı düzeltmek için include edilen dosya adının tamamını küçük harflerle (stm32f10x.h) yazmanız gerekmektedir. Bir diğer hata ise “CoreSupport > core_cm3.c” dosyasındadır. Bunu düzeltmek için “uint32_t __STREXB(uint8_t, uint8_t *)” ve “uint32_t __STREXH(uint8_t, uint8_t *)” fonksiyonlarının içindeki şu satırlardaki “=r” kısmını,
      __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); 
      şunlar(“=&r”) ile değiştirmelisiniz.
      __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
      
      Üçüncü olabilecek hata ise “exit.c:(.text.exit+0x16): undefined reference to `_exit'” şeklindeki bir hatadır. Bunu düzeltmek için ise projeye sağ tıklayıp “Properties > C/C++ Build > Settings > Tool Settings > Corss ARM C Linker > Miscellaneous” alanının en altında yer alan “Other linker flags” kısmına “–specs=nosys.specs” eklenmelidir.
      Step 7.2.8
  8. Ortak proje ayarı: İki yöntemle de proje oluşturduktan sonra projeye sağ tıklanıp “Properties > C/C++ Build > Settings > Tool Settings > Cross ARM GNU Create Flash Image > General > Output File Format” seçeneği “Raw Binary” olarak ayarlanmaktadır. Bu sayede donanımıza atabileceğimiz bir binary dosyası oluşturulmaktadır.

Üretilen binary dosyanın cihaza flash edilmesi ise yakın zamanda yazmayı düşündüğüm ayrı bir başlıkta yer alacaktır. Umarım ilgisi olanlar için faydalı bir dokuman olacaktır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir