STM32 ile Program yapmaya başlamak.

STM32 bugüne kadar elime almadığım, ilgilenmediğim bir işlemcidir. Hatta C dilini de hiç bilmem. Sadece Arduino kullanımından gelen bir aşinalığım var. Bundan dolayı başlarken birçok kişinin tavsiyesine başvurdum. Bunun yanı sıra adapte olmak için uzun saatler araştırma yapmak zorunda kaldım. Sizler de başlarken bu kadar yoğun çaba sarf etmeyesiniz diye, tecrübelerimi paylaşmak istedim. Bu yazıyı STM32 konusunda yeni başlayan birisinin yazdığını unutmayın.
İlk yapacağınız araştırmaları, en aza indirmek ve başlangıcınızda size yol göstermek için yazdım.

Öncelikle videoda anlattım ama burada da anlatmak istediğim stm32 kartlarıdır. Birçok stm32 işlemcisi olmasına rağmen stm8 işlemcilerde piyasa da mevcut. Fakat örnekler genelde stm32 üzerine verildiğinden STM8 almanızı TAVSİYE ETMİYORUM. Zaten aldığım STM32 demo board da çok pahalı değil.

LINK/V2(CN) LINK STLINK STM8 STM32 Programlayıcı (benim aldığım yerde kalmamış)
https://urun.n11.com/arduino-urunleri-ve-setleri/linkv2cn-link-stlink-stm8-stm32-programlayici-P419267249

STM32F030F4P6 Geliştirme Kartı STM32 yi aldığım yer burası. Daha ucuz yerlerde var.


https://urun.n11.com/arduino-urunleri-ve-setleri/stm32f030f4p6-gelistirme-karti-P476833661

Karşılaştırma yaparsak en ucuz PIC16F1827 smd tip entegre almak isteseniz 12-13 TL. Bunun yerine STM32 demo board alsanız 14TL den başlayan fiyatlar var.

Arduino nano bile alsanız 20 TL den başlıyor. Bence piyasa fiyatlaması olarak STM32 rekabetçi fiyatlarıyla kullanılmaya değer bir işlemci.

Başlarken IDE sorunu vardı. Öncelikle C derleyiciler devreye giriyor. Fakat Arduino IDE gibi kolay bir IDE başlamamı kolaylaştıracaktı. Ayrıca PIC işlemcilerde ve Arduinoda olmadığı bir şekilde ön hazırlık gerekiyordu. PIC işlemcilerde de pimlerde birkaç görev olmasına rağmen kolaylıkla hakim olabildiğim bir kullanım vardı. Belki de datasheet okumak bunu kolaylaştırıyordu.
STM32 de hiç entegre datasheetine bakmadan hiçbir şey bilmeyen biri gibi başladım. Önce program nasıl yapılır diye baktım. Kart ve programlayıcıyı buldum, bilgi edindim. Ama IDE konusunda çeşitli tavsiyeler vardı. Bunları teker teker indirdim yükledim.
Fakat hiç biri daha önce öğrendiğim metotlara benzemiyordu.
Benzemiyordu fakat öğrenince ne kadar kolaylaştırdığını da görmüş oldum. PIC programlarken her birinin sigorta ayarlarına kadar kendim bulup yazmak zorunda kalıyordum.
Bu kadar programı denerken birileri CUBE IDE programını kullan başka bir şeye ihtiyacın yok dedi. Dediği doğruydu. CUBE IDE önce grafik ortamda entegre resmi üzerinde bize istediğimiz bacakları ayarlamaya izin veriyor, Saat frekansını ve diğer ayarları kolaylıkla yapmamızı sağlıyordu.
Bunları yaptıktan sonra SAVE ALL dediğimizde bizim için tüm ayarladıklarımızı bir program haline getirip bize sunuyor.

Artık bundan sonra istediğimiz alanlara kendi programımızı yazmak kalıyordu.
Buraya kadar her şey kolay gibi. C programlama dilini biliyorsanız, bundan sonrası da sizin için kolay olacaktır. Fakat benim C bilgim yoktu.

Bir yandan işlemciyi tanımıyorum bir yandan da C bilgim yok. Ne kadar zorlandığımı tahmin edersiniz. Fakat tüm dünya, internet sayesinde, öğretici dokümanlarla dolu. Ayrıca bol miktarda örnek var. Bunların yanı sıra yardımcı olan birçok kişi var. Bunlarla başladığım zaman yapılmayacak bir şey yok dedim.

Programlama geçmişim olduğundan algoritma sorunum yok. Ne istediğimi biliyorum. Ayrıca birçok programlama dili, benzer ihtiyaçları karşılıyor. Yani hepsinde if else , for next gibi tanıdık komutlar var. Sadece C diline özgü yazma stilleri var. ARDUINO programlama yaptıysanız bu yazılım şekillerine de alışkın oluyorsunuz. Geriye kalan, birkaç kütüphanedir.
Bende de böyle oldu. Her yeni öğrenen gibi, bir adet LED yakmak, yanında 1 BUTON kullanmak, sonrasında bir de UART dediğimiz RS232 haberleşmesi yapmak başlangıç için yeterdi.

Benim bu işlemciye ilgim ise, bugüne kadar örnek dahi yapmamış olmamdan kaynaklanıyor. Kendi tasarladığım modül olan EASYLCD modül, RS232 haberleşme ile karakter LCD lerin kullanılmasını kolaylaştıran modüldür. Bu modül için Raspberry pi (python) ile bile örnek yapmışken, STM32 ile nasıl yapamam dedim. EASYLCD modülü detaylı olarak tanımak isterseniz buraya bakabilirsiniz.

Bu şekilde STM32 yolculuğu başladı.
LED kullanmak, Buton kullanmak çok kolay oldu. Fakat UART kullanmak beni çıldırttı diyebilirim. Tabii ki bunu bir önyargıya bağlıyorum. Bugüne kadar örnek yaptığım programlarda ve dillerde sorunsuz UART (RS232) kullanımı var. STM32 de ise transmit dediğimiz, bilgi göndermek çok kolay. Fakat RS232 üzerinden bilgi almak oldukça zordu.
Bunun zor olması. İnterrupt (kesme) ile kullandığımda gelecek olan karakter sayısının belli olma şartı ve bu beni şaşırttı.  Ne geleceğini bilip ona göre şu kadar karakter al diyorsunuz. Bu durum, bazı zamanlarda gelecek olan karakter sayısının değişmesi, programda değişiklik ya da önceden ayarlama yapılması gerektiriyordu.
Ben programda 5 karakter bilgi alacağım için zorluk yaşamadım.
Fakat şöyle düşünün. Bir sıcaklık değeri alacaksınız. Bu değer 9 ise sorun olmuyorsa 10 olduğunda karakter sayısı fazla olduğu için 9 karakterini 09 şeklinde almanız gerekecek. Dediğim gibi bu da önceden bazı ayarlamalar yapmanızı gerektiriyor.
Ayrıca, diğer kullandığım işlemcilerde, gelen bilgilerinin tutulduğu buffer dediğimiz tampon bellek bir kere bilgiyi başka değişkene aldığınızda, boşalması gerekir. Fakat bu işlemci de böyle olmuyor.
Mesela REC_DATA gelen bilgileri alan değişken olsun. 5 karakter aldınız. Ve bu 5 karakteri başka bir değişkene aktarıp kullandınız. Fakat REC_DATA değişkeni sıfırlanmadığı için hala sanki aynı bilgi devamlı geliyormuş gibi oluyor.
Bu da bir bayrak kullanımıyla çözümleniyor. Bayrak durumuna göre ayrım yapılarak programda kullanılıyor. Bilgi ilk geldiğinde bayrak 1 kez HIGH değerini alır. Sonrasında bilgiyi aktardıktan sonra LOW durumuna ayarlarsınız. Yeni bilgi gelmeden HIGH durumuna geçmez. REC_DATA aynı bile kalmış olsa artık sorun yaratmayacaktır. ( Bu konu için programda intflag değişkenine bakın )

Şunu da unutmayalım ki. Ben bu işi daha yeni öğreniyorum. Bundan dolayı karakter sayısını ve devamlı aynı bilginin gelmiş gibi görünmesini, ustalar kendi programlarında nasıl çözeceklerini biliyorlardır.
Daha sonraki araştırmalarımda ise interrupt (kesme) olmadan 1 karakter alıp devamlı bir dizi içerisinde bu karakterleri toplayarak 20 karakterlik bilgi okuyabildim. (kesme olmadan. Örnek program intsiz dir.)

Demek ki keşfedilecek birçok algoritma var. UART ta gördüklerim gibi farklılıklar diğer haberleşme sistemlerinde de karşınıza çıkabilecektir.
Artık 2 çeşit RS232 haberleşmesini kolaylıkla yapabiliyorum. Bunlar için yaptığım örnek dosyaları TÜM DOSYALAR kısmından alabilirsiniz.

3 adet program mevcut.
Bunlardan biri LED+BUTON+RS232 haberleşme programı.
Diğeri İnterrupt ile RS232 haberleşmesi ve EASYLCD modülün kontrolü.
3. Program ise interrupt olmadan RS232 haberleşme ve EASYLCD modülün kontrolüdür. (20 karakter alım yapılabiliyor.)

STM32 kartınızı ve programlama cihazınızı aldıktan sonra videoda dikkat çektiğim gibi kart üzerindeki jumper’ın yerini kontrol etmelisiniz. Resimde görüldüğü gibi olacak. Belki de geldiğinde böyledir hiç değiştirmeyin. Çünkü ikilemde kaldığım konulardan biri de buydu. Acaba programlama yaparken hangi tarafta olmalı düşüncesi. Videolarda gördüğüm kadarıyla, resimde ve videoda görüldüğü şekilde doğrudur. Tabii ki kart, aynı kart ise bu şekildedir. Değilse enerji vermeden kartınızı tanıyın derim.

Bu kart ve sanırım tüm stm32 kartları 3.3V ile çalışıyor. Bundan dolayı çevre elemanları bağlayacaksanız bunları 3.3V uyumlu seçmeniz yerinde olur. Ya da araya 5V –  3,3V seviye dönüşümü yapmanız gerekecektir. Ben RS232 ile PC ye bağlamak için FT232RL USB seri çevirici kullanıyorum. Bu kartın üzerinde 5V ve 3,3V jumper ayarı var. Bunu 3,3V kısmına getirmeniz gerekiyor. Yoksa kartınız bozulabilir.

Seviye dönüşüm devre resmi.
Sağ kısım STM32 sol kısım ise STM8 için kullanılmaktadır.

Ayrıca LINK/V2(CN) LINK STLINK STM8 STM32 Programlayıcıyı kullanırken dikkat etmeniz gereken noktalar var.

Bu programlayıcı da pim isimleri, metal kılıfın üzerinde görülüyor. Fakat metal kısım ters takılabilen bir kılıfmış. Bundan dolayı uyarıyorlar. Soketin kertik noktası ile metal kılıftaki resim birbirine uymalı. Programlayıcı USB ye takıldığında üst tarafta bir Led yanmış olmalı. Bunlara dikkat etmeniz gerekiyor.

Programlayıcı üstünde ise hem stm8 hem de stm32 için pimler var.  Bundan dolayı kartınıza uygun olan kısmı kullanacaksınız. Kart üzerinde aynı pim isimlerine rastlayacaksınız. Bunları eşleştirirsiniz.

Bununla birlikte, bu programlayıcı STM32 kartının besleme gerilimini de sağlıyor. Bundan dolayı denemelerinizde bu programlayıcıdan gelen gerilim ile motor gibi akım çeken bir şeyler çalıştıracaksanız hem kart arızalanabilir hem de programlayıcı arızalanabilir. Bunu engellemek için OUT kısmında ya da INPUT kısmında yüksek akım çeken devreler için optokuplör ya da transistör kullanabilirsiniz.

Mesela videoda gördüğünüz gibi EASYLCD kontrolü yaparken LCD nin akımını programlayıcı karşılayamaz diye düşündüğümden, EASYLCD modülünü powerbank ile besledim. Bu şekilde besleme yapıldığında ise GND leri birleştirmeniz gerekiyor. Ben birleştirdiğimde PC ile powerbank arasında GND den dolayı etkilenme yaşandığından araya 1 adet diyot bağladım sorun kalmadı. Sizlerde de bu şekilde GND birleştirildiğinde etkileme problemi olursa 1 adet diyot ile sorunu çözebilirsiniz.

Benim ilk etapta anlatabileceklerim bunlar. Unutmayın bu yazıyı, profesyonel stm32 programcısı olarak değil, ilk başlayacak olanlara, yeni başlayan birinden tavsiye olsun diye yazdım. Size başlangıcınızda yol göstermesini umuyorum.

Son bir tavsiye 1. Videoyu seyrettikten sonra yazıyı bir kez daha okuyun. Çünkü bazı şeyleri videoda gördükçe, yazıyı daha iyi anlarsınız.

CUBE IDE size ayarlarınızın içinde bulunduğu bir program oluşturacaktır. Bu programda sizin değiştireceğiniz yerler belirtilmiştir.
/* USER CODE BEGIN xxx */

/* USER CODE END xxx */

Yukarıdaki gibi program içerisinde birçok yer ayrılmıştır. Mesela xxx yerinde include kelimesi görürseniz, eklemek istediğiniz kütüphaneleri buraya ekleyin demektir.
Bunun nedeni ise, programınızı herhangi bir yere yazmaya başladıktan sonra, entegre üzerinde bir şeyi değiştirdiniz ve yeniden program oluştur dediniz, sonradan eklediğiniz satırlar silinecektir.
Yazdığınız programı, yeniden kod oluşturulduğunda silinmesin diye USER begin ve USER end satırları arasına yazmanız gerekiyor. Bu şekilde yazdığınızda, CUBE IDE bu kodların sizin yazdığınız kod olduğunu anlar ve yeniden kod oluşturduğunda bu kodlarınızı aynı şekilde korur.
( 1. Videoda bunun denemesini gösterdim. )

Aşağıdaki linkte CUBE IDE resimli kullanımı var. Burada bölümler belirtilmiştir.
Cubeide kullanımı http://www.emcu.eu/first-embedded-program-for-stm32-mcu-using-stm32cubeide/

CUBE IDE, HAL kütüphanesi üzerine kurulmuş görünüyor. Tabii ki siz isterseniz başka kütüphaneler de kullanabilirsiniz. Ben kolaylık olsun diye HAL kütüphanesi kullandım.
Program kodunuzu yazarken HAL_ yazdıktan sonra CTRL+SPACE tuşlarına bastığınızda size HAL kütüphanesinin komutlarını bir pencerede gösteriyor, istediğinizi seçebiliyorsunuz.

Arduino programını yazanlar bilirler. Programda 3 bölüm vardır.
1. bölüm kütüphaneleri ve değişkenleri belirttiğimiz void Setup() tan önceki bölümdür. Bu bölüm STM32 de ilk satırdan, int MAIN void satırına kadardır.
2. Bölüm void setup() bölümüdür burada seri port ya da diğer başlangıç satırları vardır. Parametrelerin başlangıç değerleri yazılır.
Bu bölüm CUBE IDE programında int MAIN void kısmından başlar ve WHILE loop döngüsüne kadar gider.
3. Bölüm ise arduinodaki void loop() kısmıdır. CUBE IDE ise bu sonsuz döngüyü, WHILE komutuyla sağlamış.
Programınız içerisinde
/* USER CODE BEGIN 3 */

/* USER CODE END 3 */
satırlarının arasına kodlarınızı yazabilirsiniz. Devamlı tekrar eder.

Birinci Videoda bu konuda anlattıklarımı gördüğünüzde, daha iyi algılarsınız.

Ayrıca CUBE IDE programı, sizin programınızı direkt olarak kartınıza yükleyip çalıştırmanızı sağlamanın yanında, DEBUG denilen HATA AYIKLAMA modunu da sunar. Bu mod da iken, incelemek için programın herhangi bir yerde geçici durmasını isteyebilirsiniz. Bunu yapmak için istediğiniz satırı seçin ve sol tarafındaki mavi bant üzerinde çift tıklayın. Bu toggle breakpoint adında bir nokta belirtecektir. DEBUG moda çalışırken program bu satıra geldiğinde durduracak ve değişken değerlerini inceleyebileceksiniz. Bunun yanı sıra STEP (adım adım ) çalıştırma butonuyla satırları tek tek çalıştırabileceksiniz. Ya da RESUME komutuyla programın çalışmasına devam edeceksiniz. Unutmayın program çalışsa bile toggle breakpoint silinmediği sürece devamlı o satırda duracaktır.
Faydalı bir özellik. Diğer kullandığım kartlarda ya da entegrelerde hata ayıklama için seri port kullanıp, değişken değerlerini seri porttan inceleyerek buluyordum. STM32 de ve CUBE IDE üzerinde bu işlemler çok kolay. Bu kolaylığı proteus üzerinde çalışırken kullanıyordum. Çok faydalı oluyordu. Burada da çok faydasını gördüm.

Birazda kullandığım string.h kütüphanesinden söz edeyim. Öncelikle seri port üzerinde bilgileri ASCII olarak göndermeniz gerekiyor. Bu bilgileri gönderirken tek bir değişkende toplamak ya da hex sayı, string ve decimal sayıları tek bir değişkende toplamanız gerekebiliyor.
sprintf bu açıdan faydalı bir komut. Örnek program içerisinde göreceksiniz.
Ayrıca aşağıdaki linkten kullanımını öğrenebilirsiniz.

Sprintf fonksiyonunun kullanımı. Bu size birkaç diziyi ya da veriyi tek bir dizi içerisinde birleştirmenizi sağlar. Bu şekilde tek bir komutla, birleşik diziyi rs232 ile göndermenizi sağlar. Kullanılan parametreleri de burada bulabilirsiniz.
https://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm

Bunun yanı sıra seri port üzerinden gelen bilgiyi doğru mu diye kontrol etmem gerektiğinde
if (strcmp((uint8_t *)rec_data, “LCD R”) == 0) gibi bir komut ile veya strcat gibi bir komut ile karşılaştırma yapabiliyoruz.

Bunun yanı sıra arduinoda indexOf() komutu ya da basic komutlarda instring diye geçer. Bir dizi içerisinde bir karakter ya da bir string aranır. Bulunursa p değeri  bulunulan karakterin kaçıncı karakter olduğunu gösterir. Burada ise bu komut,
p= strstr (rec_data,”LCD-R”); gibi kullanılır. Bu da bizim RS232 den gelen bilgiyi karşılaştırmamızı sağlar.

Bunun gibi string.h kütüphanesine ait diğer komutları ise bu web sayfasından görebilirsiniz. Kullandığım string.h Kütüphanesinin açıklamaları bu linktedir. RS232 de göndereceğimiz bilgiler için bu kütüphane işinizi kolaylaştıracaktır.
https://www.bilgigunlugum.net/prog/cprog/c_stdkut/string

Benim kullandığım CUBE IDE versiyonu 1.5.0.  Aşağıdaki siteden alabilirsiniz. İşletim sisteminize göre seçip yükle dediğinizde ise, sizden e-mail istiyor. E-mail ile download linkini gönderiyor. Ücretsiz olarak indirebiliyorsunuz.
https://www.st.com/en/development-tools/stm32cubeide.html

BU VERDİĞİM KOMUT ÖRNEKLERİ ÖRNEK PROGRAMDA KULLANILANLARDAN BAZILARIDIR. OLMASI GEREKEN C DİLİNİN ÖĞRENİLMESİDİR.

Programları TÜM DOSYALAR kısmından alabilirsiniz.

Şayet STM32 üzerinde çalışmış ustalar, programları geliştirmek adına bilgi vermek isterse Lütfen yorum kısmına yazsınlar ki, bizler de tecrübelerinden faydalanalım. 

1-) video : CUBE IDE kullanılması ve yeni program oluşturma. 

2-) video : İnterrupt (kesme) kullanılarak ve kullanılmadan Proteus üzerinde EASYLCD haberleşmesi 

3-) video : Gerçek EASYLCD üzerinde örnek programların kullanılması. 

4. video : STM32 ve EASYLCD ile LCD ye ne kadar hızlı yazabilirsiniz. 

 

1 Comment

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.