Generic STM8S103 breakout board

These simple breakout boards are available on aliexpress for well under one Dollar (I got mine for 67 cent each, including shipping from China). These boards are my main development platform.

Image of the STM8S103 board


The hardware features are quite similar to an ATmega8:

Boardname stm8blue
Clock 16MHz, internal oscillator
Flash 8kB
EEPROM 640 byte
I/O voltage 3.3V
serial connections UART, SPI, I2C
PWM 4 (up to 7 via alternate mapping)
ADC 5 channel, 10 bit
LED PB5 (Arduino D3), active low, shared with I2C, red
programming interface SWIM, no serial bootloader
USB connector mini, power only (data lines not connected)

One (red) LED is connected to GPIO PB5 (CPU pin 11). This LED is low active. Please keep in mind that this is one of the I2C signals and using the LED blocks the I2C bus. The push button is for reset. The CPU runs on 3.3V, a linear regulator is integrated on the board. The micro USB connector is only for (5V) power supply, the data lines are not connected.

All CPU pins are easily accessible on (optional) pin headers (pitch 2.54mm, perfect for breadboards).

They are very similar to the ESP14 Wifi-boards and most programs will work fine on those chinese gems as well.

Connection to the flash tool

I am using the ST-Link V2 compatible flash tool in the green plastic housing. The one in the metal housing uses a different pinout.

Connection to the flashtool:

Signal name P3 on CPU board Green flash tool Metal flash tool
3V3 1 2 7
SWIM 2 5 5
GND 3 7 3
NRST 4 9 1

Crap alert

Due to bad PCB production quality, some more recent lots (as of 2020) of the stm8blue boards seem to have either no working connection to GND on the SWIM connector or a short circuit from the SWIM pin to GND.

A nasty short to GND The SWIM pin is shortend to GND

Try connecting GND to the other GND board pin or power the board via USB.

Most boards ship with a pre-programmed blinky. If the LED blinks when the board is powered via USB but doesn't when it is only connected to the flash tool, your board is probably missing the GND connection.

Unlocking a write protected MCU

My breakout boards came preprogrammed with a blink program and with active write protection bits. For unlocking before first use using the command line:

stm8flash -cstlinkv2 -pstm8s103?3 -u

The same can be done from the Arduino IDE by clicking on Tools->Burn Bootloader after selecting an STM8 based board and choosing the correct programmer type (ST-Link V2). The name of this menu entry is not self-explanatory, but I couldn't find any way to change it or to add another entry with a better name. (If you know how, please open an issue)

The required binary for stm8flash is included in the download of the automatic install. On Windows systems it can be found in the directory AppData\Local\Arduino15\packages\sduino\tools\STM8Tools\2019.02.05\win.

A GUI alternative is the STVP tool by ST, but this involves installing another software package (see issue#85).

Pin number mappings

The Arduino environment uses its own pin numbering scheme independent from the physical CPU pin numbers. Many Arduino sketches and libraries contain hard-coded assumptions about the number of pins with special functions. Ideally, all these numbers would be the same and all programs could be compiled without changes.

Here I discuss some possible pin mapping schemes and check how close we could get to the ideal mapping. Unfortunatly, it turns out that a perfect mapping is not possible.

In the end I chose a simple geometric numbering for the square UFQFPN20 package starting with port pin PA1 and counting up from 0. This results in this mapping:

STM8S103 breakout board pin mapping

sduino pin STM8S103 CPU port pin
0-2 PA1-PA3 (PA1 and PA2 only weak output drivers)
3-4 PB5-PB4 (reverse order)
5-9 PC3-PC7
10-15 PD1-PD6

pros of this approach:

cons of this approach:

I am still not really happy with this mapping. Instead of simplifing things it only adds another layer of abstraction and confusion. To avoid this I added definitions for the regular CPU pin names like PA1 and PD2. In the end, this notation seems to be a lot easier to me. I am open for suggestions for a better pin number mapping.

The chosen pin mapping for the STM8S103 (possible alternate function in paratheses):

Phys. STM8 pin Name Functions Geometrical mapping special funcion
1 PD4 UART_CLK/T2-1/beep 13 PWM
2 PD5 TX/Ain5 14 Analog A3
3 PD6 RX/Ain6 15 Analog A4
5 PA1 (OscIn, no HS) 0
6 PA2 (OscIn, no HS) 1
10 PA3 SS/T2-3 2 PWM
11 PB5 SDA LED 3
12 PB4 SCL 4
13 PC3 T1-3/[T1-n1] 5 PWM, (n~)
14 PC4 T1-4/Ain2/[T1-n2] 6 PWM, Analog A0, (n~)
15 PC5 SCK/[T2-1] 7 (~)
16 PC6 MOSI/[T1-1] 8 (~)
17 PC7 MISO/[T1-2] 9 (~)
18 PD1 (SWIM) 10
19 PD2 Ain3/[T2-3] 11 Analog A1, (~~)
20 PD3 Ain4/T2-2 12 PWM, Analog A2

Special pins

The pins D3/D4 (SDA/SCL, PB5/PB4) are different from the others as they are true open drain pins. That means, they only can drive the output low or open. To drive it high, they require an external pull-up resistor. This is the reason why the LED on this breakout board is connected between +3.3V and the pins and not between the pin and GND as usual. This way it is possible to drive the LED by writing a zero to the output register.

D5/D6 (PA1/PA2, OscIn/OscOut) are weaker than the other pins. Try avoiding these pins for LEDs and other higher current applications.


Schematic of the STMS103 board