Thursday, February 19, 2015

TCP Socket Connection On MBED, NODEMCU




Son zamanlarda IoT ve M2M  ile ilgili birçok gelişme, yaşanıyor.  IoT ve M2M ile ilgili sayfalarca tanıtım vs yapılabiliriz. Elektronik ve Bilişim sektörü IoT ve M2M üzerinde çok fazla büyüyecek ..

Bir önceki yazımda, ESP8622 ile yapılmış, NodeMCU platformunu incelemiştim. 

Bu yazıda ise , NodeMCU platformuna , AT komutların çalışması için gerekli Firmware dosyasını yükleyeceğim ve NodeMCU ve Mbed  ile bir TCP soket bağlantısı gerçekleştireceğim. 

Kısaca MBED hakkında biraz bilgilendirme yapmam gerekirse,  MBED , ARM tarafından geliştirilen ve Mikroişlemciler ve benzeri  platformlarda yazılım geliştirme işlemlerini kolaylaştıran ve bir çok geliştiricinin bilgilerini ve kütüphanelerini paylaştığı bir ekosistem.

Mbed biraz Arduino’ya benziyor, fakat daha esnek bir mimarisi var. 
Her firma kendi mimarisini ekleyebilmesi için tasarlanmış. ARM mimarisini kullanmak kaydıyla.

MBED bir diğer yanı ise, Geliştirme ortamının online olması. Yazdığınız kodlar ve tüm veriler cloud üzerinde hesabınızda duruyor ve istediğiniz zaman erişime ve geliştirme yapabilirsiniz. Online compiler , çok esnek ve hızlı değil. İsterseniz çeşitli  profesyonel  geliştirme ortamlarına da projenizi export edebiliyorsunuz. ( KEIL , IAR, CooCOX, GCC vsvs )
MBED için bir kullanıcı hesabı açmanız gerekli.

Detaylı bilgileri aşağıdaki siteden inceleyebilirsiniz.


Projenin kaynak dosyalarıda aşağıdan indirebilirsiniz.



İlk işlem olarak ESP8622 entegresine Modem Firmware dosyasını yüklemek . AT komutları kullandığı için Modem firmware dedim.
Firmware yükleme işlemini yapmadan önce , “Makefile” dosyasındaki COM parametresini kontrol ediniz.
Firmware işlemine başlamadan önce, Nodemcu üzerindeki Firmware butonuna basılı tutunuz. Firmware başladıktan sonra bırakabilirsiniz.





Bunun için Yapmamız gereken ,  Eclipse IDE açıp, workspace’den  “at_v0.20_on_SDKv0.9.4” projesini seçmek.


Proje ile ilgili güncel verileri aşağıdaki paylaşacağım linklerden takip edebilirsiniz.
Notice: AT v0.20 is based on SDK v0.9.4.

Git repo
https://github.com/espressif/esp8266_at

Patch SDK v0.9.4
https://github.com/vowstar/esp8266_at/commit/366a8a5e1c6c273bafdf555b85c34dcde5d7d508

ESP8266 AT Instruction Set v0.20 28.11.2014
http://esp8266.ru/download/esp8266-doc/4A-AT-Espressif%20AT%20Instruction%20Set_020.pdf

ESP8266 AT Command Examples v0.3 28.11.2014
http://esp8266.ru/download/esp8266-doc/4B-AT-Espressif%20AT%20Command%20Examples_v0.3.pdf



Modem Firmware dosyasını başarılı bir şekilde yükledikden sonra, yapmanız gereken  Bir terminal programı ile Modemi kontrol etmek ,
Bunun için TeraTerm kullanıyorum. Hyper terminal , Putty ve benzeri programlarda işinizi görecektir.



Modem firmware dosyası düzgün bir şekilde yüklendi ise,
AT Komutuna , OK diye cevap dönecektir.
AT+GMR komutuna ise versiyon ve tarih bilgisini döner. Bu verileri, “at_v0.20_on_SDKv0.9.4”  projesi içerisinden değiştirebilirsiniz.
Bu adıma kadar geldiysek WIFI modemimiz hazır demektir.


İkinci adımımız ise MBED yazılım geliştirme ortamını hazırlamak,


MBED için elimde bulunan ST Nucleo F401RE kartını kullanacağım. ST geliştirdiği Nucleo boardları MBED uyumu ve aynı zamanda Arduino shieldler ile uyumu ile baya beğenimi topladı. Board üzerinde bulunan JTAG ile binary dosyayı karta yüklemek oldukça kolay. Keil , GCC benzeri IDE lerde JTAG olarak görüyor ve debug vb işlemleri yapmanıza izin veriyor.
MBED kartınızı USB ile bilgisayarınıza taktığınızda , aygıt yöneticisinde ST virtual COM driver aygıtının gelmesi gerekiyor.


ST virtual Com , MBED üzerinde yazılım geliştirirken çok işinize yarayacak bir aygıt.
Anladığım kadarı ile, JTAG ile ilişkili ve Mikroişlemcinizin herhangi bir COM portunu işgal etmiyor.  ARM çekirdeğinin desteklediği  “Serial Wire Debug”  özelliğini kullandırıyor.  Nucleo üzerinde bir JTAG olması, programlama , debug  ve geliştirme işlemleri için güzel bir avantaj.

ST JTAG  sürücüsü  ile cihazı programlamak ise oldukça kolay olmuş. Flash diske dosya kopyalamak kadar basit. 




Resimde de görüldüğü gibi 512KB bir hafızanız var. Bu aşan Nucleoda üzerindeki SMT32F401RET6 mikro işlemcisinin flash alanı.
Projenizi derlediğiniz zaman oluşacak BIN dosyasını buraya sürükle bırak yapmanız , cihazı programlamanızı sağlıyor.

Hafızanın ne kadarı dolu veya boş , yüklenen binary dosyayı geri almak için bir özellik yok.

Daha detaylı flash işlemleri için STM32 ST-LINK UTILITY programını kurmanız gerekiyor.




Projenizde, yazılım güncelleme , bootloader vb ihtiyaçlarınız olduğunda bu programa ihtiyacınız olacaktır.

Şimdilik Nucleo Drive’ı kullanacağım.

MBED ile ilgili bir diğer işlem MBED hesabı oluşturmak.
Bunun için " http://developer.mbed.org/ " sayfasına girip  login/signup yönergelerini tamamlamanız gerekli  

MBED hesabınızı oluşturduktan sonra,  sağ üst köşede bulunan Compiler linkini tıklayabilirsiniz.




Compiler linkine tıkladıktan sonra, karşınıza bir yazılım geliştirme ortamı gelecek. Eğer daha önceden tanımladığınız bir platform yok ise , yine sağ üstte bulunan platform ekle butonuna basabilirsiniz. Platform , elinizde bulunan yazılım geliştirme boardlarına verilen adlar. sitede , bir çok üreticinin geliştirdiği platformlar mevcut.







Daha önceden "ST Nucleo F401RE"  eklediğimden, ek son kullandığınız platform görünmekte.
Buradan karşınıza gelecek yönergeleri takip ederek platformu ekleme işlemini tamamlayabilirsiniz.

Platformu da ekledikten sonra, Bir "Hello World" örneğini çalıştırmamız doğru yolda olup olmadığımız hakkında bilgi verebilir.

Bunun için compiler üzerinde , new/ create new program seçeneğini açıyoruz ve karşımıza aşağıdaki aşağıdaki ekran geliyor.



Platform olarak, ST Nucleo F401RE seçtim.
Örnek Proje ise, bilgisayara UART üzerinden mesaj gönderen bir uygulama.
OK dediğimiz zaman, workspace alanımıza, seçtiğimiz proje ile ilgili dosyaları indirecek.
Dosyalar üzerinde herhangi bir değişiklik yapmadan "compile" butonuna bastığımızda, projemiz derlenecek ve ST Nucleo bordumuza kopyalayacağımız BIN dosyasını ise bilgisayarın ilgili download klasörüne indirecek.




BIN dosyasını Nucleo Sürücüsüne yükledikten sonra yazılımımız otomatik olarak çalışmaya başlayacaktır.







Yazılımın doğru çalıştığını anlamak için, Tera TERM ile Nucleo virtual COM portumuza bağlanacağız. Terminal programınızda haberleşme hızını  9600 / 8n1 ayarlamanız gerekiyor.




Terminal ekranında görüldüğü gibi, Örnek kod her 1saniye'de programın ne kadar süredir çalıştığını yazmakta.

Yukarıdaki her iki adımı da tamamladıktan sonra, elimizde WIFI modemimiz ve ST geliştirme ortamımız hazır olarak bulunur durumda.

Bu iki karta ilave olarak , bir adet USB seri dönüştürücü daha kullanacağım. Toplamda 3 adet elektronik PCB birbirine bağlanacak. USB dönüştürücüyü kullanma nedenim Nodemcu ve Nucleo kartları arasındaki iletişimi dinlemek.

Maalesef  ST Nucleo boardumuza ,  NodeMCU kartını , Aurduino shield benzeri bir yöntemle üzerine takamıyoruz.  Bunun için kısa laboratuvar kablolarından kullanacağım.

Bağlantıyı aşağıdaki şemadaki gibi yapıyorum. 3.3V ve 5V bağlantılara dikkat edilmesi gerekiyor.

Nucleo boardumuzda , NodeMCU boardumuzda 3.3V ile çalışmakta. Olası bir 5V ile besleme yaparsak bozulma ihtimali oldukça yüksek. 

Ben Üç kartıda  bilgisayardan USB kabloları ile besledim. Besleme bağlantılarını birbirine taşımadım. 
Sadece kartların, GND'lerini ortak bağladım. 

Bağlantı şeması aşağıdaki gibi oldu.



USB seri dönüştürücünün RX pinini ,  MBED TX pinine bağlar iseniz, bu seferde , MBED gönderdiği komutları izleyebilirsiniz. Bu kartı kullanmayabilirsiniz de. 

Yazılımı MBED platformuna upload edeceğim. Kendi workspaceinize import edebilirsiniz. 



Yazılım ile ilgili ,

- AT komutlar ile TCP Socket bağlantısı kurup , veri gönderiyor. Her gönderimde bir sayaç değerini arttırıyor.

- NUCLEO ile ADC , button interrupt vb işlemlerde TCP soket üzerine gönderile bilinir.

- Button interruptı da ekledim ama LED1 yakıp söndürmekden başka fonksiyonu yok.

- MBED RTOS kullanılıyor.Main içerisinde iki thread açıyor. Bir thread WIFI bağlantılarını vs yapıp veri göndermeye başlıyor. Diğer Thread ise boş , içerisine ADC, Sensör okumaları vs ekleyebiliriz.






  Umarım , yardımcı olmuştur. 










  


 








Wednesday, February 11, 2015

NodeMCU , Open Source, Open Hardware Iinternet of Things Device

Merhaba ,
IoT ile ilgili her gün yeni bir cihaz, modül vb. donanım çıkıyor. Bunlardan biride NodeMCU platformu .

NodeMCU aslında bir ESP8622 SoC çipi kullanan bir WiFi modül. Tamamen açık kaynak ve açık donanım sahip, farklı firmware yüklemeleri ile farklı fonksiyonları sağlayabilen bir donanıma sahip oluyorsunuz. 

NodeMCU anasayfası,

Donanım ile ilgili tüm dökümanlar,

https://github.com/nodemcu/nodemcu-devkit


NodeMCU cihazınıza modem firmware dosyasını yüklediğiniz zaman , AT komutlar ile çalışan bir WIFI modülünüz oluyor.Bir  Web Server  firmware dosyası yüklediğiniz zaman, çok temel bir web sunucunuz oluyor.Açık kaynak kodlu bir projenin’de tüm güzelliklerini içeriyor. 


Geliştirme ortamı için birkaç kurulum birden yapmak lazım. Malesef tek bir program kurulumu ile geliştirmeye hazır durumu gelmiyor.

Öncelike NodeMCU kullanmak için bir adet Android telefonlar için olan standart USB data kablosuna ( (bendeki samsung) ve CH340 USB seri dönüştürücü sürücüsüne ihtiyacınız var.

Windows 8, FTDI entegrelerinde olduğu  gibi otomatik sürücüleri yüklemedi. Google'dan arayıp güvenilir bir siteden indirebilirsiniz.
Sürücü kurulumu başarılı olduktan sonra, aygıt yöneticisi altında COMX olarak karşınıza çıkacak. Programlamak içinde bu portu kullanacağız. Benim bilgisayarım COM29 olarak gördü.





NodeMCU  ile ilgili iki tip geliştirme ortamı söz konusu,


LUA script ve C,C++ .

LUA script,

Biraz arduino benzeri bir kullanım sağlıyor. LUA ile çalışabilmek için NodeMCU özel bir firmware yüklemeniz gerekiyor. Daha sonra LUA ile , bir script hazırlayıp cihaza yüklüyorsunuz.50 satır vs bir işleminiz var çok kolay ve hızlı bir şekilde bir IoT uygulaması geliştirmenizi sağlıyor. Ama kompleks projelerde işin içinden çıkmak zor olur diye düşünüyorum.  Lua ile herkes bir IoT uygulaması yapabilir gibi. Basit hızlı etkili daha ne olsun.

LUA ile ilgili örneğe başka bir yazıda değineceğim. 


C,C++ ,

ESP8266 ile ilgili tüm registerlara vs ulaşabilmeniz ve kendi firmware veya özel uygulamanızı yapabilmeniz için gerekli olan geliştirme ortamı.

Windows için IDE ve SDK kurulumu ile ilgili, Rus bir yazılımcının sitesindeki adımları takip ettim. Gayet hızlı ve hatasız kurulum gerçekleştirebildim.  
Adımlara gelince, translate ile çevirip burada paylaşıyorum. Rusça-İngilizce-Türkçe Çeviri hataları olabilir.  Temelde indir ve adım adım kur mantığı işe yaradı.

1. Ckachivaem (86Mb) Espressif-ESP8266-DevKit-v1.0.x-x86.exe 
2. 
Download the JRE kurulumu x86 , x64 işletim sisteminize göre seçin (jre-7uXX-windows-i586.exe) 
3. Download the  Eclipse Luna  IDE C ++  kurulumu,  (eclipse-cpp-luna-SR1-win32.zip). Zip dosyasını c’nin altına unzip yapabilirsiniz.
4. Download the and install MinGW. Run mingw-get-setup.exe, Windows için GNU ortamı, GCC derleyici vs içeriyor. C,C++ kodlarının derlenmesi için gerekli.
5. Download the (84Mb) MinGW kurulumunu otomatik hale getirilmiş bir paket. Ben dört adımı kurdukdan sonra bunuda kurdum. 4 kurmadan 5’i de kurabilirsiniz. 5’in içindeki bat dosyasını çalıştırmanız yeterli.

Eclipse IDE yi açtıktan sonra , workspace olarak ,  C: \ Espressif \ examples seçmeniz yeterli.
ESP8266 ile ilgili örnekler Eclipse IDE içerisinde görünecek.


Örnek Olarak ESPHTTPD uygulamasını kullanmak istedim,
Hem Web Server , Hemde Led örneğini içeriyor.
İlk yapmanız gereken projeyi açmak “build” yapmak. Eğer başarılı bir şekilde “build” yapabilirseniz. Yükleme adımlarını doğru bir şekilde yapmışsınızdır.



Daha sonra sağdaki “Make Target” Kısmından, “build” yaptığınız projeyi cihaza yükleyebilirsiniz.



Make target kısmında, birden çok seçenek söz konusu.
-      ALL ( projeyi build ediyor )
-      Clean ( Projede geçici dosyaları temizliyor / Bende bilmiyorum )
-      Flash ( Proje dosyasını Flash içerisine yüklüyor)
-      FlashoneFile ( Tek bir komut ile Hem proje hem HTML kısmını yüklüyor)
-      -htmlFlash ( WEB server içerisindeki HTML dosyalarını Flasha yüklüyor )

Projenizdeki Makefile dosyasında ESP port yazan kısma , USB seri dönüştürücünün aldığı COMXX değerini yazmanız lazım. Benim için bu değer COM29



İşin diğer püf noktası da, Flash yapabilmeniz için NodeMCU üzerindeki Flash Butonuna basılı tutmanız gerekliliği. İçerisindeki MCU bootloader modun da açılmasını sağlıyor. Diğer Türlü bir Flash update yapamıyorsunuz.
·         Butona basılı tutun.
·         Makefile / Flash başlatın.
·         Yükleme İşlemi Başladıktan sonra butonu bırakabilirsiniz.



Yukarıdaki adımları düzgün bir şekilde tamamlarsanız.
Bilgisayarınızda wireless ağları arattığınızda ESPXXX diye bir ağ göreceksiniz. Buda NodeMCU AP modunda çalıştığını göstermekte. Ben SSID ismini değiştirdiğimden farklı görünüyor.


Bundan sonra , hazır yazılım içerisinde bazı değişiklikler yaptım.
SSID ve Passoword değiştirme,

include/user_config.h altında,

#define WIFI_AP_NAME "Veysel_NODEMCU"
#define WIFI_AP_PASSWORD "123456789"


Açılış sayfasını vs değiştirmek için,
HTML klasörü içerinde , index.tpl dosyasında değişiklik yaptım.
FlashHTML ile bu klasör altındaki dosyalar, MCU hafızasına aktarılıyor. ( Normalde FTP ile yaptığımız işlem gibi ) Limitler vs hakkında bir bilgim yok. CCS ile style belirleniyor. Birden çok sayfa olabiliyor.
3 USD bir SoC için daha ne olsun.
Orjinlin de bir kedi resmi vardı. Onu değiştirdim ve bir banner ekledim.
HTML vs Web programcılığı bilgim pek yok. Çok daha etkileyici bir şeyler yapıla bilinir.


Bilgisayarınız ile NodeMCU bağlandığınız zaman,
Adres çubuğuna nodemcu IP adresini yazarsanız (192.168.4.1) karşınıza hazırladığınız index.tpl sayfası geliyor.





İkinci kısım , LED yakıp söndürme işlemi için ise ,

GPIO 2 portuna bir LED bağlamamız gerekiyor.  LED pozitif ucuna bir 120ohm seri direnç bağladım. Negatif ucu ise NodeMCU GND ucuna bağlı.






LED.tpl sayfasından , Butonlara basmanız ile LED durumunu değiştiğini gözlemleyebilirsiniz.




NodeMCU ile ilgili değerlendirmeme gelince,

Daha önceden benzer Wifi Modüller vardı. Fiyat olarak nodemcu maliyetini bir  10 ile çarpmamız gerekiyor. Tüm fonksiyonlar vs karşılaştırma yapmayacağım. SoC olması kendi projenize entegre ederken kolaylık sağlayabilir. İyi bir tekniker, SMD lehimlemesini büyüteç altında rahatlıkla yapabilir. Modül olarakda 3 USD ( Wifi Certificated ) üstelik.
IoT ve Wifi ile ilgili çalışacaksanız kesinlikle alıp denemenizi öneririm. NodeMCU hali ise 15 USD civarlarında.


Umarım faydalı olmuştur. Zaman ayırıp inceleyen herkese teşekkürler.

Friday, April 25, 2014

STM32F103 ile PWM kullanımı

STM32F103  serisi ile iki kanal  PWM uygulama örneği gerçekleştireceğiz.

Uygulamayı CooCox ide ile gerçekleştireceğim. Proje oluşturma adımları , GPIO uygulamasındakine benzer.

PWM çıkışı için Timer3 ve PC6 ve PC7 pinlerini kullanacağım.

PWM kanallarını 4Khz bir sinyal ile süreceğim.
Kanallar bir birine simetrik bir şekilde 0-100 arasında değerlerde değişecek.

CH0  0  ->100 ->0
CH1  100->0 ->100

Her PWM kanalınada bir adet 12V fırçasız motor bağladım. ( Doğrudan mikro işlemci bacağına bağlı değil arada open collector bir transistör sürücü var )

Code kısmına gelince, Aşağıdaki gibi,


 /**  
  *****************************************************************************  
  * @title  EDS1 PWM TEST.c.c  
  * @author Veysel KARADAĞ  
  * @date  24.04.2014  
  * @brief  GPIO Example  
  *******************************************************************************  
  */  
 #include "stm32f10x_rcc.h"  
 #include "stm32f10x_gpio.h"  
 #include "stm32f10x_tim.h"  
 void confPWM(void);  
 void set_duty_PWM(int ch ,int duty);  
 void delay(long int tik);  
 int main(void)  
 {  
      int i=0;  
      int yon=0;  
      confPWM();  
   while(1)  
   {  
        delay(500000);  
        set_duty_PWM(0,i);  
        set_duty_PWM(1,100-i);  
        if(yon==0){  
             i++;  
        }else{  
             i--;  
        }  
        if(i==100){  
             yon=1;  
        }  
        if(i==0){  
             yon=0;  
        }  
   }  
 }  
 /*******************************************************************************  
 * Function Name : confPWM  
 * Description  : PWM 1-2 kanalı 4Khz kurar  
 *                      : PB0,PB1  
 * Input     : None  
 * Output     : None  
 * Return     : None  
 *******************************************************************************/  
 void confPWM(void){  
       GPIO_InitTypeDef GPIO_InitStructure;  
       TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;  
       TIM_OCInitTypeDef TIM_OCInitStruct;  
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE );  
       RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 , ENABLE );  
       GPIO_StructInit(&GPIO_InitStructure);                           // GPIO yapısını Resetler  
       GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);  
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;       // Pin6 ve Pin7 Seçilir.  
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      // Push Pull olarak set edilmesi ayarlanır.  
       GPIO_Init( GPIOC, &GPIO_InitStructure );                          // GPIOC yukarıdaki ayarlara göre Set edildi.  
       // Let PWM frequency equal 100Hz.  
    // Let period equal 1000. Therefore, timer runs from zero to 1000. Gives 0.1Hz resolution.  
    // Solving for prescaler gives 18. ( Frekans = 72Mhz/1000/18)  
    TIM_TimeBaseStructInit( &TIM_TimeBaseInitStruct );  
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV4;  
    TIM_TimeBaseInitStruct.TIM_Period = 1000-1;                 // 0..999  
    TIM_TimeBaseInitStruct.TIM_Prescaler = 18-1;                     // Div 18-1  
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStruct );  
    TIM_OCStructInit( &TIM_OCInitStruct );  
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;  
    TIM_OCInitStruct.TIM_Pulse = 500;                               // 0 .. 1000 (0=Herzaman kapalı , 1000= Herzaman Açık) %25  
    TIM_OC1Init( TIM3, &TIM_OCInitStruct );  
    TIM_OC2Init( TIM3, &TIM_OCInitStruct );  
    TIM_Cmd( TIM3, ENABLE );  
 }  
 /*******************************************************************************  
 * Function Name : set_duty_PWM  
 * Description  : setup duty cycle pwm cH0/1  
 * Input     : int ch and duty ( ch:0/1 duty 0-100)  
 * Output     : None  
 * Return     : None  
 *******************************************************************************/  
 void set_duty_PWM(int ch ,int duty){  
      switch(ch){  
      case 0:  
           TIM3->CCR1 = duty*10; // SET Duty CH0 %X  
      break;  
      case 1:  
           TIM3->CCR2 = duty*10; // SET Duty CH1 %X  
      break;  
      default :  
      break;  
      }  
 }  
 /*******************************************************************************  
 * Function Name : delay  
 * Description  : delay sistem tik  
 * Input     : long int delay tik  
 * Output     : None  
 * Return     : None  
 *******************************************************************************/  
 void delay(long int tik){  
      int i=0;  
      for (i=0;i<tik;i++);  
 }  



Program Çalıştığında PWM çıkışları aşağıdaki gibi oluyor. Video olan dosyada delay süresini biraz uzattım. Delay az olunca fanın yavaşladığı belli olmuyordu.








Thursday, April 24, 2014

STM32 Discovery / Atollic Suite Sample Project



Atollic TrueSTUDIO (TS) , GCC tabanlı Eclipse IDE kullanan , ARM mikroişlemciler için geliştirilmiş bir derleyici. Detaylı bilgileri aşağıdaki linkten bulabilirsiniz. 



Bu yazıda STM32VL Discovery ile UART ve LED leri kullanmak hakkında bir şeyler paylaşacağım.

Öncelikle TS programını Atollic web sayfasından indirip kurulumunu yapmamız gerekiyor. Kurulum ile ilgili dokümanlar Atollic web sayfasında var.

Yeni proje başlatmak için ,

File / New / C Project  seçiyoruz.

Gelen pencerede projemize isim verip, Embedded C Project ve Atollic ARM Tools seçiyoruz. Sonra NEXT..


Gelen pencereden (Build setting) , İşlemci , Development Board seçeneklerinden kendi boardumuzu seçiyoruz. Bu seçin sayesinde , derleyici işlemcimizin  ROM ve RAM yapısını , bazı start up dosyalarını hazırlıyor.  Eval board seçtiğimiz için board üzerindeki led button gibi pinler içinde gerekli dosyaları hazırlıyor.





Resimdeki seçenekleri işaretleyip Next diyoruz....

Bir sonraki pencere Debug ile ilgili araçları seçmemize yarıyor.  Discovery üzerinde  debugger olarak Stlink sabit olduğundan ST-Link Seçili olmalı.  Sonrasında yine Next diyoruz. Bir sonra gelen pencereyede next diyeceğiz.. Runtime library seçeneklerinde Use tiny printf... seçili olmalı.




TS , discovery board üzerinde User butonuna basıldığında Toggle yapan bir örnek programı ( Discovery Board ile gelen default Program) hazırlıyor.

Buid all yapıp derleme işleminden sonra , Debug yaparak programı STM32 Discovery board a yükleyip, kurulumun , ST link driverlarının doğru bir şekilde yapıldığını test edebilirsiniz.

TS , projeyi hazırlarken , başka eval boardlar ile ilgili tanımlamaları da #ifdef ifadeleri ile main dosyasına ekliyor. Yeni başlayanlar için kafa karıştırıcı geldi bana .. Bu yüzden ben gereksiz gördüğüm bu satırları sildim.  Proje dosyasını paylaşacağım için burda bütün kodu yazmıyorum. Kısaca Main.c dosyası aşağıdaki gibi oluyor.




#include <stddef.h>
#include "stm32f10x.h"
#include "STM32vldiscovery.h"  

// Değikenleri tanımla..

int main(void)
{

  // GPIO kur
  // USart Kur
  while (1)
  {
      // Program..

     }
}


İşlemcinin , hangi portun IO , hangi portun USART olduğunu anlayabilmesi için gerekli olan tanımlamalar. "STM32vldiscovery.h" dosyasında belirtilmekte. Bu dosyaya erişmek için sol CTRL tuşuna basılı tutup main.c dosyasında   üzerini tıklamanız yeterli olur.

"STM32vldiscovery.h" içeriğinde ise Discovery Board üzerinde bulunan Led ler ve buton için gerekli tanımlama satırlarını görebiliriz. Bu tanımlamalar , programda kullanmak isteğimiz tanımları ve buna karşılık Standart STM32 kütüphanelerinde olan karşılıklarını içeriyor.

Örneğin, Discovery üzerinde LED için ( yeşil olan) yapılmış tanımlamalar. PIN, port ve clok için , standart kütüphanede ( örn , stm32f10x_rcc.h) dosyasındaki karşılıklarını içeriyor.

#define LED3_PIN                         GPIO_Pin_9 
#define LED3_GPIO_PORT                   GPIOC
#define LED3_GPIO_CLK                    RCC_APB2Periph_GPIOC


STM32vldiscovery.h ve C dosyaları  TS tarafından , build setting adımında STM32VLDiscovery boardu seçtiğimiz için TS tarafından projeye eklendi.

STM32vldiscovery.h ve c dosylarında aynı zamanda GPIO hazırlamak ve kullanmak için gerekli olan tanımlamalar ve fonksiyonlar bulunmakta.

Main.c de bu fonksiyonları çağırarak. STM32 çevre birimlerini aktif hale getiriyoruz.

Seri Port , entegrasyonu içinse GPIO lar gibi bir hazırlama ve kullanma işlemleri gerekli. Discovery board üzerinde , donanım olarak bir RS232 port olmadığından TS seri port için gerekli tanımlamaları ve fonksiyonları STM32vldiscovery.h ve .c  dosyalarının içerisine eklemiyor.

Bu yüzden , benzer başka bir örnek projeyi açıp oradan gerekli satırları kopyaladım.  Bana en uygun olarak (STM3210E-EVAL_XL_USART_Printf) projesini uygun gördüm.  Bu projedeki, stm3210e_eval.h ve c dosylarını açtığımızda aşağıdaki tanımlamaları göreceğiz.


/** @addtogroup STM3210E_EVAL_LOW_LEVEL_COM
  * @{
  */
#define COMn                             2

/**
 * @brief Definition for COM port1, connected to USART1
 */
#define EVAL_COM1                        USART1
#define EVAL_COM1_CLK                    RCC_APB2Periph_USART1
#define EVAL_COM1_TX_PIN                 GPIO_Pin_9
#define EVAL_COM1_TX_GPIO_PORT           GPIOA
#define EVAL_COM1_TX_GPIO_CLK            RCC_APB2Periph_GPIOA
#define EVAL_COM1_RX_PIN                 GPIO_Pin_10
#define EVAL_COM1_RX_GPIO_PORT           GPIOA
#define EVAL_COM1_RX_GPIO_CLK            RCC_APB2Periph_GPIOA
#define EVAL_COM1_IRQn                   USART1_IRQn

/**
 * @brief Definition for COM port2, connected to USART2
 */
#define EVAL_COM2                        USART2
#define EVAL_COM2_CLK                    RCC_APB1Periph_USART2
#define EVAL_COM2_TX_PIN                 GPIO_Pin_2
#define EVAL_COM2_TX_GPIO_PORT           GPIOA
#define EVAL_COM2_TX_GPIO_CLK            RCC_APB2Periph_GPIOA
#define EVAL_COM2_RX_PIN                 GPIO_Pin_3
#define EVAL_COM2_RX_GPIO_PORT           GPIOA
#define EVAL_COM2_RX_GPIO_CLK            RCC_APB2Periph_GPIOA
#define EVAL_COM2_IRQn                   USART2_IRQn


/** @defgroup STM3210E_EVAL_LOW_LEVEL_Exported_Functions
  * @{
  */
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct);

stm3210e_eval.h dosyasındaki bu tanımlamaları, STM32vldiscovery.h içerisine ve
stm3210e_eval.c dosyasındaki ,aşağıdaki tanımları ve fonksiyonu  STM32vldiscovery.c dosyası içerisine kopyalıyoruz.


USART_TypeDef* COM_USART[COMn] = {EVAL_COM1, EVAL_COM2};

GPIO_TypeDef* COM_TX_PORT[COMn] = {EVAL_COM1_TX_GPIO_PORT, EVAL_COM2_TX_GPIO_PORT};

GPIO_TypeDef* COM_RX_PORT[COMn] = {EVAL_COM1_RX_GPIO_PORT, EVAL_COM2_RX_GPIO_PORT};

const uint32_t COM_USART_CLK[COMn] = {EVAL_COM1_CLK, EVAL_COM2_CLK};

const uint32_t COM_TX_PORT_CLK[COMn] = {EVAL_COM1_TX_GPIO_CLK, EVAL_COM2_TX_GPIO_CLK};

const uint32_t COM_RX_PORT_CLK[COMn] = {EVAL_COM1_RX_GPIO_CLK, EVAL_COM2_RX_GPIO_CLK};

const uint16_t COM_TX_PIN[COMn] = {EVAL_COM1_TX_PIN, EVAL_COM2_TX_PIN};

const uint16_t COM_RX_PIN[COMn] = {EVAL_COM1_RX_PIN, EVAL_COM2_RX_PIN};


/**
  * @brief  Configures COM port.
  * @param  COM: Specifies the COM port to be configured.
  *   This parameter can be one of following parameters:   
  *     @arg COM1
  *     @arg COM2 
  * @param  USART_InitStruct: pointer to a USART_InitTypeDef structure that
  *   contains the configuration information for the specified USART peripheral.
  * @retval None
  */
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM] | RCC_APB2Periph_AFIO, ENABLE);

  /* Enable UART clock */
  if (COM == COM1)
  {
    RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
  }
  else
  {
    RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
  }

  /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);

  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
  GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);

  /* USART configuration */
  USART_Init(COM_USART[COM], USART_InitStruct);
   
  /* Enable USART */
  USART_Cmd(COM_USART[COM], ENABLE);
}

Kopyalama işlemleri bittikten sonra , main.c içerisinde Ledleri ve USART birimini STM32vldiscovery_LEDIni() ve  STM_EVAL_COMInit(COM1, &USART_InitStructure) fonksiyonlarını kullanarak hazırlıyoruz.



Daha sonra PA9 ve PA10 pinlerine bağladığımı Level Transreciver devresi ile STM32VL Discovery boardumuzdan Bilgisayarımıza bağlıyoruz. Hyper Terminal penceresinde , i değişkeninin butona bastığımız andaki değerini seri porta göndermekte.  

Programda , printf fonksiyonunu da kullanabiliyoruz. Programımız içerisinde bununla ilgili tanımlamaları Atollic project wizardı kullanırken runtime library seçeneklerinde tiny printfin işaretli olması lazım. Proje dosyasını linkten indirebilir siniz.

 Proje Dosyası,