Kembali ke STM8

Tujuh tahun lalu (2016) saya mencoba STM8 dan mendokumentasikannya di sini. Seiring waktu, teknologi yang dikembangkan secara sistematis untuk mempermudah pemrograman semakin matang. Saat ini STM8 sudah sedemikian mudah untuk diprogram dengan mempergunakan Arduino IDE dengan dialek bahasa turunan C dan C++.

Gambar 1.
Gambar 2.
Gambar 3.

 

Arduino IDE

Cara pertama di artikel ini adalah dengan melakukan standar pengujian kode kedip (blink).  LED di papan yang akan diatur terhubung dengan D3 (PB5).

Gambar 4.
[sourcecode] /*
* Kode kedip untuk menguji STM8 (STM8s103f3 | stm8s103?3)
*
*/

#define onBoardLED 3

void setup() {
pinMode(onBoardLED, OUTPUT);
}

void loop() {
digitalWrite(onBoardLED, HIGH); // LED OFF
delay(400);
digitalWrite(onBoardLED, LOW); // LED ON
delay(200);
}
[/sourcecode]

Gambar 5.

Eksekusi perintah “Burn Bootloader” seperti di Gambar 5 sebelum melakukan pemrograman sistem STM8 untuk pertama kali.
 

Gambar 6. Pemrograman telah berhasil dilakukan.

Berikutnya, dicoba pengaturan yang lebih kompleks, yaitu pemanfaatan fasilitas PWM.

[sourcecode] /*
Dimodifikasi dari kode aslinya

Blink without Delay
created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen
modified 11 Nov 2013
by Scott Fitzgerald
modified 9 Jan 2017
by Arturo Guadalupi

This example code is in the public domain.

https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay
*/

// constants won’t change. Used here to set a pin number:
const int ledPin = 3;// D3 (PB5 di papan STM8S103F3)
const int pwmTestA = 5;
const int pwmTestB = 13;

// Variables will change:
int pinState = LOW; // pinState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated

// constants won’t change:
const long interval = 10; // interval at which to blink (milliseconds)

void setup() {
// set the digital pin as output:
pinMode(ledPin, OUTPUT);
pinMode(pwmTestA, OUTPUT);
pinMode(pwmTestB, OUTPUT);
}

void loop() {
// here is where you’d put code that needs to be running all the time.

// check to see if it’s time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
unsigned long currentMillis = millis();

if (currentMillis – previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;

// if the LED is off turn it on and vice-versa:
if (pinState == LOW) {
pinState = HIGH; //LED OFF
} else {
pinState = LOW; //LED ON
}

// set the LED with the pinState of the variable:
digitalWrite(ledPin, pinState);
analogWrite(pwmTestA, 50);
analogWrite(pwmTestB, 50);
}
}
[/sourcecode]

Cara pemrograman kode terakhir ini sama seperti sebelumnya. Dengan logic analyzer bisa dilihat lebar pulsa low kode kedip (Gambar 7) dan periode (frekuensi) PWM di D5 (PC3) di Gambar 8.

Gambar 7.
Gambar 8.

Berikutnya dengan bantuan oscilloscope ATTEN (f/w Siglent) bisa dilihat lebar pulsa high PWM di pin D13 (PD4).

Gambar 9.
Gambar 10.

Juga dengan bantuan fasilitas di oscilloscope bisa dilihat dengan lebih baik profil rise time dari sinyal digital yang dibangkitkan oleh fasilitas PWM di STM8 (dengan pemrograman via Arduino).

SDCC STM8FLASH

Hampir sama dengan sebelumnya, berikut dicoba kembali kode program kedip dengan SDCC. Versi SDCC yang dipakai adalah 3.8.0 #10562 (Linux).

[sourcecode] #include "stm8l.h"

int main() {
int d;
// Configure pins
PB_DDR = 0x20;
PB_CR1 = 0x20;
// Loop
do {
PB_ODR ^= 0x20;
for(d = 0; d < 29000; d++) { }
} while(1);
}
[/sourcecode]

Penetapan nilai heksadesimal 0x20 (0b00100000) untuk PB_DDR (DDR5), PB_CR1 (C15), dan PB_ODR (ODR5)  dapat dipelajari dari kutipan tabel berikut ini (sumber).

Jika papan stm8 baru pertama kali diprogram, beberapa perintah berikut ini perlu dijalankan untuk menghilangkan write protection (ROP /Read Out Protection ).

[intense_code type=”block”] echo “00” | xxd -r -p > ROP_CLEAR.bin
stm8flash -c stlinkv2 -p stm8s103?3 -s opt -w ROP_CLEAR.bin
[/intense_code]

Bisa juga mempergunakan versi berikut ini.

[intense_code type=”block”] echo “00 00 ff 00 ff 00 ff 00 ff 00 ff” | xxd -r -p > factory_defaults.bin
stm8flash -c stlinkv2 -p stm8s103?3 -s opt -w factory_defaults.bin
[/intense_code]

Berikutnya sebagai contoh program kedip disimpan di file yang diberi nama blinky.c. Untuk melakukan kompilasi, compiler sdcc yang dipergunakan. Sedangkan untuk memasukkan kode mesin hasil kompilasi, software stm8flash yang dipakai.

[intense_code type=”block”] sdcc -lstm8 -mstm8 –out-fmt-ihx blinky.c
stm8flash -c stlinkv2 -p stm8s103?3 -w blinky.ihx
[/intense_code]
Gambar 11. Hasil kompilasi dan flashing STM8.
Gambar 12.
Gambar 13.
Gambar 14. [Sumber]

Rujukan:

 

Mengenal PlatformIO

Pada kesempatan ini saya akan memuat catatan mengenai PlatformIO. Sebelumnya saya sudah membuat catatan penggunaan text editor maupun IDE seperti Energia, Codelite, Netbeans maupun Arduino IDE. Masing-masing IDE tentu memiliki keunggulan dan kekurangan dan masing-masing programer akan memilki kebutuhan dan selera yang berbeda-beda. Nah PlatformIO ini cukup unik, di satu sisi cukup lengkap dan mampu dipergunakan untuk mengerjakan kode untuk berbagai arsitektur mikrokontroler. Di sisi lain tampilannya menyerupai Sublime Text yang ringan dan sederhana.

pio001Gambar 1.

Di Gambar 1 dapat dilihat beberapa contoh default dan proyek yang dibuat manual. Yang sudah saya coba ada beberapa mikrokontroler, yang juga sudah pernah saya uji dengan IDE atau cara lain. Berikut beberapa arsitektur mikrokontroler yang sudah saya coba di PlatformIO (atau Atom);

Sebagai catatan untuk melakukan pemrograman pada STM8 (STM8S103F3); sekalipun PlatformIO tidak mendukung secara langsung toolchain STM8 tetapi editornya masih dapat dimanfaatkan dan mampu membantu keberhasilan pemrograman. Dapat dilihat pada Gambar 2.

pio002Gambar 2. [Klik gambar untuk memperbesar tampilan]

PlatformIO bukanlah text editor dalam pemahaman yang biasa dipergunakan. Pengungkapan yang lebih baik bisa diperoleh dari situs PlatformIO sendiri.

pio003Gambar 3. Apakah PlatformIO itu?

“Different microcontrollers normally have different developing tools . For instance Arduino rely on Arduino IDE. Few more advanced users set up different graphical interfaces like Eclipse for better project management. Sometimes it may be hard to keep up with different microcontrollers and tools. You probably thought that single unified development tool could be great. Well this is what PlatformIO open source ecosystem is for.

This is cross platform code builder and library manager with platforms like Arduino or MBED support. They took care of toolchains, debuggers, frameworks that work on most popular platforms like Windows, Mac and Linux. It supports more than 200 development boards along with more than 15 development platforms and 10 frameworks. So most of popular boards are covered. They’ve done hard work in organizing and managing hundreds of libraries that can be included in to your project. Also lots of examples allow you to start developing quickly. PlatformIO initially was developed with Command line philosophy. It’s been successfully used with other IDE’s like Eclipse or Visual Studio. Recently they’ve released a version with built in IDE based on Atom text editor”, – [Embedds].

 

PlatformIO dapat diintegrasikan ke dalam beberapa IDE di antaranya NetBeans, Codeblocks, dan Visual Studio. Meski begitu tampaknya yang terkenal adalah implementasinya ke dalam text editor Atom.io.

Atom is a text editor that’s modern, approachable, yet hackable to the core—a tool you can customize to do anything but also use productively without ever touching a config file.

Mungkin karena itu kadang-kadang PlatformIO dicampuradukkan dengan Atom. Keduanya jelas berbeda meski untuk banyak keperluan praktis merujuk pada hal yang sama. Perbedaan baru akan terlihat jika menemui kasus seperti contoh pada pemrograman STM8S103F3 di bagian atas tulisan ini. Untuk pemrograman contoh led berkedip itu, PlatformIO belum bisa mendukung platform maupun board sistem STM8. Karena itu yang bisa dimanfaatkan “hanya” text editor Atom saja. Tetapi dapat dilihat, dalam kondisi seperti itu pun terbukti masih bisa membantu menyelesaikan pemrograman dengan baik.

PlatformIO IDE yang dibangun berdasar text editor Atom dapat diunduh (download) di link ini. Saya sudah berhasil mencoba instalasi di sistem GNU/Linux, tetapi gagal mencoba di sistem tua saya, IBM Thinkpad T43 yang masih menggunakan Microsoft Windows XP SP3. PlatformIO mensyaratkan OS yang lebih baru dari XP.

Linux pengguna-laptop 3.16.0-38-generic #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

 

Ada beberapa pengaturan yang perlu dilakukan agar manfaat yang bisa diberikan platform ini dapat dipergunakan secara maksimal. Salah satu pengaturan yang memerlukan perhatian adalah mengenai clang. Sekilas mengenai Clang dapat dipelajari di sini, begitu pula perbandingannya dengan GCC dapat dibaca di sini.

pio004Gambar 4

Ada dua paket yang perlu menjadi perhatian; autocomplete-clang dan clang-format package. Jika belum terinstalasi dengan baik maka keduanya sebaiknya diinstal terlebih dahulu. Paket yang pertama (autocomplete-clang) sangat membantu proses coding , fungsi dan cara kerjanya dapat lebih mudah dipahami melalui gambar gif berikut:

autocomplete-clangGambar 5. Fasilitas autocomplete [image credit: autocomplete-clang package]

pio006Gambar 6. Melihat paket clang di Settings.

Paket yang kedua (clang-format package) juga sangat membantu pengerjaan kode program. Tetapi berdasar apa yang saya alami, paket kedua ini memerlukan usaha yang lebih agar dapat mudah dipakai. Dari situs penyimpanan kode atom-clang-format:

Format your C/C++/Obj-C/Javascript files with clang-format from inside atom. Requires clang-format to be installed and on your systems path.

More info on clang-format can be found here: http://clang.llvm.org/docs/ClangFormat.html http://clang.llvm.org/docs/ClangTools.html

Pengaturan untuk clang-format disimpan di dalam file .clang-format (tanda titik menandakan bahwa file tersebut secara default tersembunyi di file manager). Untuk dapat melihat file itu di file manager, beri perintah dengan menekan kombinasi kunci di keyboard Ctrl+H. Di sistem saya file itu terletak di:

/home/rumahku/.atom/packages/clang-format/node_modules/clang-format/.clang-format

Yang cukup membuat repot, sejauh yang saya ketahui sampai saat ini, file tersebut perlu disalin manual ke setiap direktori proyek (project).

pio007Gambar 7.

Solusinya sebenarnya cukup mudah, tetapi perlu dilakukan. Salin (copy) file .clang-format ke home directory, untuk mesin saya ini menjadi

/home/rumahku/.clang-format

Adapun isi dari file .clang-format untuk konfigurasi yang saya kehendaki adalah sebagai berikut:

---
Language: Cpp
BasedOnStyle: LLVM
BreakBeforeBraces: GNU
ColumnLimit: 100

Dengan konfigurasi ini maka setiap file sumber untuk C atau CPP (C++) akan terformat ulang setiap kali diberikan perintah menyimpan kode di file. Pengguna bisa juga memberikan perintah untuk melakukan format secara manual melalui menu atau dengan shortcut: shift-cmd-K. Adapun isi dari konfigurasi bisa disimulasikan secara online di sini; https://clangformat.com/ .

Referensi tentang clang format <<klik untuk membuka>>

 

Pada Gambar 2, terlihat untuk platform yang tidak (belum) didukung oleh PlatformIO, maka hasil kompilasinya berada di direktori yang sama dengan file sumber. Pada mode ini yang dimanfaatkan adalah text editor Atom.  Tetapi untuk platform dan framework yang sudah didukung oleh PlatformIO peletakan hasil kompilasi dan build akan berbeda.

pio008Gambar 8.

Oleh PlatformIO hasil kompilasi akan diletakkan di direktori ./pioenvs . Sekedar sebagai contoh;

/tmp/atmelavr-native-blink-116720-6546-1qphcr7/.pioenvs/native_avr/

Sekalipun proses upload biasanya dapat dilangsungkan secara otomatis dengan bantuan PlatformIO, bisa jadi ada kebutuhan untuk melakukan operasi dengan command line di Terminal;

pio009Gambar 9.

pio010Gambar 10.

Mengenai perbedaan antara file elf dengan bin dapat dibaca di sini.

Untuk plaftorm dan framework yang sudah didukung oleh PlatformIO, proses upload dapat dilakukan oleh PlatformIO. Syaratnya pengguna memberi informasi yang cukup agar perintah pengunggahan tidak salah. Konfigurasi disimpan di file platformio.io yang disimpan di masing-masing root direktori proyek, contohnya:

/home/rumahku/platformioSTM32F103/platformio.ini

Misalnya untuk STM32 (mikrokontroler STM32F103C8T6) yang telah didukung oleh PlatformIO (melalui nucleo_f103rb) isi platformio.ini adalah:

#
# PlatformIO Project Configuration File
#
# Please make sure to read documentation with examples first
# http://docs.platformio.org/en/stable/projectconf.html
#
[env:nucleo_f103rb]
platform = ststm32
framework = mbed
board = nucleo_f103rb
upload_protocol = stlink

pio011Gambar 11.

Pada arsitektur STM32 jika yang dipakai adalah stlink maka perlu ditambahkan keterangan
  upload_protocol = stlink   di file platformio.ini . Diskusi mengenai kesalahan yang terjadi ada di sini dan acuan lengkap konfigurasi dapat dilihat di sini.

Gambar 12. Hasil proses uploading oleh PlatformIO

Satu hal lain yang menarik yang saya temui adalah tentang penggunaan framework mbed pada platform ststm32 (STM32). File sumber harus disimpan dengan ekstensi .cpp, jika disimpan dengan ekstensi .c maka akan manghasilkan kesalahan:

pio013Gambar 13. Kesalahan kompilasi dengan framework mbed.

Penjelasan mengenai kesalahan ini terdapat di sini:

mbed is c++-based framework. You should use *.cpp extension.

Please change file extension from *.c to .cpp.

 

pio014Gambar 14.

 

 

Uji blinking led STM8 STM8S103F3P6

Di post sebelumnya telah memuat catatan uji coba dan setup untuk keluarga mikrokontroler produksi dari TI (Texas Instrument); MSP430, MSP432 dan Tiva C.  Pada catatan ini akan dipaparkan uji coba untuk mikrokontroler produksi dari STMicroelectronics (ST) yaitu salah satu anggota keluarga STM8, tepatnya μC STM8S103F3. Mikrokontroler STM8S103F3P6 adalah mirkokontroler 8-bit, sama dengan keluarga ATmega8535 (ATmega) dan ATtiny85 (ATtiny). Dan sama pula dengan keluarga AVR, STM8S103F3 dapat diprogram dengan software di sistem GNU/Linux seperti Ubuntu, Mint, BlankOn.

wp-1470912333051.jpegGambar 1. Uji pemrograman STM8 di GNU/Linux.

Untuk melakukan pemrograman singkat dan sederhana pada STM8 hanya diperlukan sebuah text editor seperti nano atau gedit dan terminal untuk mengunggah kode ke STM8.

ashampoo_snap10.pngGambar 2. Pemrograman pada terminal di GNU/Linux

 

Perangkat compiler yang dipergunakan untuk melakukan pemrograman pada STM8 (STM8S103F3P6) yang tersedia gratis tanpa batasan adalah SDCC. SDCC (Small Device C Compiler) dapat dipergunakan di sistem GNU/Linux maupun MS Windows. Untuk memprogram STM8 diperlukan SDCC dari versi yang sudah memiliki fasilitas untuk pemrograman STM8, misalnya di atas versi 3.5.0. Saya sendiri mempergunakan versi yang lebih baru:

$ sdcc -v
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.6.0 #9615 (Linux)
published under GNU General Public License (GPL)

 

Sebagaimana prinsip dasar saat mencoba mempelajari sesuatu yang intinya meminimalkan sedapat mungkin berbagai sumber/faltor masalah/kesalahan maka untuk menguji sistem ini pun sebaiknya mempergunakan contoh yang diperkirakan lebih dapat dipercaya akan menghasilkan pengujian yang baik. Atau setidaknya mengambil dari sumber yang sudah pernah melaporkan hasil pengujian dan melakukan modifikasi untuk memperbaiki bug atau kesalahan. Untuk uji coba ini, contoh yang dapat dipakai bersumber dari: http://technologyrealm.blogspot.co.id/2015/07/getting-started-with-stm8-development.html atau http://www.cnx-software.com/2015/04/13/how-to-program-stm8s-1-board-in-linux/. Keduanya mengacu pada sumber kode asli (stm8-examples-sdcc) yang sama yang kemudian dimodifikasi.

#include "stm8l.h"

int main() 
{
	int d;
	// Configure pins
	PB_DDR = 0x20; //ganti dari 0x80 ke 0x20
	PB_CR1 = 0x20; //ganti dari 0x80 ke 0x20
	// Loop
	do 
	{
		PB_ODR ^= 0x20; //ganti dari 0x80 ke 0x20
		for(d = 0; d < 29000; d++) { }
	} while(1);
}

Dalam file contoh yang sama dapat dilihat isi dari makefile. Konfigurasi berikut adalah hasil modifikasi dari pengaturan aslinya;

SDCC=sdcc
SDLD=sdld
OBJECTS=blinky.ihx
 
.PHONY: all clean flash
 
all: $(OBJECTS)
 
clean:
    rm -f $(OBJECTS)
 
flash: $(OBJECTS)
    stm8flash -c stlinkv2 -p stm8s103f3 -w $(OBJECTS)
 
%.ihx: %.c
 
    $(SDCC) -lstm8 -mstm8 --out-fmt-ihx $(CFLAGS) $(LDFLAGS) $<

Adapun isi lengkap dari file  asli  contoh terlihat di Gambar 1.

Gambar 3.

Untuk kompilasi tunggal, bisa dilakukan dengan perintah:

$ sdcc -lstm8 -mstm8 --out-fmt-ihx blinky.c

Berikutnya, untuk melakukan upload ke mikrokontroler STM8S103F3P6 diperlukan program stm8flash. Ada dua cara agar program ini dapat diinstalasi di komputer. Pertama dengan cara mengunduh (download) dari dengan alamat; https://github.com/vdudouyt/stm8flash/archive/master.zip. Cara lain adalah dengan mempergunakan git ($ sudo apt-get install git). Perintah yang dengan mempergunakan git adalah; git clone https://github.com/vdudouyt/stm8flash.git. Perintah lengkapnya adalah:

git clone https://github.com/vdudouyt/stm8flash.git

cd stm8flash
make
sudo make install

Perintah untuk mengunggah ke mikrokontroler dengan stm8flash dapat dilakukan dengan cara;

$ stm8flash -c stlinkv2 -p stm8s103f3 -w blinky.ihx

 

Saya mempergunakan versi papan sistem yang murah dari mikrokontroler STM8S103F3P6 sebagaimana yang telah dilaporkan di dua situs ini;

http://www.cnx-software.com/wp-content/uploads/2015/01/STM8S_Board_Schematics.png
Gambar 4. [image credit: cnx-software.com]

Papan yang saya miliki hampir serupa dengan tampilan pada Gambar 4. Tetapi posisi led untuk pengguna berbeda. Pada papan terdapat dua led, led yang berwarna biru adalah indikator catu daya dan memiliki tulisan penanda PWR. Sedangkan led yang berwarna merah dengan tulisan penanda TEST adalah led yang dapat dipergunakan oleh programer. Led merah pada papan yang saya miliki terhubung pada pin PB5 (port B5) dan bukan pada Port D atau Port E. Tampilan yang lebih tepat seperti pada Gambar 5.

Image

Gambar 5. [image credit:  forum.hobbycomponents.com]

Untuk papan yang saya miliki ada saat pertama mikrokontroler tidak berhasil diprogram. Seperti umumnya solusi permasalahan teknis seperti ini sudah pernah dikemukakan [link]. Caranya pertama adalah dengan mengunduh (download) file berikut; optdefault.bin . Jalu menjalankan perintah;

$ stm8flash -c stlinkv2 -p stm8s103f3 -s opt -w optdefault.bin

Setelah itu baru jalankan perintah;

$ stm8flash -c stlinkv2 -p stm8s103f3 -w blinky.ihx

 

Cara lain untuk melakukan pemrograman adalah dengan menggunakan make dan makefile. Tentang tutorial mengenai makefile sendiri sudah saya cantumkan daftar urutan tutorial pada bagian akhir catatan sebelumnya. Misalnya untuk contoh ini pemanggilan make dapat dilakukan sesuai tujuan. Untuk menghasilkan file intel hex, cukup dengan memanggil make dari dalam direktori file C sumber.

$ make

Untuk melakukan uploading ke mikrokontroler, bisa dilakukan dengan perintah yang sesuai isi penamaan di dalam makefile. Misalnya untuk contoh ini;

$ make flash

 

wp-1470913902302.jpegGambar 6.

 

Saya mempergunakan ST-Link V2 compatible dongle. Untuk keperluan ini hanya bagian satu sisi dari header yang dipergunakan. Jalur untuk sinyal RST (untuk NRST), SWIM, GND, 3.3V. Hubungan dari dongle ini ke papan mikrokontroler tidaklah lurus. Hubungan antara GND dan SWIM tidak lurus akibat letak pin yang berbeda.

wp-1470808435627.jpegGambar 7.

 

img_20160810_020354.jpgGambar 8. Hasil pengukuran pada pin PB5

img_20160810_020654.jpgGambar 9.

Dari situs STMicroelectronics terdapat beberapa dokumen yang bisa dipakai untuk sember belajar. Diantaranya saya urutkan sebagai berikut;

  • AN2752: Getting started with the STM8S and STM8A [download]
  • RM0016: STM8S series and STM8AF series 8-bit microcontrollers
    [download]
  • DS6120: STM8S103F3 datasheet [download]
  • PM0051: How to program STM8S and STM8A Flash program memory and data EEPROM
    [download]
  • PM0044: STM8 CPU programming manual [download]