Genelde küçük projelerimde STM32F103 serisi mikro denetleyiciler ile çalışırım. Bu 32bit mimariye sahip, 72Mhz ARM Cortex M3 serisinin harcı alem, ucuz bireyidir. Son zamanlarda farkettim ki bunların 48 pinli “Pico” geliştirme tipinin fiyatı bile 1 dolarlardan 3 doların üzerine çıkmış. Bu durumda malzeme kutularımda yıllardır beklemede olan onlarca STM8 modülünü tekrar elime aldım. Hiç olmazsa küçük uygulamalarda onları kullanabilirim diye düşündüm. Aşağıdaki güncel fiyat karşılaştırması bu ilgiye değer olduğunu gösteriyor (Ali Express fiyatları – tek tümleşik devrelerin değil, küçük geliştirme modülü fiyatları) :
STM8S003F3P6. : 0.76$/ad
STM32F030F4P6: 2.5 $/ad (20 pin, STM8 e en yakın özelliklerde)
STM32F103C8 : 2.5-3.5$/ad
STM32F401CC. : 3.5$/ad
Elbette STM8 in I/O sayıları, hızı, program ve RAM bellek boyutları STM32 ye yaklaşamıyor bile, ama pek çok uygulama için yeterli oluyor. 20 pinli STM8 modüllerinin fiziksel boyutları da 48 pin STM32 ye göre çok daha küçük. STM32 nin de -F030 gibi- 20 pinli tipleri var ama fiyat olarak 48 pinlilerden çok farklı değiller.
STM8 de uygulama geliştirmek için kullanılan platform, derleyici ve derlenmiş program kodunu STM8 e aktarmada kullanılan uygulama STM32 den farklı.
Bu yayında bir STM8 uygulaması geliştirmek için gerekecek araçları anlatmaya çalışacağım.
STM8S003/103F3 TEMEL ÖZELLİKLER, STM32 DEN FARKLAR
Bu kadar fiyat farkı olmasaydı STM32 den sonra STM8 ile uğraşmaya değmez diye düşünürdüm, zaten STM8 modüllerin yıllarca çekmecede beklemesinin nedeni de bu olmuştu. Başka malzemeleri sipariş ederken kargo bedelini yaymak için hadi biraz da bunlardan koyalım diye satın aldığım şeylerdi. Şu anda elimde STM32 den çok STM8 modülü birikmiş durumda.
Bu bölümde STM8 i elinize alır almaz göze çarpan bazı önemli farkları listeleyeceğim. STM8 in 8 bitlik bir mimariye sahip olduğunu hatırlatmaya gerek yok sanırım.
STM8 BELLEK BOYUTLARI
STM8S003F3/103F3 ün program flash belleği 8 KB, RAM boyutu ise 1 KB. Yani programınızı çok dikkatli geliştirmek zorundasınız. Pek çok standard kütüphaneyi, örneğin sprintf() kullanırsanız, bu boyutu aşıveriyorsunuz. RAM açısından da öyle, örneğin küçük OLED ekranların SSD1306 sürücüleri 1 KB RAM alanına sığmıyor. Bunun için, STM8 ile kullanılmak üzere geliştirdiğim bir SSD1306 sürücü kodunu bir başka yayında anlatacağım.
STM8S003F3 ün EEPROM olarak kullanılabilecek 128 Byte’lık bir flash alanı var, STM8F103F3 de bu alan biraz daha büyük, 640 Byte. İki tip STM8 arasındaki yegane fark da bu.
STM8 EEPROM alanı hakkında bir not: STM8S003F3 ün 128 Byte'lık EEPROM alanı olmasına rağmen, bunun ötesine geçildiğinde de çalıştığını raporlayan kullanıcılar var. Ancak bu durumda ST Microelectronics'in verdiği okuma yazma sayısı gibi performans garantilerinin geçerli olmayacağı anlaşılıyor. Bu uyarıyı şunun için yapıyorum: Size STM8S103 yerine, üzerine STM8S103 damgası basılmış STM8S003 ler satarlarsa farkı anlamayabilirsiniz. Bu nedenle, daha fazla EEPROM'a gereksiniminiz olduğu için STM8S103 satın alıyorsanız ki başka bir sebep de göremiyorum, satıcınızın güvenilir olduğundan emin olmalısınız.
STM8 CPU HIZI
STM8 de ST nin kendi geliştirdiği çekirdek kullanılıyor, ARM CORTEX değil. Bu CPU 16 MHz de çalışıyor. Bu mikro denetleyiciyi çok iddialı uygulamalarda kullanmayacağımdan benim açımdan bu önemli bir sorun değil.
20 yıl önce 256B RAM lı, 12 KB program bellekli 8 bit 8051 mikro denetleyiciler ile yaptıklarımızı düşünüyorum da…
I/O SAYILARI
20 pinli STM8S003/103 de aşağıdaki 16 adet I/O kullanılabiliyor (alternate fonksiyonların hepsini listelemedim.):
A1, A2, A3,
B4, B5, ( alt: I2C)
C3, C4,
C5, C6, C7, (alt: SPI)
D1, D2, D3, D4,
D5, D6 (alt : UART)
20 pinden geri kalan 4 adedi : GND, VDD, VCAP, RST.
GELİŞTİRME ARAÇLARI
Gelelim STM8 kullanmanın en can sıkıcı yanına.
STM32 de her şeyi CubeIDE ya da KEIL gibi tek bir entegre uygulamada yapıp kodunuzu mikro denetleyiciye yükleyip kesintisiz olarak yine aynı platform üzerinde debug çalışmalarına geçebiliyorduk. CubeMX gibi kullanışlı bir yapılandırma aracının yanısıra HAL kütüphaneleri de emrimizde idi.
STM8 de ise programınızı bir platformda yazıp derleyebiliyoruz, ama hedef HEX kodunu STM8 e yüklemek için bir başka uygulamaya geçmeniz gerekiyor. STM32 deki gibi kaynak koda ‘break point’ ler koyarak debugging de yapılamıyor. Bu açıdan program geliştirme süreci daha zahmetli oluyor.
Burada belirtmeliyim ki burada sözünü ettiğin uygulamaların hepsi sadece Windows, bazıları da hem Windows hem de Linux üzerinde de çalışıyor. Mac OS üzerinde çalışanları yok.
(Bu benim için ayrı bir problem, zira genelde kullandığım Mac ile Windows arasında gidip gelmeyi sevmiyorum.)
YAZILIM GELİŞTİRME PLATFORMU
IAR güzel bir entegre platform (IDE) ama ücretsiz lisansı 4 kB ile sınırlı. Neredeyse sadece “HELLO WORLD” yazıp orada kalıyorsunuz, iş görebilecek ciddi bir uygulama için yetersiz. Lisans ücreti de 2.000 Euro’lardan başlıyor, benim gibi kişisel kullanıcıların bütçesini fazlasıyla aşıyor.
Ücretsiz geliştirme platformu peşinde olunca önümüze iki seçenek çıkıyor. Birincisi ST Microelectronics’in ST Visual Developer – STVD uygulaması, diğeri de COSMIC Software’in IDEA uygulaması. IDEA’yı denemedim.
Ben STVD kullanıyorum ve bu yayında bunun kullanılışını ele alacağım. STVD-STM8 uygulamasını bu linkden indirebilirsiniz.
YAPILANDIRMA ARACI
İşleri kolaylaştırmak için STM32 yapılandırmalarında kullanılan cubeMX uygulamasını tanıyoruz. STM8 için de bir cube MX var, ama bu sadece işimizi görecek bir mikro denetleyiciyi seçmemize, ayak fonksiyonlarını ve diğer özelliklerini grafik arayüz üzerinde görmemizi sağlıyor. STM32 Cube MX de olduğu gibi proje oluşturup, yapılandırma yapıp başlangıç kodlarını üretmiyor.
STM8CubeMX ilgilenmekte olduğunuz STM8 tipinin data sheet’inin kullanışlı bir sunumunu sağlıyor, pinlerin alternatif fonksiyonlarını, saat ayarlarını herhangi bir çatışma olmadan yapmanızı sağlayıp, sonucu bir rapor halinde size sunuyor. Kodunuzu geliştirmeye başlarken başlangıç ayarlarını bu raporu önünüze alarak yapabiliyorsunuz.
STM32 CubeMX in yaptıklarının hepsini bu da yapacak beklentisi ile indirip kullanmaya kalkarsanız hayal kırıklığı olacaktır.
DERLEYİCİ
Bir derleyici yükleyip STVD ile ilişkilendirmeniz gerekiyor. ST muhtelif derleyici alternatifleri öneriyor, ben ücretsiz lisans peşinde olduğumdan COSMIC Software in Cosmic CXSTM8 derleyicisini kullanmaya karar verdim. Cosmic for STM8 i bu linkden indirebilirsiniz. Ücretsiz ama, e-mail adresiniz ile kayıt olmanız gerekiyor, 24 saat içinde mail ile programı açmakta kullanacağınız bir anahtar gönderiyorlar, o kadar.
Bu yazılımı bilgisayarınızda açıp kurduğunuzda derleyici ile birlikte STM8 ve STM32 için IDEA platformları da gelip kuruluyor, masa üstünüzde bunların kısayolları beliriyor. Şaşırmayın, eğer istiyorsanız kod geliştirmek için STVD yerine bunları kullanabilirsiniz.
KOD YÜKLEME ARACI
STVD kodunuzu yazıp derlemenize, derleme sırasında çıkan hatalarını gidermenize yardımcı oluyor, sonunda bir .s19 uzantılı bir hedef dosyası oluşturuyor. Bu kodu STM8 mikro denetleyiciye doğrudan STVD üzerinden yükleyemiyorsunuz. Kod yüklemek için ayrıca bir uygulamaya ihtiyacınız var.
STM32 de bu işi doğrudan geliştirme platformu üzerinden ya da “ST Link utility” ya da “STM32 cube programmer” uygulamaları ile yapabiliyorduk, bunlar STM 8 için kullanılamıyor.
STM8’e kod yüklemek için STVP (ST Visual programmer) uygulamasını indirip kurmak gerekiyor. STVP-STM8 programlama uygulamasını bu linkden indirebilirsiniz.
SPL – STANDARD PERIPHERAL LIBRARY
STM8 için STM32 deki gibi işimizi kolaylaştıracak bir HAL ara katmanı yok. Kodumuzu alt seviyede geliştirmek zorundayız. Neyse ki HAL öncesinden aşina olduğumuz gibi bir Standard Peripheral Library – SPL STM8 için de var. Bu kütüphaneyi (stsw-stm8069) bu linkden indirebilirsiniz.
İndirdiğimiz SPL kütüphanesini STVD ile oluşturduğumuz work space dosyalarının bulunduğu klasörlere kopyalayarak istediğimiz bölümleri (.c ve .h dosyalarını) projemize ekleyebiliriz.
STVD İLE PROJE OLUŞTURMAK VE DERLEMEK
STVD nin bilgisayara kurulmasını anlatmayacağım, Windows kullanıcıları için alışılmış bir kurulum sürecini izliyorsunuz.
Program kurulduktan sonra masa üstü -ya da start menüsünden- STVD simgesine tıklayarak çalıştırdığınızda aşağıdaki karşılama ekranı açılıyor. Hazırda açabileceğiniz bir proje yok ise yeni bir proje için önce yeni bir Workspace oluşturmanız gerekiyor. Oluşturacağınız Workspace’i başka projeleriniz için de kullanabileceksiniz.
WORKSPACE OLUŞTURMAK
Yeni workspace oluşturmak için File/NewWorkspace seçeceğini tıklıyoruz.
Workspace oluşturmak için farklı seçenekler sunan bir pencere açılıyor. Bunlardan ilk seçenek ilk STM8 projemiz için uygun olanı.
OK tıklayınca yeni Workspace’imize isim vereceğimiz ve yerini belirteceğimiz bir pencere açılıyor. Bu örnekte Workspace adını “Yeni_workspace”, yerini de masaüstünde oluşturulacak “STM8_Tutor” klasörü olarak bildiriyorum. OK tıkladığımızda Workspace oluşturma işlemlerini tamamlamış oluyoruz.
PROJE OLUŞTURMAK
Yeni workspace oluşturulduktan sonra burada geliştireceğimiz ilk proje ile bilgilerin girilmesi gerekiyor. Açılan pencerede Projenin adının girileceği, hangi workspace’de yer alacağı ve hangi derleyicinin kullanılacağının bildirildiği bir pencere açılıyor.
Burada projemize vereceğimiz ismi giriyoruz. Varsayılan olarak yeni oluşturmuş olduğumuz workspace görünüyor, ona dokunmadan geçelim.
Toolchain kutusundaki seçeneklerden “STM8 Cosmic”i seçiyoruz. Bu derleyiciyi önceden indirip bilgisayarınıza kurmuş olmanız gerekiyor.
En alttaki kutuya da Cosmic derleyicinin bulunduğu klasörün yerini yazmanız gerekiyor. Bunun için sağ tarafındaki üç noktalı arama kutucuğunu tıklayarak dosya sistemi içinde arayıp buraya aktarabilirsiniz. Benim durumumda bu derleyici varsayılan konum olan :
C:\Program Files(x86)\COSMIC\FSE_Compilers\CXSTM8 klasöründe.
OK tıklayarak ilerlediğimizde sol taraftaki proje penceresinde yeni projemizi ve buna ilişkin birkaç temel dosyanın oluşturulmuş olduğunu görüyoruz. Bunlardan birisi de main.c dosyası. Projemizi geliştirmeye main.c ye yazacağımız kodlar ile başlayabiliriz artık.
PROJENİN YAPILANDIRILMASI
Yeni projemiz için kod yazmaya başlamadan önce yapmamız gereken bazı ayarlar var. Bunun için Project/Settings menüsünü açalım. İlk karşımız çıkan General sekmesinde yapılacak birşey yok aslında, daha önce seçmiş olduğumuz derleyici ve bunun yer aldığı klasörün konum bilgileri varsayılan olarak açılmış durumda.
MCU SEÇİMİ
C COMPILER SEÇENEKLERİ
C Compiler sekmesi altında yapılmasını önerebileceğim bir kaç ayar var. Bunlardan birincisi Optimizasyon kutucuğundan “Minimize code size” seçeceğini seçmek. STM8 in 8 KB lık program belleğinde buna her zaman ihtiyacınız olacağını garanti edebilirim.
C language kutusunu default olarak bırakırsanız, derleyicinin gereğinden fazla titiz davranmamasını sağlarsınız. Örneğin fonksiyon ve değişken bildirimlerinin ille de dosyanın baş tarafında bulundurulması gibi.
MİNİMUM KOD BOYUTU İÇİN OPTİMİZASYON SEÇİMİ
PROJEYE DOSYA EKLEMEK
Projemizi yukarıda anlatıldığı gibi oluşturup başlangıç ayarlarını da yaptıktan sonra sol taraftaki pencerede main.c ve stm8_interrupt_vector.c dışında bir dosya bulunmadığını görüyoruz.
Halbuki projemizi geliştirirken “Standard Peripheral Library” kütüphanesinden başta stm8s.h ve stm8s_gpio.c gibi dosyalar olmak üzere epeyi dosya eklememiz gerekecek. Bu şekilde eklemeler yapılmış tipik bir proje örneğini aşağıdaki ekran kopyasında görebilirsiniz.
PROJEYE STANDARD PERIPHERAL LIBRARY DEN DOSYALAR EKLEMEK
Güncel SPL kütüphanesini yayının baş tarafında anlattığım gibi ST Microelectronics Sitesinden indirip kolay erişilebilecek bir yere, tercihan workspace klasörümüzün bulunduğu klasöre kopyalamak gerekiyor.
Bunu yaptıktan sonra eklenecek dosyamız .c uzantılı ise Source Files klasörüne sağ tıklayarak Add Files to Folder seçeceğini tıklıyoruz. .h uzantılı dosyalar için de Include klasörünü sağ tıklıyoruz. Açılan arama penceresinden istediğimiz .c ve .h dosyalarını bulup seçip (tek seferde birden fazla dosya seçebilirsiniz) projemize ekliyoruz.
PROJENİN ETKİNLEŞTİRİLMESİ
Sol pencerede bu workspace de bulunan birden fazla projenin görüntülenebilmekte olduğunu söylemiştik. Bunlardan, üzerinde çalışmakta olduğumuzu etkin hale getirmemiz gerekiyor. Bunun etkinleştirme işlemi için çalıştığımız projeyi sağ tıklayıp, açılan pencerede “Set as Active Project” seçeceği ile seçebiliriz.
O an için etkin durumda olan proje koyu harflerle görüntülenir.
DERLEME
Sıra derlemeye geldiğinde Build/Rebuild all seçeceğini tıklayarak projemizin tamamını derleyebiliriz.
Derleme hatasız sonuçlandığında projemizin Debug klasöründe .s19 uzantılı kod dosyasının oluşturulmuş olduğunu görebiliriz.
KODUN MİKRO DENETLEYİCİYE YÜKLENMESİ
Artık projemizi derleyip hedef kodu .s19 uzantılı olarak elde etmiş durumdayız. Sırada bu kodu mikro denetleyiciye yüklemek var. Bu işlem için STVP – ST Visual Programmer uygulamasını kullanacağız.
STVP yi yayının baş tarafında verdiğim linkten indirip bilgisayarınıza kurmuş olmalısınız. Uygulamanın masa üstü kısayoluna tıklayarak başlattığınızda aşağıdaki gibi bir açılış ekranı belirecektir.
Önce aşağıdaki gibi, mikrodenetleyici seçimini yapmamız gerekiyor.
Bunun ardından mikro denetleyiciye yükleyeceğimiz .s19 uzantılı HEX dosyayı açmamız gerekiyor. Bunun için aşağıdaki gibi File/Open menüsünden yararlanıyoruz.
Karşımıza çıkan arama penceresinden dosya sistemine girerek .s19 dosyamızı bulup yüklediğimizde dosya içeriği aşağıdakine benzer şekilde sağdaki büyük pencerede listelenecektir.
Bu noktaya geldiğimizde ST_Link V2 programlayıcımız bilgisayarımızın bir USB portuna ve STM8S mikro denetleyicinin 4 telli programlama pinlerine bağlanmış durumda olmalıdır.
STM8 e bağlantıyı ST Link programlayıcının 4 pinli orta konnektöründen yapıyoruz. Pinlerin yönünden ve fonksiyonlarından kuşku duyulursa yukarıdaki fotodaki etiketten yararlanılabilir.
Bundan sonraki adım programın STM8 e aktarımı. Bunun için Program/Current Tab seçeceği tıklanıyor.
İşlem bu kadar, ekranın alt tarafındaki ilerleme çubuğu süreç hakkında bilgi verecektir.
Sağ pencerede Data Memory ve Option Bytes adlı iki sekme daha görülüyor. Bunlar STM8 in Option Byte‘larının ve EEPROM bölümlerinin de programlanması için kullanılıyor. Özellikle Option Byte‘lar için aşağıda biraz bilgi veriyorum, daha fazlası için data sheet’e başvurmanızı öneriyorum.
OPTION BYTES
STM8 de bazı tanımlamalar STM32 den farklı olarak program kodu içinde değil, “Option Bytes” olarak adlandırılmış 11 adet register’deki bitler set/reset edilerek yapılıyor. Bu ayarlar STVP nin option bytes sekmesi tıklandığında karşımıza çıkan liste üzerinden yapılıyor. Data sheet’te verilen tabloyu buraya kopyaladım.
Bu bitlerden bizim en sık başvuracağımız muhtemelen pinlere alternate fonksiyon atamaları yapmak için kullanacağımız OPT2 registerindekiler olmalı, onun için OPT2 bit ayarlarını da aşağıya kopyaladım. Diğerleri için data sheet’e başvurmak gerekecek.
STM lerde pin sayısı ne kadar az ise, pinlere atanabilen alternate fonksiyon seçenekleri o kadar fazla oluyor. Yukarıdaki tablo 20 pinli olan STM8 için. 32 pinli olanın alternate fonksiyon tablosu çok daha kısa.
STM8 option bitleri programlamak için STVP de programlama aşamasında “All tabs …” sekmesi tıklanabilir, ya da Option Bytes sekmesi açık durumda iken “Current Tab” seçeceği tıklanabilir.
SONUÇ
Flash ve RAM belleklerin verimli şekilde kullanılmasına dikkat edildiğinde STM8 ile çok iş yapılabileceğini görebiliyorum. Örneğin tek bir motorun PWM ile hız kontrolu, bir ısıtıcının kontrolu, sıcaklı-nem vb ölçümleri için rahatlıkla kullanılabiliyor.
Öte yandan program boyut sınırlamasına dikkat etmek gerekiyor. Bir uygulamamda string kütüphanesinden tek bir fonksiyon -sprintf- kullanmaya kalktığımda 8 KB flash alanına sığamaz duruma düştüm. RAM sınırlaması yüzünden I2C OLED kullanabilmek için özel bir sürücü yazmak zorunda kaldım.
Elimde bir sürü STM8 olmasa gidip yenisini satın almaktansa STM32 serisinin 20 pinli küçük fertlerini kullanmayı yeğlerim. Elbette binlerce üretilmesi söz konusu olan bir üründen söz ediyorsak durum değişebilir.
Bu yayının sonu – Selçuk Özbayraktar, Mayıs 2021