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:

 

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]