ana sayfa > ARM, Gömülü Sistemler, STM32, STM32F4, Yazılım > STM32F429I Discovery’de Keil ile STemWin kurulumu

STM32F429I Discovery’de Keil ile STemWin kurulumu

Salı, 14 Tem 2015 yorum ekle yorumlara git
STM32F429I Discovery’de Keil ile STemWin kurulumu

Merhaba arkadaşlar,

Okul, Vizeler Finaller derken uzun bir ara vermek zorunda kalmıştım. Bu yazıyı bile vakit buldukça yazabiliyorum ancak.

Bu yazımda STM32F429I Discovery’e STemWin grafik arayüz (GUI) kütüphanesinin Keil’de  kurulumunu kısa bir şekilde anlatmaya çalışacağım

Şimdi STemWin’i bilmeyenler için kısaca STemWin nedir buna bakalım.

STemWin, bir çeşit grafik arayüz yazılımıdır. Kısaca GUI(Graphical User Interface) diye isimlendiriliyor.  GUI için daha çok programlamayı daha görsel hale getirmeye yarar şeklinde bir yorumda bulunabilirim. GUI ilk başta PC ler için bir ihtiyaçtan doğmuş olsada artık mikroişlemcilerde de görsellik açısından kullanmak mecburi hale geliyor. Çünkü mikroişlemci ve LCD kullanımı gerektiren uygulamalarda sadece kod ile programlama yapmak son derece eziyetli ve görsellik açısından da zayıf ürünlerin ortaya çıkmasına neden oluyor. GUI bu aşamada hem kod yükünü zayıflatıyor hemde görselliği çok çok üst kademelere taşıyor.

Evet Buradaki yazımda  STM32F429I Discovery için Keilde nasıl template proje oluşturacağımızı öğrenmiştik. Şimdi Aynı template projenin devamı olarak STemWin kurulumunu anlatacağım.

1. Bölüm: STemWin Kurulumu

İlk önce buradaki linkten STemWin Library’sini indirmek gerekiyor.

http://www.st.com/web/en/catalog/tools/PF259225

Şimdi kuruluma geçmeden önce aşağıdaki gibi boş bir proje oluşturun. Projenin derlendiğinden emin olun. Proje klasörüde aşağıdaki gibi olmalı. Bu aşamada problem yaşıyorsanız Buradaki yazımı tekrar gözden geçirin.

 

Evet buraya kadar sıkıntı yok ise işlemlere devam edebiliriz.

Şimdi sırayla aşağıdaki işlemleri yapacağız.

1. İndirdiğimiz STemWin Library’sini Proje klasöründe Library Klasörünün içerisine kopyalayın.

2. Proje ağacında STemWin_V522_Lib ve Config Adında iki adet Source Group oluşturun.

3. STemWin_V522_Lib Source group içerisine STemWin522_4x9i_CM4_OS_Keil dosyasını eklemek gerekiyor. Bu dosya indirdiğiniz STemWin Library’si içerisinde STemWinLibrary522_4x9i\Lib dizini içerisinde olması gerekiyor.

4. Oluşturduğumuz Config adında Source Group içerisine GUIConf.c, GUIDRV_stm32f429i_discovery.c  ve GUI_X.c dosyalarını eklemek gerekiyor. Bu dosyalardan  GUIConf.c ve GUIDRV_stm32f429i_discovery.c dosyaları STemWinLibrary522_4x9i\Config dizini içerisinde bulunuyor. GUI_X.c dosyasıda  STemWinLibrary522_4x9i\OS dizini içerisinde bulunuyor. Bu dosyalarda STemWin ile ilgili birkaç configürasyon ayarları yapılıyor. Oldukça önemlidir.

5. Options For Target menüsünden STemWin ile ilgili klasörleri keile tanıtmak gerekiyor. Şimdi sırasıyla aşağıdaki klasörleri keile tanıtın.

  • Library\STemWinLibrary522_4x9i\inc
  • Library\STemWinLibrary522_4x9i\Config
  • Library\STemWinLibrary522_4x9i\OS

Sonuç olarak aşağıdaki dosyalar tanıtılmış olması gerekiyor.

6. Low Level ayarlar ve Touch panel kullanımı için BSP.c ve BSP.h dosyalarını USER klasörünün içerisine eklemek gerekiyor. Bu dosya içerisinde LowLevel GUI ayarları ve touch panel kontrolü yapılıyor. Ekrana dokunduğunuzda pointer güncellemesi buradan yapılır.

Dosyaları aşağıdaki linkten indirin.

https://yadi.sk/d/WpIMljjjheZN7
Ayrıca Proje ağacında User Source Group içerisinede ekleyin.
Sonuç olarak Proje ağacı ile User klasörünün içindeki dosyalar aşağıdaki gibi olmalı.

 

Bu işlemi yaptıktan sonra bu haliyle derleme yapmanız iyi olur. En azından buraya kadar hatasız bir şekilde programın derlenmesi lazım. Eğer hata varsa bir sonraki aşamaya geçmeden yaptığınız işlemleri gözden geçirin.

7.  Evet buraya kadar programınız hatasız derlendi ise işin yarısı bitti demektir. Bundan sonraki ayarlamalar çok önemli olmakla birlikte oldukça basit. İlk başta stm32f4xx_it.c içerisinde bazı interrupt ayarlarını yapmamız gerekiyor.

stm32f4xx_it.c dosyasının en başına bazı fonksiyonların tanımlamalarını yapmamız gerekiyor. Tanımlamanız gereken fonksiyonlar aşağıdaki gibi.

  • extern void LTDC_ISR_Handler(void);
  • extern void DMA2D_ISR_Handler(void);
  • extern void BSP_Background (void);

Birde  değişken tanımlaması yapacağız.

  • extern int32_t OS_TimeMS;

Burada LTDC_ISR_Handler ile DMA2D_ISR_Handler fonksiyonları LTDC ve DMA2D donanımlarının oluşturduğu interruptlar ile çağrılması gerekiyor. Bu fonksiyonlar GUIDRV_stm32f429i_discovery.c dosyasının içerisinde bulunmaktadır. Bu tanımlamaları yaptıktan sonra LDTC ve DMA2D kesme alt programlarını aşağıdaki gibi düzenleyin.

Son olarak birde BSP_Background fonksiyonumuz var buda oldukça önemli Bu fonksiyonunda SysTick donanımı ile belirli aralıklarla çağrılması gerekiyor. BSP_Background fonksiyonu içerisinde Touch panelden okuma yapılıp pointer güncellemesi yapılır. Bu fonksiyon çalışmazsa STemWin sizin dokunmalarınızı algılayamaz.

Bu yüzden SysTick interrupt ritinini aşağıdaki gibi değiştiriyoruz.

Burada gördüğünüz üzere bir OS_TimeMS++; işlemi yapılıyor. Biz herhangi bir Rtos benzeri bir yapı kullanmadığımız için GUI ye bir şekilde zaman bilgisi vermek gerekiyor. Bu sayede GUI’deki gecikme fonksiyonları düzgün bir şekilde çalışacaktır.

stm32f4xx_it.c dosyasında yapılacaklar bu kadar. Şimdi main programına dönüyoruz. Oradaki işlemleri de tamamlayıp arayüz tasarımına geçelim.

İlk başta main.c dosyamız boştu. Şimdi main.c dosyamızı aşağıdaki gibi düzenleyelim.

Ayrıca main.h dosyasınıda düzenlememiz gerekiyor. Main.h dosyasınada aşağıdaki kodları ekleyin.

Burada BSP_Background isimli bir fonksiyon olduğunu göreceksiniz. Bu fonksiyonu hatırlarsanız SysTick_Handler içerisinden sürekli çağırıyorduk. Bu fonksiyon içerisinde belirli sıklıklarla BSP_Pointer_Update fonksiyonu çağrılıp dokunmatik ekran okuması yapılıyor. Dokunma varsa pointer kordinatları güncellenir. Bu fonksiyon ise yine bsp.c içerisinde bulunmaktadır.

Evet STemWin’e ilişkin kurulum işlemleri ve ayarlar bu kadar. Bundan sonrası sizin yapacağınız tasarıma bağlı bir işlem. Bende 2. bölümde basitçe bir tasarım yapıp yazımı sonlandıracağım.

2. Bölüm: GUIBuilder Kullanımı ve Örnek Uygulama

Evet arkadaşlar. Şimdide GUIBuilder kullanımına bakacağız.

GUIBuilder programıda Segger Tarafından hazırlanmış arayüz oluşturmamızı sağlayan bir platform. Program STemWin Kütüphanesi ile birlikte bilgisayarınıza iniyor. STemWinLibrary522_4x9i>>Software>>GIUBuilder.exe dizininde olması gerekiyor.

Programı açtığınız zaman karşınıza aşağıdaki gibi bir sayfa gelecek.

Kullanım olarak oldukça basit bir yapıya sahip. Yaptığınız tasarımlara Buton, CheckBox, ListBox, MenuView, ScrollBar, ProgressBar, İmageView, İconView ListWheel Gibi birçok Component’e sahip. Basit tasarımlarda fazlasıyla işinizi görecektir. Ama ne yalan söyliyeyim. Ben daha kapsamlı bir program bekliyordum. Emin değilim belki Segger Firması ST için Kısıtlı bir sürüm hazırlamıştır. Zira EmWin ile ilgili izlediğim videolarda fevkalade güzel tasarımlar componentler olduğunu görüyorum. Muhtemelen bunlar için EmWin’in Full sürümünü satın almak gerekiyor. Herneyse bu kısım bizi ilgilendirmiyor. Biz elimzdekilerle yetinelim şimdilik :)

Yapacağımız uygulamada STM32F429I-Discovery üzerindeki Ledleri açıp kapayacağız. Bunun için en basitinden button kullanımını öğreneceğiz.
Ben aşağıdaki gibi bir tasarım yaptım. Tabi bu sizin isteğinize kalmış.

Tasarımı yaptıktan sonra GUIBuilder’de File Menüsünden Save Seçeneği ile kaydediyoruz. Ardından GUIBuilder kendi bulunduğu dizine WindowDLG.c adında bir dosya atıyor. Ben WindowDLG dedim ama yaptığınız tasarıma göre değişir bu. Hangi Componentleri kullandıysanız isimlendirme ona göre yapılır. WindowDLG.c, FrameWin.c.. Herneyse Bu dosya sizin GUIBuilder ile yaptığınız görsel tasarımın c koduna dönüşmüş halidir.
Ben yaptığım tasarımı C dosyasına çevirdiğimde GUIBuilder bana aşağıdaki kodları üretti.

Kodun en sonunda ve ara yerlerde USER START ve USER END diye başlıklar atmışlar. Buralarda artık kendi kodlarımızı yazmamız gerekiyor.
Şimdi bu işleme başlamadan önce burada oluşturduğumuz dosyayı keildeki projemize ekleyelim. GUIBuilder ile oluşturduğunuz dosyayı User klasörünün içerisine kopyalayalım. Ardından keilde proje ağacında User altına WindowDLG.c’yi ekliyoruz.
Sonrasında WindowDLG.c’nin en altına MainTask() adında bir fonksiyon yazacağız. Bu fonksiyonda GUI initialization işlemleri yapılır.
MainTask() fonksiyonumuzun içeriği aşağıdaki gibi.

Yukarıdaki kodlar çalışınca Artık Pencereler oluşturulmuş olacak. Yaptığımız tasarım ekrana gelmiş olacaktır. Ayrıca Cursörün görünmesi için (fare imleci) GUI_CURSOR_Show() fonksiyonunu kendim çağırdım. Bunu yazmazsanız Cursör görünmez.

Bundan sonra yapmamız gereken tek şey main programında WindowDLG.c içerisine eklediğimiz MainTask fonksiyonunu çağırmak.
main programımızı aşağıdaki gibi güncelliyoruz. Hata olmaması için tümüyle kod parçası veriyorum.

Evet şimdi kodumuzu derleyelim. Hatasız bir şekilde derlenmesi lazım. Bundan sonra kodumuzu kite yükleyebiliriz. Yaptığımız tasarım hatasız bir şekilde ekrana çıkacak, dokunmatik çalışacak butonlara felan basabileceksiniz. Fakat butonlara henüz işlev atamadık. Bu yüzden butonlara basmanız durumunda Yapmak istediğimiz gibi LED’lerin yanıp söndüğünü görmeyeceksiniz.

Hatırlarsanız WindowDLG.c içerisinde sürekli USER START, USER END diye açıklama bırakmışlar. Bizim yaptığımız tasarımda eklediğimiz her bir component için bir olay dizisi vardır. Yaptığımız tasarımda Buton kullandığımız için butondan örnek vereyim. Buton için WM_NOTIFICATION_CLICKED ve WM_NOTIFICATION_RELEASED diye iki adet olay vardır. Butona basıp bıraktığımızda GUI bu olayları gerçekleştirir. Son derece basit aslında. Daha önce Visual Stuido benzeri bir platformda çalışmış arkadaşlar için oldukça tanıdık gelecektir bu yapı. Herneyse Biz WindowDLG içerisinde her bir buton için kendi kodumuzu ekliyoruz.
led yakıp söndüreceğimiz için WM_NOTIFICATION_CLICKED olaylarının içerisinde STM32F429I-Discovery üzerindeki Ledleri yakıp söndürüyoruz. Şimdi WindowDLG.c dosyamızın son hali aşağıdaki gibi oldu. Butonların olaylarına dikkat edin.

Tabi benim bu son anlattıklarım birazda yaptığımız tasarıma göre gelişti. Yani örnek olması için bunları yazdım. Yoksa buton olayları içerisine istediğiniz kodu yazabilirsiniz. Mesela Butona astığınız sürece ledin yandığını, butonu bıraktığınızda sönmesini istiyorsanız WM_NOTIFICATION_CLICKED olayında ledi yakar, WM_NOTIFICATION_RELEASED ledi söndürürsünüz. Yapılacaklar hayal gücünüze bağlı.

Evet bunları yaptıktan sonra kodumuzu derleyip kite yükleyebilirsiniz. Kodun hatasız bir şekilde derlenmesi lazım.
Ben derledim ve yükledim. Sonuç resimdeki gibi. :)

Evet sizde kendi kartınızda bu sonucu görüyorsanız problem yok demektir. :)
Buda çalışma videosu

Evet arkadaşlar STemWin ile ilgili diyeceklerim bu kadar. Takıldığınız yerlerde sorabilirsiniz. Örnek olması açısından videodaki projeyide yüklüyorum. İsteyen arkadaşlar Buradan indirebilir.

İyi çalışmalar.

  1. Perşembe, 20 Ağu 2015 zamanında 12:35 | #1

    Teşekkürler Ferhat, stemwin kütüphanesinde bazı dosyalar senin dediklerinden farklı çıktı, derleyemedim ama sonradan senin projenin linkini eklediğini gördüm, onu indirip derledim acelem olduğu için.

  2. Murat
    Cuma, 21 Ağu 2015 zamanında 14:32 | #2

    Teşekkürler Ferhat Bey, uzun süredir emwin kütüphanesini çalıştırmayı deniyordum.Gayet güzel ve ayrıntılı anlatmışsınız.Umarım herkese faydalı olur.

  3. Mehmet Kahraman
    Salı, 20 Eki 2015 zamanında 13:11 | #3

    Merhaba Ferhat Bey,

    güzel yazılarınız ve emekleriniz için teşekkür ederim. Ben time lapse fotoğrafçılık için bir slider planladım. Mekanik aksamı bitti (2. slider’ı bitirdim). Bu slider ‘a bağlı redüktörlü bir step motor kullanıyorum. Motoru kontrol etmek için STM32 F4 discovery board aldım. Aynı board kamerayı da kontrol edecek. Genellikle bu işi yapanlar arduiono kullanmışlar ancak programlamayı yapacak arkdaşın tavsiyesi üzerine STM32 aldım. Programcı arkdaşın iş yoğunluğu nedeniyle bu projenin programlaması bana kaldı. https://www.youtube.com/watch?v=z2X__8tgIF8 bu link’den konu ilginizi çekerse yapılmış slider’ları görebilirsiniz.

    Ben programcı değilim yatkınlığım var ancak konuyu bilmiyorum ve öğrenmeye çalışıyorum. Öncelikli hedefim step motoru sürebilmek, hız kontrolünü bir pota verebilmek ve ileri geri hareketi sağlayabilmek. Bana bu konuda prtaik bir yol haritası verebilir misiniz ?

    Teşekkür ederim..

  4. Ferhat YOL
    Salı, 20 Eki 2015 zamanında 15:04 | #4

    @Mehmet Kahraman
    @Mehmet bey projeniz için bana ferhatyol@gmail.com adresinden ulaşabilirsiniz.

  5. Sinan
    Perşembe, 21 Oca 2016 zamanında 15:26 | #5

    Merhaba, anlatımınız çok güzel keil’in verdiği manasız hatalardan kurtulmak için 3 kez sıfırdan proje oluşturdum sonunda oldu. Keil çok karmaşık açıkçası.

    Bir sorum olacaktı GUI_Builder uygulamasında bir resim/logo ekleyip karta yüklediğim zaman arka plan rengi siyah oluyor ve ekranda kaymalar meydana geliyor. resim dosyası eklemediğim sürece sorun yok. Siz hiç denediniz mi, bu konu hakkında da bir yazı hazırlayabilirseniz seviniriz.

    Sizler sayesinde daha kolay alışıyorum keil ve stm32’ye teşekkürler.

  1. şimdilik geri bağlantı yok