STM8S Modülü ile Programlamaya Başlamak

STM8S103F3 modülü ile ilk program tecrübelerim.

Her yeni programlama dili ya da ilk kez kullandığım kontrolcüleri programlarken, ilk yaptığım program LED çıkışı, Buton Girişi, bir de UART rs232 seri haberleşmesi olur. Bunları başardıktan sonra ilk girişi yapmış olurum.

STM8S103F3 modülü ile de aynısını yaptım. C programlama dili tecrübem çok az olduğundan ve bu entegreye de hakim olmadığımdan araştırma sürem biraz uzun oldu.

Bu entegreden önce STM32 ile bir deneme yaptım O da ilk STM32 programımdı. Buradan o yazıma da ulaşabilirsiniz.  https://www.mikrobotik.com/wp2/2021/03/19/stm32-ile-program-yapmaya-baslamak/

Test indicator ledi portB 5. bit ucuna bağlıdır. Led yanıp sönmesini görmek isterseniz ek olarak led bağlamaya gerek kalmadan bu ledi test amaçlı kullanabilirsiniz. Ayrıca sağ tarafta power pimleri bulunuyor. bunlar için 4,5-15V denmiş. Fakat size tavsiyem bu gerilimin 9V tan yukarı kullanılmaması. Sebebi ise 3V3 regüle entegresi üzerinde 3V3 ten sonrası kalacak bir de akım çekmeye başladığınızda bu daha da ısınacak kartınızı bozabilir. Mümkünse 5V ile çalışın ya da 15V luk geriliminiz varsa 7805 gibi bir regülatör ekleyerek 5V ta düşürüp karta verin. Küçük denemelerde bir şey olmayabilir ama uzun süreli denemelerinizde kart ısınır bu entegreye yansır.

Öncelikle IDE kısmını gözden geçirelim. STM32 için CUBE IDE stm32 idesini kullanmıştım. Bu ide içerisinde, entegre üzerindeki bacakları ve isimleri ayarlıyordum, Clock ayarlarını görsel yapabiliyordum. Sonrasında bana programımı yazabileceğim her şeyi kendi hazırlıyordu ben de gerekli yerlere programımı yazıyordum. Oldukça kolay bir başlangıç aşamasıydı.
STM8 de CUBEMX var fakat sadece entegre üzerinde pim ayarlamalarını gösteriyor, programlamaya dair yardım etmiyordu.

IAR ide ise program yapabileceğim bir yerdi. CUBEMX kısmını sadece entegre ve pim görüntüsünü görmek için kullandım. Fakat kullanmanız gerekmiyor.
Bunun yerine IAR IDE yi kullandım. STM8 için STVD ve cosmic gibi ideler de kullanılıyor bazı örnekleri o şekilde yapılmış olarak görebilirsiniz.
IAR, programın başında hazırlık kısmında yardımcı olsa da ana programı sıfırdan yazmamız gerekiyor. IAR da Project/options menüsünde entegremizi seçiyoruz. Sonrasında ise menünün debug kısmında  ST-LINK programlayıcı ve debug adaptörü seçiyoruz.
Programımızı başlangıçta kaydediyoruz. ( Burada önemli bir yer var. Program 1 kez kaydedildiğinde o dizin ismi de kaydedildiği için o dizin ismini değiştirmeniz durumunda program hata verebilecektir. ) (Aynı arduinoda olduğu gibi )

Sonrasında main.c yi yazmaya başlıyorsunuz. Kütüphaneleri dahil ettiğinizde ve kayıt ettiğinizde kütüphaneleri dosyalar kısmında görebilirsiniz. Kütüphaneleri önce kendi dizininde arıyor. Orada bulamazsa IAR kütüphanesinde arıyor bulamazsa hata veriyor. Bundan dolayı ben kullandığım kütüphaneleri programın bulunduğu dizine koydum. Çünkü standart kütüphane değildi. İçeriğinde bazı yerleri değiştirmiştim.
Sizler de kullanacağınız kütüphaneleri programın bulunduğu dizine koyarsanız iyi olur. Paylaştığınızda, paylaştığınız kişi programınızı kolaylıkla çalıştırır.

Bendeki STM8S103F3 modülü 3.3V ile çalışıyor. STM8 ler 3.3V ile çalışıyor. Bundan dolayı üzerinde 3.3V regülatör koymuşlar. Devrelerinizi mümkünse 3.3V ile çalıştırın ya da GPIO bağlantılarınızda LEVEL SHIFTER denilen seviye çevirici devre kullanmanız gerekebilir. Ben seri haberleşmeyi FT232RL kartımla yaparken kartın üzerinde bulunan jumper dediğimiz kısa devre telini 3V3 kısmına yerleştirdim haberleşme 3.3V seviyesinde olsun diye. Modül üzerindeki USB soket sadece POWER soketidir. USB üzerinden 5V ile besleme yapmaya yarar. Data gönderim ya da programlama kısmına yaramaz.

Programlamada, İlk önce UART seri haberleşmeyi yapayım nasıl olsa LED ve Buton kolaydır dedim. Fakat öyle olmadı. Önce örnekler üzerinden STM8S.H kütüphanesiyle seri haberleşmeyi oluşturdum. Tabii ki bu arada öğrendiğim ilk şey, örnekleri alıp deneyecekseniz, kütüphanesiyle birlikte almanız gerekliliği oldu. Elimde 1 den fazla stm8s.h kütüphanesi var ve bunlar birbirinden farklıydı.
UART haberleşmesi için bulduğum 1 örneği geliştirerek kendi istediğim haberleşme sistemine çevirdim. Sonrasında artık GPIO dediğimiz giriş çıkış pimlerini kontrol etmeye geldim.
Fakat burada STM8S.H kütüphanesinin örneklerdeki ve öğreticilerdeki register isimleriyle uyuşmadığını gördüm. Bundan dolayı programı yaptığım IAR IDE nin kütüphanesini kullanmak zorunda kaldım. Videoda bahsettiğim gibi 2 genel amaçlı kütüphane kullanıyorsanız, içerisindeki değişkenler ya da tanımlamalar aynı isme sahip olabiliyor. Bundan dolayı 2 kez tanımlandı ikazı veriyor. Bu ikazı dikkate almadan program çalışıyor. Şayet sarı ikaz yerine kırmızı hata iletisi verseydi çalışmayacaktı. Neyse ki kütüphanelerin sırasını ayarlayınca sarı ikaz verse de çalıştı.

Burada size 2 öğretici sayfa tavsiye edeceğim. Bilgiler çok güzel hazırlanmış. Bunları bir kez daha burada tekrarlamak istemiyorum. Bundan dolayı bu sayfalara göz gezdirmeniz yerinde olacaktır. Bu sayfalarda hem GPIO registerleri, hem CLOCK registerleri hem de UART haberleşme registerleri gösteriliyor. Bunları kullanarak rahatlıkla programlarınızı hazırlayabilirsiniz.

STM8S CLOCK ve GPIO ayarları : https://www.mcu-turkey.com/stm8s-vld-ilk-uygulama-clock-ve-gpio-konfigurasyonu/

STM8S UART haberleşme ayarları : https://www.mcu-turkey.com/stm8s-uart-modulu-kullanimi/

 

Benim bağlantılarım bu şekilde. GND uçları birbiri ile aynı diye bazılarını st-link adaptör üzerinden aldım. Dikkat ediniz.

Programın çalışması ise şöyledir. STM8 ana program, Arduino programı gibidir. Başlangıçta kütüphane ve değişkenler sonrasında ana program satırlarının yer aldığı bölüm ve bunun içerisinde sonsuz döngü yer almaktadır. Sonsuz döngüde çalışırken Butona basılmadan önce port b5 pimine bağladığım LED yanıp söner. Bu LED yanıp sönerken butona basarsam artık program UART haberleşme kısmına gideceğinden LED yanıp sönme kesilir. Sonrasında ise kullanıcıya seri port üzerinden “veri gir” der. Ve kullanıcıdan gelen veriyi beklemeye başlar. Veri geldiğinde uart interrupt çalışarak gelen bilgileri alır ve bilgi geldi bayrağını (recflag) 1 yapar. Sonrasında bekleme durumundan çıkıp gelen bilgiyi yazdırır. Bilgi yazıldıktan sonra ise gelen bilginin bulunduğu değişkenler sıfırlanır. Aynı zamanda recflag bayrağı da işi bittiği için sıfırlanır. Bu şekilde çalışma vardır.
Burada dikkat edeceğimiz bazı hususlar var.
1- Bilgi seri port üzerinden gönderilirken ve gelirken 1 byte lık bilgi olarak gelir. Siz bir string dediğimiz dizi bile yollasanız bilgiler değişkene tek tek aktarılır. Bundan dolayı bilgiyi alan değişken, ARRAY dediğimiz dizi şeklinde tanımlanır ve her bir parçasına 1 karakter aktarılır.
Mesela programda uint8_t rec_data[7]; 8 karakterlik bir dizi tanımlanır. (neden 7 değil de 8 karakter.) Çünkü array 0 dan başlar. Yani 0,1,2,3,4,5,6,7 olacak şekilde birer karakter alırlar.

2- Her seri port üzerinden gönderilen karakterden sonra bir gecikme verilmeli Bu gecikme kütüphane tarafından verilmediği için biz vermek zorundayız. Ben program da delay alt programı ayarladım. Bazı yerlerde buraya gecikme için gönderdim. Bazı yerlerde ise for next ile bulunduğu yerde gecikme sağladım. Bunu yaparken ve delay komutunun yanına sayı yazarken hiçbir zaman ms veya us olarak düşünmedim Bunlar sadece birer sayıdır ve 0-delay sayısı,  arasında bir sayma işlemiyle gecikme verilecek şekilde düşünüldü. 500 gördüğünüzde o 500 bir sayaçtır. Milisaniye ya da mikro saniye değildir. Tecrübe ile söyleyebilirim ki bu sayı 1000 olarak başarılı şekilde çalıştırıyor. Siz programlarınızda 1000 ile başlayın ve aşağıya doğru deneme yapın. En iyi yerde bırakın derim ya da timer kullanırsanız, delay kısmını buna göre ayarlarsanız çok daha iyi olacaktır.

3- Gelen veriyi ben array karakter numarasıyla karşılaştırdım. Şayet kolaylık olsun derseniz C programlamanın string.h kütüphanesini kullanarak array yerine string olarak ayarlayıp çalışabilirsiniz karşılaştırmayı da string olarak yapabilirsiniz hatta bir dizi içinde başka bir diziyi de string şeklinde arayabilirsiniz. Faydaları olmakla birlikte ben uğraşmak istemediğim için bildiğim yolla karakter olarak karşılaştırdım.

4- Bir yerden bir örnek kopyaladıysanız ona ait kütüphaneyi de almayı ihmal etmeyin aynı isim altında birden fazla benzer kütüphane olduğundan örnek çalışmayabilir.

GPIO bölümünde Breadboard üzerinde sadece 1 adet buton, 1 adet led ve 1 adet de 330R, led için direnç vardır. Bu Led kısmı aşağıdaki şekilde bağlanmıştır. Butonda ise direnç kullanılmamıştır. Çünkü STM8S entegresinin kendi içindeki PULL UP direnç aktif edilmiştir.

3V3 ile LED kontrol edilir. VDD 3V3 olarak kabul edin. direnç ise 330R olabilir. ben 330R kullandım.
Burada R1 Pull Up direnci kullanılmış. Ben devremde direnci kullanmadım. Çünkü GPIO ayarlarında kendi içindeki PULL UP direncini aktif ettim. Bende devrede sadece bir ucu gnd ye bir ucu INPUT pimine bağlı olan BUTON vardır.

Aşağıda linkini gördüğünüz programı sıkıştırılmış dosyadan dizin şeklinde çıkarın ve dizin ismini değiştirmeden kullanın. Çünkü program ilk yapıldığında dizin ismi belirtildiği için bir yerlere kayıt ediyor sonrasında ise dizin ismi değiştiğinde çalışmayabiliyor.

Tüm dosyalar bu linktedir. https://github.com/safaka123/Mikrobotik_yazilarim/tree/main/STM8S103F3_basla

IAR programının, 30 günlük kullanım ya da 4KB sınırı ile devamlı kullanabileceğiniz bir sürümü free olarak indirebilirsiniz. IAR programını buradan download edebilirsiniz. 4KB başlangıçta yeterli profesyonel program hazırlarken satın alabilirsiniz. Tabii ki isterseniz STVD ya da cosmic ideleri de kullanabilirsiniz.
https://www.iar.com/products/architectures/st/iar-embedded-workbench-for-stm8/

IAR kullanım kılavuzu ise bu linktedir. https://wwwfiles.iar.com/stm8/guides/EWSTM8_IDEGuide.pdf

Gelelim ST-LINK V2 adaptöre. Videoda da anlattığım gibi hem stm8 hem de stm32 yi programlayabileceğiniz bir adaptördür. Aynı zamanda DEBUG (Hata ayıklama yapmanıza da yarar) Debug işlemi yaparken programı satır satır çalıştırabilirsiniz. Değişken değerlerini de anlık olarak kontrol edebilirsiniz. Bu programcılara çok yardımcı olmaktadır.

ST-LINK v2 adaptör benim elimdekinin resmi aşağıdadır. Bu adaptörde SWIM yazan yer stm8 için ayrılmıştır. Aşağıdaki resimde göreceğiniz gibi sol taraftaki kısım stm8 içindir. Bunu ayırt etmek için soket plastiğindeki kesik olan kısmı dikkate almalısınız. Adaptör versiyonundan dolayı farklı dizilim olabilir. Bundan dolayı, modül üzerindeki ile adaptör üzerindeki isimlerin uyuşmasına bakmalısınız. Ayrıca STM8 için adaptör üzerindeki 3V3 ucunu kullanmalısınız. 5V kısmı kullanmayın.

 

Bazı adaptörler görünüşte aynı bile olsa pim sıralamaları değişik olabilir. Bundan dolayı kendi adaptörünüze uygun bir şekilde bağlantınızı yapınız.

 

STM8 Gerçek Devre:

 

 

 

Bir cevap yazın

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