STM8 jest 8-bitową rodziną STMicroelectronics z pamięcią Flash, EEPROM-em, sprzętowymi timerami, ADC, UART-em, SPI, I²C, watchdogami i jednoprzewodowym interfejsem SWIM. Układy STM8S można znaleźć w panelach AGD, odkurzaczach, elektronarzędziach, sterownikach wentylatorów i prostych napędach. Są znacznie bliższe współczesnemu mikrokontrolerowi niż Z80: nie wymagają zewnętrznego RAM-u, ROM-u ani układu czasowego.

Baseline tego artykułu stanowi STM8S105K6. Ma rdzeń 16 MHz, 32 KB Flash, 2 KB RAM, 1 KB EEPROM, zaawansowany 16-bitowy timer z czterema kanałami capture/compare i wyjściami komplementarnymi, dwa dodatkowe timery 16-bitowe, UART, SPI, I²C, 10-bitowy ADC oraz dwa watchdogy. Pozwala to zbudować prosty kontroler fixed-wing, moduł I/O albo laboratoryjny regulator multirotora bez dokładania zewnętrznych peryferiów czasowych.

Który STM8 znaleziono#

Linia Typowe cechy Ocena
STM8S001/003/103 mała pamięć, 16 MHz, podstawowe timery i interfejsy dobry moduł I/O, bardzo ciasny główny FC
STM8S105 do 32 KB Flash, 2 KB RAM, bogatsze timery dobry baseline dla prostego regulatora
STM8S207/208 większa pamięć i liczba peryferiów wartościowy kandydat z większego AGD
STM8S007/20x value line zależnie od modelu do 64 KB i bogate I/O sprawdzać dokładny wariant
STM8L niskie zużycie energii, inne napięcia i peryferia dobry rejestrator/sensor node, osobny manual
STM8AF/AL warianty automotive interesujące, ale wymagają datasheetu konkretnej linii

Końcówki F3, K6, C6 nie są kosmetyczne. Kodują pamięć i obudowę. STM8S103F3P6 oraz STM8S105K6T6 nie mają tego samego pinoutu ani zasobów.

W wariancie ośmiopinowym STM8S001 część pinów ma kilka krytycznych funkcji. W projekcie może zabraknąć jednocześnie SWIM, SPI, UART i wystarczającej liczby wyjść. Dlatego „ma SPI i PWM” w tabeli rodziny nie gwarantuje, że wszystkie funkcje są dostępne równocześnie.

Co daje STM8S105K6#

Według dokumentacji producenta:

  • 32 KB Flash;
  • do 2 KB RAM;
  • 1 KB true data EEPROM;
  • wewnętrzny, trymowalny oscylator 16 MHz;
  • zaawansowany timer TIM1 z czterema kanałami capture/compare, trzema wyjściami komplementarnymi i dead-time;
  • timery TIM2/TIM3 zależnie od wariantu;
  • UART, SPI do 8 Mbit/s i I²C do 400 kbit/s;
  • 10-bitowy ADC z trybem scan i analog watchdog;
  • independent watchdog i window watchdog;
  • power-on/power-down reset oraz clock security system;
  • zasilanie 2,95–5,5 V dla opisywanej linii.

Ostatni punkt jest istotny: typowy STM8S105 nie jest układem nominalnie zasilanym 1,8 V. Sensor 1,8/3,3 V wymaga właściwej domeny i translacji poziomów. Linie STM8L mają inne zakresy, ale nie należy mieszać ich datasheetów.

SWIM: programowanie jednym przewodem#

Single Wire Interface Module używa dwukierunkowej linii open-drain oraz resetu. Umożliwia programowanie i debugowanie pamięci, rejestrów oraz peryferiów. Typowe złącze zawiera:

VDD_TARGET
SWIM
GND
NRST

VDD_TARGET jest napięciem odniesienia dla interfejsu; nie każdy ST-Link zasila cel. Na płycie dawcy trzeba potwierdzić, czy stabilizator jest zasilany osobno i czy nie dochodzi do back-powering przez linię programatora.

UM0470 opisuje SWIM jako interfejs asynchroniczny open-drain. Podczas pracy CPU może wykonywać odczyty i zapisy RAM-u oraz rejestrów on-the-fly; po zatrzymaniu dostępna jest szersza przestrzeń pamięci. Pin SWIM może być również GPIO aplikacji, co bywa problemem na płytach produkcyjnych. Jeśli steruje nim inny układ, należy odizolować obciążenie rezystorem lub zworą.

Read-out protection#

STM8 używa option byte ROP. Dla STM8S105 wartość ochrony blokuje odczyt i modyfikowanie Flash oraz Data EEPROM przez SWIM. Dokumentacja RM0016 podaje, że wyłączenie ROP przez programowanie option byte powoduje automatyczne skasowanie programu, danych i option bytes.

To prowadzi do ważnego rozróżnienia:

  • nie można odczytać firmware dawcy;
  • można odzyskać sam mikrokontroler przez pełne kasowanie, jeśli SWIM działa i procedura rodziny na to pozwala;
  • oryginalnego programu nie da się później odzyskać.

Przed zdjęciem ochrony należy zachować zdjęcia, oznaczenie płyty, wynik próby połączenia i decyzję o utracie programu. Jeśli urządzenie nadal ma wartość użytkową, eksperyment wykonuje się na drugim egzemplarzu.

Option bytes#

Option bytes konfigurują ROP, obszar user boot code, alternatywne mapowanie funkcji, watchdog, zegar i inne cechy. Większość jest zapisywana jako wartość i jej dopełnienie, aby wykryć uszkodzenie.

Szczególnie ważne są:

  • alternate function remapping — może przenieść PWM na inne piny;
  • hardware watchdog — może działać od startu niezależnie od kodu;
  • clock option i źródło zegara;
  • UBC — chroniony obszar boot code;
  • ROP — ochrona odczytu.

Program testowy powinien najpierw używać minimalnego, udokumentowanego zestawu option bytes. Zapis przypadkowych wartości może odciąć interfejs, przełączyć pin albo uruchomić watchdog przed inicjalizacją.

Oryginalna płyta jako zestaw uruchomieniowy#

Płyta od odkurzacza lub panelu AGD często zawiera:

  • właściwe odsprzęganie STM8;
  • rezonator albo pozostawione miejsce na niego;
  • reset;
  • pady SWIM;
  • transceiver UART/LIN;
  • dzielniki ADC;
  • driver silnika lub przekaźników;
  • stabilizator 5 V.

Najpierw należy odseparować obciążenia wykonawcze. Rezystory prowadzące do drivera można zdjąć, aby przypadkowy stan portu nie uruchomił silnika. Dopiero potem płyta staje się nośnikiem laboratoryjnym.

Nie wolno zasilać całego modułu sieciowego przez oryginalne wejście tylko po to, żeby uzyskać 5 V. Bezpieczniejszy jest wtrysk kontrolowanego napięcia bezpośrednio za stabilizatorem po potwierdzeniu, że odłączono ścieżki do nieizolowanej domeny.

Architektura kontrolera STM8S105#

IMU 3,3 V -- level shifting -- SPI ----+
                                        |
RC input ----------------> TIM capture  |
barometr ---------------------- I²C     v
                                  +-------------+
bateria/prąd -> dzielnik -> ADC ->| STM8S105K6 |
                                  | 16 MHz      |
                                  | TIM1/TIM2   |--> serwa / emulator ESC
                                  | IWDG + WWDG |--> PhotoMOS migawki
                                  +------+------+ 
                                         |
                                        UART -> HIL/loger

Przy zasilaniu STM8 5 V cyfrowe wyjścia do IMU 3,3 V wymagają translacji. Alternatywnie trzeba wybrać dokładny STM8 pracujący poprawnie przy 3,3 V oraz sprawdzić maksymalną częstotliwość dla tego napięcia.

Przydział timerów#

Proponowany przydział dla STM8S105:

Funkcja Blok
tick pętli 1 kHz TIM4 albo kanał timera ogólnego
wyjścia serw/ESC emulator TIM1 capture/compare
wejście RC/PPM TIM2 input capture
timestamp IMU swobodnie biegnący timer 16-bitowy z licznikiem przepełnień
timeout migawki licznik programowy aktualizowany przez tick lub wolny kanał compare

TIM1 jest najcenniejszym zasobem. Ma preloading, kanały capture/compare i break input. Warto pozostawić go wyłącznie wyjściom krytycznym. Migawka nie powinna zajmować kanału zaawansowanego, jeśli impuls można zakończyć przez scheduler.

16-bitowy licznik przepełnia się szybko. Przy 1 MHz okres wynosi 65,536 ms. Timestamp 32-bitowy tworzy się, zliczając przepełnienia i odczytując atomowo starszą oraz młodszą część.

Częstotliwość pętli i budżet CPU#

Rdzeń 16 MHz nie wykonuje każdej instrukcji w jednym cyklu. Nie należy przeliczać 16 MHz wprost na 16 000 instrukcji w okresie 1 ms. Budżet wyznacza się listingiem i pomiarem.

Dla prostego fixed-wing rozsądny punkt startowy to:

  • tick 1 kHz dla znaczników i wejść;
  • odczyt żyroskopu 500–1000 Hz;
  • filtr i regulator rate 500 Hz;
  • regulator attitude 100–250 Hz;
  • serwa 50–250 Hz według ich dokumentacji;
  • ADC 50–200 Hz;
  • telemetria 10–25 Hz.

Pin profilujący obejmuje każdą funkcję. Analizator powinien pokazać czas maksymalny przy jednoczesnym odbiorze UART, przerwaniu data-ready i aktualizacji wszystkich wyjść.

SPI i obsługa IMU#

SPI STM8S105 osiąga do 8 Mbit/s według karty produktu. Pierwszy sterownik implementuje tylko:

  • zapis jednego rejestru;
  • odczyt rejestru WHO_AM_I;
  • odczyt burst osi żyroskopu i akcelerometru;
  • timeout flag sprzętowych;
  • reset magistrali po błędzie;
  • licznik próbek oraz timestamp data-ready.

Kod nie czeka bez końca na flagę:

bool spi_wait_rx(uint16_t timeout)
{
    while (!(SPI_SR & RXNE_MASK)) {
        if (--timeout == 0) {
            spi_fault_count++;
            return false;
        }
    }
    return true;
}

Nazwy rejestrów są pseudokodem. Właściwe symbole zależą od biblioteki nagłówkowej. Ważna jest własność: każda pętla oczekująca ma limit, a błąd sensora dociera do maszyny stanów.

Filtr i regulator#

Przy 2 KB RAM-u i 16 MHz pełny EKF jest niewłaściwym celem. Stabilizację można oprzeć na:

  • kalibracji biasu żyroskopu na postoju;
  • filtrze dolnoprzepustowym o stałych współczynnikach;
  • filtrze komplementarnym roll/pitch;
  • regulatorze rate i wolniejszym regulatorze attitude;
  • arytmetyce Q15/Q-format;
  • jawnej saturacji całek.

Współczynnik filtru stałoprzecinkowego:

y[k] = y[k-1] + alpha * (x[k] - y[k-1])

można przechowywać jako Q15. Pośredni iloczyn musi być 32-bitowy. Należy przeanalizować overflow dla maksymalnego sygnału sensora i błędu regulatora.

Wyjścia i stan resetu#

Preload rejestrów compare umożliwia zmianę szerokości na granicy okresu. Kanały powinny aktualizować się synchronicznie. Break input TIM1 może natychmiast wymusić bezpieczny stan wyjść, jeśli zostanie połączony z monitorem zasilania lub zewnętrznym sygnałem fault.

Zewnętrzne rezystory pull-down/pull-up definiują stan zanim firmware uruchomi timer. Po każdym źródle resetu najpierw ustawia się bezpieczne latch values, potem kierunek portów, a dopiero na końcu włącza alternate function timera.

Nie wszystkie ESC interpretują brak impulsu identycznie. Stan resetu należy sprawdzić z emulatorem, a następnie z konkretnym urządzeniem bez silnika i śmigła.

Watchdogi#

STM8S ma independent watchdog oraz window watchdog. IWDG pracuje z osobnego niskoczęstotliwościowego zegara, więc wykrywa również część awarii głównego zegara. WWDG wymaga odświeżenia w odpowiednim oknie i może ujawnić zarówno zbyt późne, jak i zbyt wczesne wykonanie.

Praktyczna strategia:

  1. ISR tick ustawia znacznik nowej ramki;
  2. każde zadanie krytyczne ustawia własny bit ukończenia;
  3. health monitor sprawdza komplet bitów i brak nowych faultów;
  4. tylko health monitor odświeża watchdog;
  5. po resecie firmware odczytuje flagi resetu i zwiększa licznik diagnostyczny.

Odświeżanie IWDG bezpośrednio w przerwaniu timera jest błędem: timer może działać, gdy regulator lub SPI utknęły.

ADC i analog watchdog#

10-bitowy ADC wystarcza do pomiaru napięcia baterii, prądu i temperatury. Dzielnik wejściowy projektuje się tak, aby maksymalne napięcie wraz z tolerancją nie przekraczało zakresu ADC. Kondensator przy wejściu oraz impedancja źródła muszą pozwolić kondensatorowi sample-and-hold na ustalenie napięcia.

Analog watchdog może sygnalizować przekroczenie zakresu bez ciągłego porównywania w kodzie. Nie zastępuje sprzętowej ochrony pakietu ani regulatora. Jest dodatkową warstwą, a jego próg trzeba przeliczyć na tolerancję VDD, dzielnika i ADC.

EEPROM konfiguracji#

True data EEPROM ma znacznie większą deklarowaną wytrzymałość niż typowy emulowany zapis w code Flash, ale nadal nie jest loggerem 1 kHz. Konfigurację przechowuje się w dwóch slotach:

magic | schema_version | generation | payload | CRC

Przy starcie wybierany jest najnowszy poprawny rekord. Nowy zapis powstaje w drugim slocie, jest weryfikowany, a dopiero potem uznawany za aktywny. Utrata zasilania nie może pozostawić jedynej kopii w połowie zapisu.

Wyzwalanie aparatu#

GPIO steruje LED transoptora albo PhotoMOS-u. Aparat pozostaje galwanicznie oddzielony. Impuls 120–200 ms generuje wolne zadanie, ale jego zakończenie musi mieć gwarantowany deadline.

Warunek może pochodzić z wysokości, temperatury albo komendy HIL. Maszyna stanów ma IDLE, QUALIFY, PULSE, LOCKOUT. Dzięki temu zaszumiony próg nie wykonuje serii zdjęć. Czas kwalifikacji i blokady są przechowywane w konfiguracji z CRC.

Narzędzia#

Oficjalne elementy ekosystemu obejmują:

  • ST-LINK ze wsparciem SWIM;
  • ST Visual Programmer do Flash, EEPROM i option bytes;
  • ST Visual Develop oraz starsze narzędzia producenta;
  • STM Studio do obserwacji zmiennych podczas pracy;
  • kompilatory komercyjne i społecznościowy SDCC.

Stan wsparcia poszczególnych aplikacji i systemów operacyjnych zmienia się. Archiwalne GUI nie powinno być jedynym sposobem odtworzenia projektu. W repozytorium warto zachować skrypt budowania, wersję kompilatora, wynik --version, plik HEX oraz komendę programowania.

SDCC może być dobrym wyborem dla odtwarzalnego laboratorium, ale nie gwarantuje zgodności rejestrów między wszystkimi STM8. Nagłówki muszą odpowiadać konkretnemu modelowi, a sekcje przerwań i startup należy sprawdzić w mapie oraz listingu.

Kwalifikacja odzyskanego STM8#

  1. połącz SWIM na oryginalnej płycie;
  2. odczytaj device ID oraz option bytes, o ile ROP pozwala;
  3. zdecyduj o pełnym kasowaniu;
  4. zapisz test pamięci i verify;
  5. uruchom clock-out lub przebieg TIM;
  6. sprawdź UART i SPI długim transferem;
  7. przetestuj ADC kilkoma napięciami;
  8. wymuś IWDG i WWDG;
  9. obniż VDD przez zakres resetu;
  10. obserwuj wszystkie wyjścia podczas power-cycle;
  11. wykonaj test po ogrzaniu i schłodzeniu w bezpiecznym zakresie laboratoryjnym;
  12. zapisz wyniki pod identyfikatorem egzemplarza.

Element z aktywnym ROP, który daje się skasować i przechodzi test, może zostać pełnowartościowym laboratorium. Nie odzyskuje się jednak oryginalnej aplikacji.

STM8S103 kontra STM8S105#

Cecha STM8S103F3 STM8S105K6
Flash do 8 KB 32 KB
RAM około 1 KB zależnie od wariantu do 2 KB
piny małe obudowy LQFP/QFN 32 i większe warianty linii
timery podstawowy zestaw + TIM1 bogatszy zestaw kanałów
zastosowanie moduł I/O, prosty regulator główny prosty FC

8 KB Flash może wystarczyć na odczyt IMU i dwa regulatory, ale debug telemetryczny, bootloader i obsługa wielu błędów szybko zużyją przestrzeń. STM8S105 daje rozsądniejszy margines.

Realistyczne role#

Kontroler fixed-wing#

Dwa serwa, wejście RC, IMU SPI, barometr I²C, ADC baterii oraz UART mieszczą się w zasobach STM8S105. Algorytm powinien pozostać mały: filtr komplementarny, rate PID, ograniczenie attitude i prosty failsafe.

Moduł wykonawczy#

STM8 otrzymuje przez UART/CAN-transceiver polecenia z głównego FC, generuje zsynchronizowane PWM, mierzy zasilanie i pilnuje heartbeat. To często lepsza rola dla układu z odzysku niż samodzielny autopilot.

Stanowisko HIL multirotora#

TIM1 generuje cztery kanały, SPI odbiera próbki, a UART komunikuje się z modelem. Można zmierzyć, czy regulator dotrzymuje 1 kHz. Dopiero taki wynik uzasadnia dalsze próby.

Kiedy wybrać coś innego#

STM8 nie jest dobrym wyborem, gdy wymagane są:

  • duży EKF i wiele sensorów;
  • karta SD z systemem plików;
  • USB, CAN i kilka szybkich SPI jednocześnie;
  • DShot z rozbudowaną telemetrią przy dużej liczbie kanałów;
  • kryptografia i aktualizacje sieciowe;
  • kompatybilność z ArduPilot/PX4 bez napisania portu.

W takich przypadkach odzyskany STM32 albo nowa płytka FC jest racjonalniejsza. STM8 ma wartość jako deterministyczne, małe laboratorium i platforma ucząca gospodarowania timerami.

Laboratorium fc-lab-stm8#

Katalog git/fc-lab-stm8 zawiera przenośny rdzeń, testy, runner HIL i szkielet SDCC dla STM8S105. Port rozdziela tick TIM4, wyjścia TIM1, SPI do IMU i zezwolenie na odświeżenie IWDG.

make check potwierdza logikę hostową. Nie zastępuje odczytu option bytes, decyzji o ROP, sprawdzenia wektora TIM4 ani pomiaru poziomów 5/3,3 V. Pełna checklista targetu znajduje się w target/PORTING.md.

Powiązane tematy#

Przypisy#

  1. STMicroelectronics, STM8S105x4/6 Data Sheet, DS5855 — pamięć, napięcie, zegary, timery, interfejsy, ADC i option bytes.
  2. STMicroelectronics, RM0016 STM8S/STM8AF Reference Manual — rejestry peryferiów, Flash, ROP, timery, watchdogi i zegary.
  3. STMicroelectronics, UM0470 STM8 SWIM communication protocol and debug module — warstwa elektryczna, programowanie i debug on-the-fly.
  4. STMicroelectronics, ST Visual Programmer for STM8 — obsługiwane tryby programowania Flash, EEPROM i option bytes.
  5. STMicroelectronics, AN2639 Soldering recommendations — ryzyko wilgoci i uszkodzeń podczas ponownego procesu cieplnego.

Źródła z centralnego rejestru

  1. STMicroelectronics STM8S105K6 [oficjalna karta MCU; 16 MHz, do 32 KB Flash, EEPROM, timery, ADC, SPI, I²C i UART]
  2. STMicroelectronics STM8S105x4/6 Data Sheet [datasheet producenta; pinout, charakterystyki elektryczne, pamięć, ROP i option bytes]
  3. STMicroelectronics RM0016: STM8S/STM8AF Reference Manual [oficjalny podręcznik peryferiów, zegarów, timerów, watchdogów i pamięci]
  4. STMicroelectronics UM0470: STM8 SWIM communication protocol and debug module [oficjalny opis jednoprzewodowego interfejsu programowania i debugowania SWIM]
  5. STMicroelectronics ST Visual Programmer for STM8 [oficjalne narzędzie do programowania Flash, EEPROM i option bytes przez SWIM]
  6. STMicroelectronics AN2639: Soldering recommendations and package information [nota aplikacyjna producenta; profile cieplne, wilgoć, MSL i ryzyko uszkodzenia obudów podczas lutowania]
  7. STMicroelectronics: STM32WB BLE HID Selfie [oficjalny przykład BLE HID używający klawisza głośności do wyzwalania zdjęcia]