IAR ile STM8S – Giriş
Bundan yaklaşık bir kaç ay önce STM8 programlamaya başlamak istiyordum fakat ST Visual Develop beni bu işten bir hayli soğuttu. Anlam verilemeyen derleme hataları ve eski IDE yapısı ile çok kullanışsız olduğunun farkına vardım. Kenarda duran STM8S leri denemek için IAR’I denemek istediğimde IDE rahatlığı, kod tamamlama, düzgün ve hızlı derleme, Debug yapma gibi özelliklerinin oldukça verimli olduğunu gördüm. Özelikle küçük projelerde kullanılan 8 Bit işlemciler fiyat konusunda kıyasıya yarışıyor. ST’nin STM32F1xx 32 bit olmasına rağmen çok ciddi fiyatlara satılıyor. Bu yüzden 8 bit kullanmak yerine daha ucuz olsun derseniz STM32 bile kullanabilirsiniz. Tabi STM8S ailesini inanılmaz uygun fiyatlara sattığı için şu sıralar Türkiye piyasasında artışta olduğunu görmek mümkün. Bu sebeple STM8S artık ciddi bir önem kazandı diyebiliriz. Lafı daha fazla uzatmadan proje oluşturmaya başlayalım.
Ben bu yazıda Aliexpressden aldığım küçük STM8S003F3P6 işlemcili kiti ve mini programlayıcıyı kullanacağım oldukça küçük ve kullanışlı olduklarını söyleyebilirim.
STM8S Mini Kit
Kullandığım mini programlayıcı. Bütün STM ailesini programlayabiliyor. Şiddetle tavsiye edilir !
STM Programlayıcı
IAR kurulumu bitirdikten sonra proje oluşturmayı ve ST’nin STM8S için geliştirdiği Standart Peripheral Library’yi projemize import etmeyi anlatacağım.
Öncelikle SPL kütüphanelerini şu siteden indiriyoruz : STM8S SPL
Proje oluşturmadan önce bir WorkSpace açarak başlayalım.
Oluşturduğumuz çalışma alanına proje açalım.
Burada STM8’i seçip bir C projesi açıyoruz. Bizim kullanacağımız STM8S SPL kütüphaneleri C için yazılmıştır.
Daha sonra kaydederek proje oluşturmayı tamamlayalım. Bir klasör açıp LED_Blink olarak kaydetmek yeterli olacaktır.
Yapacağımız ayarlar için projeye sağ tıklayıp “Options”‘a tıklıyoruz.
Şimdi proje ayarlarından Debug yapabilmemiz için Simulator kısmını ST-Link olarak ayarlayalım. Bunu yapmazsanız kodlarınız işlemciye yüklenmez sadece simülasyon olarak çalışır ayrıca.
Şimdi “General Options” kısmına gelerek işlemcimiz seçelim.
Şimdi Kütüphaneleri eklemek için indirdiğimiz dosyada bulunan STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver dizinin içindeki “STM8S_StdPeriph_Driver” dosyasını projemizin olduğu yere kopyalıyoruz.
Kopyalama işlemi tamamlandıktan sonra yine proje ayarlarından C/C++ -> Preprocessor sekmesinden kütüphanelerimiz bulunduğu dosyadaki “inc” dosyanını ve kütüphane dosyasını dizinlerini buraya ekliyoruz. Örnek olarak ;
C:\Users\Baran\Desktop\STM8S_GPIO\STM8S_StdPeriph_Driver\inc C:\Users\Baran\Desktop\STM8S_GPIO
Ve sol altta bulunan “Define symbols : (one per line)” kısmına işlemcimizi tanıtıyoruz.
Son olarak “stm8s_conf.h” isimli dosyayı projeye’nin olduğu dizine kopyalayarak proje oluşturmayı tamamlayabiliriz.. Bu dosyayı indirdiğiniz SPL’nin içinde örnekler kısmında bulabilirsiniz ben yine burada paylaşayım.
/** ****************************************************************************** * @file stm8s_conf.h * @author MCD Application Team * @version V2.2.0 * @date 30-September-2014 * @brief This file is used to configure the Library. ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __STM8S_CONF_H #define __STM8S_CONF_H /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" /* Uncomment the line below to enable peripheral header file inclusion */ #if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) ||\ defined(STM8S903) || defined (STM8AF626x) #include "stm8s_adc1.h" #endif /* (STM8S105) ||(STM8S103) || (STM8S903) || STM8AF626x*/ #if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) ||\ defined (STM8AF62Ax) #include "stm8s_adc2.h" #endif /* (STM8S208) || (STM8S207) || (STM8AF62Ax) || (STM8AF52Ax) */ #include "stm8s_awu.h" #include "stm8s_beep.h" #if defined (STM8S208) || defined (STM8AF52Ax) #include "stm8s_can.h" #endif /* STM8S208 || STM8AF52Ax */ #include "stm8s_clk.h" #include "stm8s_exti.h" #include "stm8s_flash.h" #include "stm8s_gpio.h" #include "stm8s_i2c.h" #include "stm8s_itc.h" #include "stm8s_iwdg.h" #include "stm8s_rst.h" #include "stm8s_spi.h" #include "stm8s_tim1.h" #ifndef STM8S903 #include "stm8s_tim2.h" #endif /* STM8S903 */ #if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) ||defined(STM8S105) ||\ defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined (STM8AF626x) #include "stm8s_tim3.h" #endif /* (STM8S208) ||defined(STM8S207) || defined(STM8S007) ||defined(STM8S105) */ #ifndef STM8S903 #include "stm8s_tim4.h" #endif /* STM8S903 */ #ifdef STM8S903 #include "stm8s_tim5.h" #include "stm8s_tim6.h" #endif /* STM8S903 */ #if defined(STM8S208) ||defined(STM8S207) || defined(STM8S007) ||defined(STM8S103) ||\ defined(STM8S003) || defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) #include "stm8s_uart1.h" #endif /* STM8S208 || STM8S207 || STM8S103 ||STM8S903 || STM8AF52Ax || STM8AF62Ax */ #if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x) #include "stm8s_uart2.h" #endif /* STM8S105 || STM8AF626x */ #if defined(STM8S208) ||defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) ||\ defined (STM8AF62Ax) #include "stm8s_uart3.h" #endif /* STM8S208 || STM8S207 || STM8AF52Ax || STM8AF62Ax */ #include "stm8s_wwdg.h" /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Uncomment the line below to expanse the "assert_param" macro in the Standard Peripheral Library drivers code */ #define USE_FULL_ASSERT (1) /* Exported macro ------------------------------------------------------------*/ #ifdef USE_FULL_ASSERT /** * @brief The assert_param macro is used for function's parameters check. * @param expr: If expr is false, it calls assert_failed function * which reports the name of the source file and the source * line number of the call that failed. * If expr is true, it returns no value. * @retval : None */ #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif /* USE_FULL_ASSERT */ #endif /* __STM8S_CONF_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Artık çalışmak istediğimiz modülün “.c” uzantılı dosyasını projemize dahil ederek çalışmaya başlayabiliriz. Biz bu örnekte basit bir “LED Blink” yapacağımız için sadece “gpio” ütüphanesini eklememiz yeterli olacaktır. Bunun için yine projeye sağ tıklayıp “ADD” kısmından projemizin içine kopyaladığımız kütüphane dosyalarından “src” klasörünün içinden ekleyebiliriz.
Ve son olarak basit bir LED Blink kodu ile projeyi tamamlayalım.
#include "stm8s.h" #define LED_GPIO_PORT (GPIOB) #define LED_GPIO_PINS (GPIO_PIN_5) void Delay (uint16_t nCount); void main(void) { GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST); while (1) { GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS); Delay(0xFFFF); } } void Delay(uint16_t nCount) { while (nCount != 0) nCount--; } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { while (1); } #endif
Project->Rebuild All diyerek Build edip “Download and Debug” tuşuna basarak işlemcinize kodu yükleyebilir ve Debug yapabilirsiniz.
Tabi yükledikten sonra “Go” tuşuna basmayı da unutmayın. 🙂
Şimdilik bu kadar. Bir sonraki yazıda görüşmek üzere. Esen kalın !
Hocam güzel paylaşımlar. Teşekkür ederim.
Ben teşekkür ederim Muhittin hocam.
STM8S Mini kitin üzerinde STM8S103F3P6 mikrodenetleyici var. Açıklamalarınızda STM8S003F3P6 olarak belirtmişsiniz. Yazım yanlışı mı, program hatalarından dolayı öyle mi seçilmeli?
Sevgili Ogan bu mini kitlerden STM8S10F3P6 ve STM8S003F3P6 olmak üzere 2 çeşit var.
Ben STM8S003F3P6 olanını kullandım. Resim burada temsilidir.
#ifDef USE_FULL_ASSERT ne amaçla yazılmıştır. Teşekkür ederim.
O kısma çok takılmayın derleyici ile alakalı bir durum olsa gerek. O kısmı yazmayınca hata verebilir.
STM32 discovery board ile nasıl bağlantısı olması gerek ?
Merhaba Abuzittin,
Bu STM8S.
Bunun STM32 ile bir alakası yok.
Fakat siz programlayıcının nasıl bağlandığını soruyorsanız
3.3V/GND/SWDIO/SWCLK şeklinde bağlanması gerekiyor.
Üzerindeki jumper nasıl olmalı ?
Siz hangi karttan bahsediyorsunuz ?
STM32F103 mü ?
Yoksa Discovery Boardlar mı ?
Discovery board’lar dahili olarak programlayıcı barındırıyor çünkü.
Merhaba Baran bey,
Bu STM8S serisi için dokunanı okudum adım adım gerçekleştirdim.
C/C++ -> Preprocessor sekmesinden kütüphaneye ulaşıyorum “inc” dosyasının içeriğini görmesi lazım ama görmüyor kontrol edince inc klasörü dolu olduğunu görüyorum.
C:\Users\Baran\Desktop\STM8S_GPIO\STM8S_StdPeriph_Driver\inc
C:\Users\Baran\Desktop\STM8S_GPIO
Örnek yazılımı derlediğimde direk error veriyor.
Beceremedim.
Yardımcı olurmusunuz.
Kolay gelsin.
Merhaba,
Eklediğin dosya yoluna dikkat et. Paylaştığın kısımda “C:\Users\Baran\” yazıyor. Bunu kendi dosya yoluna göre düzenle.
Baran Bey, yazınızı çok beğendim ve yararlandım. Yıllardır STM32 ile çalışıyordum, çekmecede durmakta olan STM8 leri değerlendirmeye kalkınca IAR kullanmak zorunda kaldım, bu yayınınız bana çok zaman kazandırdı, elinize sağlık, teşekkürler.
Yalnız bendeki STM8S003 mini kit de sizinki ile aynı ama LED PD3 üzerinde, siz kodu PD5 üzerinde imiş gibi yazmışsınız, bir hata mı, yoksa bu kitlerin başka çeşitleri de mi var?
Selamlarımla,
Pardon, düzeltiyorum, sizin kitiniz farklı imiş. Demekki piyasada daha farklı modeller de varmış. Slm
Merhaba,
Piyasada çok farklı kitler mevcut. Elinizin altında kullandığınız geliştirme kartının şeması mutlaka olsun. Aksi halde çok vakit kaybetmenize yol açar.
Baran Bey ilgi ve yanıtınız için teşekkür ederim. Ben de tecrübelerimi paylaşayım, belki bir işe yarar:
IAR ile işe giriştim ama, bunun ücretsiz lisansının ancak 4K kod boyutuna izin verdiğinden hemencecik tıkandım. Ben de ST nin STVD sini kullanmaya karar verdim, derleyici olarak da Cosmic C. Bu da yeni bir uygulamayı, derleyiciyi kurmak, öğrenmek anlamına geldi. Şimdi STVD yi kullanabilir duruma geldim.
STVD IAR gibi entegre bir ortam değil, bunun çıktısı olan kodu işlemciye yüklemek için ayrıca ST Visual Programmer kullanıyorum.
Debugging için de ayrıca ST Visual Studio kullanılıyormuş, onu henüz denemedim.
STM32 den sonra STM8S003 ün ne kadar minik bir işlemci olduğunu yeni farkettim, ama basit projeler için gayet güzel bir seçenek gibi görünüyor. Zamanında bir sürü STM8 kiti almışım, belki bir işe yararlar şimdi.
Şimdi PWM çıkışlarına yönelik bir çalışma yapmam gerekiyor.
Selamlarımla,
stm8 için kesin bir delay fonksiyonu yok galiba… 0xFFFF sayısının süre olarak neye tekabul ettiğini nasıl anlayacağız?
Merhaba,
Kesin bir delay fonksiyonu derken genelde timer ile bu işleri yapabilirsiniz.
Yada kendi emin olduğunuz bir gecikme fonksiyonu ile yapabilirsiniz.
Buradaki mantık ise 0xFFFF gibi bir değerin çıktısına bakarak referans almak.
Genelde bu işler için timer kullanılır fakat ben basit olması adına Giriş yazısında rasgele bir değer ile gecikme yarattım.
yani stm32 programlarken bize hal kütüphanesi tarafından sağlanan HAL_Delay() gibi bir fonksiyon olmasını bekliyordum. Neyse, olmaması iyi oldu, kendim oluşturayım derken timer birimini daha iyi tanıma şansım oldu.