I tak wczoraj przyszłą płytka (w sumie to kilka) z STM8S003F3. O samym układzie nie będę pisał bo każdy to znajdzie w sieci ale opiszę swoje początki.
Na starcie mała przykrość nie ma gcc ale nie ma też tragedii jest darmowy (opensource) kompilator sdcc (http://sdcc.sourceforge.net) poza STM8 obsługuje jeszcze (kilka innych mikrokontrolerów).
No to trzeba przygotować środowisko. Ponoć są jakieś gotowe na windowsy ale że ja jestem odmieńcem (używam linuxa) to opis będzie dotyczyć tego systemu.
Co potrzebujemy:
1) kompilator
2) program do wgrania wsadu
3) jakiś edytor do pisania
i na tym można by poprzestać ale przyda się jeszcze plik z makrami i definicjami rejestrów, można to zrobić samemu na podstawie DS/RM ale można też skorzystać z gotowych. Na githubie jest tego całą masa, różni autorzy przyjmują różne standardy. Ja postanowiłem skorzystać z tego udostępnianego przez producenta. Jednak z pewnym wyjątkiem.
Na stronie ST (https://www.st.com/en/embedded-software ... m8069.html) jest całą biblioteka taki SPL dla STM8S/A jednak że SPL za specjalnie mi nie przypada to wykorzystuję tylko plik stm8s.h w którym są makra do rejestrów i struktury danych.
Dla potrzeb sdcc należy też go trochę zmodyfikować gdyż przystosowany jest on dla komercyjnych kompilatorów (raisonance i cosmic).
No to zaczynamy:
Poniższe kroki dotyczą Dystrybucji Debian (Buster) z której obecnie korzystam w innych dystrybucjach pochodnych od Debiana będzie podobnie jak nie tak samo.
1) instalacja kompilatora.
Kod: Zaznacz cały
#apt-get install sdcc sdcc-libraries
Z pomocą przychodzi github i polecany program stm8flash (https://github.com/vdudouyt/stm8flash)
Kod: Zaznacz cały
$git clone https://github.com/vdudouyt/stm8flash
Kod: Zaznacz cały
#apt-get install libusb-1.0-0-dev
Jak wszystko skompletowane to kompilacja programu:
Kod: Zaznacz cały
$cd stm8flash
$make
3) edytor to już każdy jakiś ma

Teoretycznie można już pisać kod kompilować i wgrywać ale ułatwieniem będzie Makefile w IDE jak Eclipse czy Atolic (też eclipse) Makefile się nie przejmujemy bo samo środowisko tworzy go dynamicznie przed kompilacja, dla użytkownika jest to niejako niewidzialny proces.
Ja swój Makefile poskładałem z kliku istniejących + dopisałem kilka swoich rzeczy.
Cłego nie będę prezentował wszystko z przykładowym projektem będzie w paczce na końcu posta. Zamysł jest taki że projekt składa się z 3 katalogów: bin - do którego trafia efekt końcowy pracy (między innymi plik ihex), inc - miejsce na pliki nagłówkowe, src - katalog dla plików źródłowych c.
Tak wygląda to u mnie:

W edytorze po lewej widać strukturę projektu i w zakładkach otwarte pliki. Jedynym wyjątkiem jest plik od ST (stm8s.h) który trzymam poza projektem (żeby nie musieć go za każdym razem dodawać do każdego projektu) a to jakie makra będą wykorzystane (czasami adresy rejestrów są różne dla różnych mikrokontrolerów) w Makefile jest przekazana zmienna dla prekompilatora z jakiego uC korzystamy w projekcie i jakich makr ma użyć.
No dobra to prosty kod do miagania LED-em na płytce podpiętym do pinu PB5, a miganie na przerwaniach TIM4.
główny kod plik main.c
Kod: Zaznacz cały
#include "stm8s.h"
#include "stm8s_it.h"
#include "common.h"
int main(void) {
setup();
rim();
while(1) {
}
}
Kod: Zaznacz cały
#include "stm8s.h"
#include "common.h"
void setup(void) {
// GPIO
GPIOB->DDR |= LED;
GPIOB->CR1 |= LED;
//Tim4
TIM4->PSCR = TIM4_PSCR_PSC; // pre. 128
TIM4->ARR = 99;
TIM4->IER |= TIM4_IER_UIE;
TIM4->CR1 |= TIM4_CR1_CEN;
}
Kod: Zaznacz cały
#include "stm8s.h"
#include "stm8s_it.h"
#include "common.h"
void TIM4_update(void) __interrupt (IE_TIM4_OVR_UIF) {
static uint8_t sec = 100;
TIM4->SR1 &= ~TIM4_SR1_UIF;
if( !sec-- ) {
ChgBit(GPIOB->ODR, 5);
sec = 100;
}
}
Kod: Zaznacz cały
#ifndef STM8S_IT__H
#define STM8S_IT__H
/* Interrupt numbers */
#define IE_TLI 0
#define IE_AWU 1
#define IE_CLK 2
#define IE_EXTI0 3
#define IE_EXTI1 4
#define IE_EXTI2 5
#define IE_EXTI3 6
#define IE_EXTI4 7
#define IE_SPI 10
#define IE_TIM1_OVR_UIF 11
#define IE_TIM1_CAP_COM 12
#define IE_TIM2_OVR_UIF 13
#define IE_TIM2_CAP_COM 14
#define IE_UART1_TX 17
#define IE_UART1_RX 18
#define IE_I2C 19
#define IE_ADC1_EOC 22
#define IE_TIM4_OVR_UIF 23
#define IE_FLASH 24
void TIM4_update(void) __interrupt (IE_TIM4_OVR_UIF);
#endif
No dobra reszt nie zamieszczam będzie do pobrania na końcu.
Teraz co do samej kompilacji. Jak wspomniałem jest Makefile więc będąc w katalogu projektu możemy skorzystać z 4 poleceń:
1) make - kompilacja projektu
2) make clena - sprzątanie po kompilacji
3) make size - wyświetli ile zajmuje wsad (niestety sdcc nie ma jeszcze statystyk wykorzystania pamięci)
4) make flash (wgranie wsadu do układu)
No i oczywista oczywistość żeby wgrać potrzebujemy jeszcze programator najlepiej ST-LINK2 (więc jak nie samodzielnego to można wykorzystać ten z płytek Nucleo czy Doscovery od STM).
A pinologia do podłączenia:
1) GND
2) NRST
3) SWIM

Plik z projektem poniżej jedyne co trzeba zmienić to w Makefile wiersz:
Kod: Zaznacz cały
BASE_HEADERS = /home/misiek/workspaces/stm8/include
Jak wspomniałem to początek drogi z STM8 i sdcc.
Będę musiał jeszcze sprawdzić openocd bo ponoć ma możliwość debugowania po SWIM więc być może pojawi się jeszcze jakiś wpis.
A tymczasem zachęcam do zabawy z 8bit ale jakże urokliwym w porównaniu z AVR.