STM8S001J3 - The Good, the Bad and the Ugly... a GDB
Podarilo sa mi získať zopár kúskov STM8S001J3 ešte skôr než sa vovalia do skladov vašich obľúbených distribútorov súčiastok, tak prinášam k nemu niekoľko postrehov.
jaromir, 11.09.2017-07:52
The GoodV ST sa evidentne snažili chytiť na overený koncept 8-pinovych mikrokontrolerov, pomerne dlhú dobu (~20 rokov) vyrábaných firmami ako je Microchip čí NXP. Vychádzajú z dnes už bežnej rodiny STM8S a sú dostupné len v SOIC8 púzdre.
STM8S001J3 je veľmi podobný typu STM8S003F3 - a to tak veľmi, že majú rovnaký errata dokument, naznačujúci že vnútri sa skrýva rovnaký čip. To je výhodné pre výrobcu, lebo vývoj mikrokontroléra aj kremík samotný je potom lacnejší, takže je to v tomto ohľade výhodné aj pre zákazníka, na cenu ďalej tlačí aj menšie púzdro.
The Bad
Druhou stranou tej istej mince je ale aj to, že nabondovanie "veľkého" čipu do malovývodového púzdra prináša aj problémy. Keďže vývody periférii sú rozložené po viacerých vývodoch čipu, nie je možné využiť ich všetky v ôsmych pinoch, takže konštruktéri zvolili cestu nabondovania viacerých vývodov čipu na jeden pin. Situáciu ďalej komplikuje vývod VCap, ktorý je nutné pripojiť na stabilizačný kondenzátor interného LDO, čím sa stratí jedna osmina použiteľných pinov, dva vezmú vývody Vdd a Vss. Situácia by sa dala zlepšiť o jeden pin, ak by sa za základ zobral niektorý z STM8L mikrokontrolérov.
The UglyZostáva 5 pinov - aby sa počet GPIO neznížil ešte viac, pin NRST nebol vyvedený na puzdro a programovací pin SWIM je spoločný s ďalšími tromi vývodmi. Že to nie je ideálne riešenie, svedčí aj tento úryvok z datasheetu:
Teda SWIM pin sa dá zablokovať nesprávnym nastavením PD1 - alebo ktoréhokoľvek z vývodov s nim spoločných - do funkcie výstupu a kedže nie je prítomný NRST, nie je možné obvod uviesť do programovacieho režimu a stane sa z neho OTP. Užívatelia niektorých menej domyslených mikrokontrolérov poznajú tento problém pri nesprávnom nastavení fuses, ale tu je možné uviesť mikrokontrolér do "hluchého" režimu nesprávnym nastavením RAM registrov, ktoré nie sú nijako chránené pred chybou programátora ani pred zablúdeným programom, ktorý môže spôsobiť rovnaký problém.
Na druhú stranu, pin PB4 nie je spoločný s nijakým iným pinom; no vo výčte pinov SPI rozhrania chýba signál MISO. Nie som si istý, čí v dokumentácii chýba spomenúť alternatívnu funkciu niektorého z pinov (čakal by som to u toho PB4), alebo skutočne nie je nikam pripojený; čo by znamenalo značné oklieštenie funkcionality SPI rozhrania.
SDCC, OpenOCD a GDBKeď už máme to drobné STM-ko na stole, je zahodno skúsiť s nim aspoň rozblikať LEDku. Je možné vydať sa dvomi cestami - oficiálne nástroje od STM alebo opensourcový toolchain. Ta prvá možnosť vyzerá pomerne jednoducho a pre ľudí používajúcich MS Windows aj skutočne je pomerne jednoduchá - stačí si stiahnuť príslušný nastroj (ST Visual Develop), nainštalovať kompilátor od Cosmic-u a používať.
Kompilátor od Cosmic-u je tento týždeň zadarmo, ale to bol kedysi aj ten od Raisonance, ktorý zmizol tak rýchlo ako sa presúvajú zradné pohyblivé piesky powerpointovych prezentácii produktových manažérov STM. Ako sa po slovensky povie bean-counter?
Alternatívou je používať nástroje, ktoré sú o niečo menej blýskavé, ale ľahšie uchopiteľné a viac odolné voči externým turbulenciám. SDCC ma podporu pre STM8 už nejaký ten čas a stm8flash sa dá použiť, len mu treba povedať že mikrokontrolér je typu STM8S003F3. Je to úplne použiteľná kombinácia a jej komponenty sú popísané vo viacerých zdrojoch - napríklad
https://www.cnx-software.com/2015/04/13/how-to-program-stm8s-1-board-in-linux/ alebo
http://www.ondrovo.com/a/20170107-stm8-getting-started/. Niekomu môže chýbať využitie služieb on-chip debuggera, ale aj to sa dá zvládnuť, tak popíšem ako som to robil ja, v čerstvej inštalácii Linux Mint 18.2.
Najprv som si doinštaloval baličky, ktore by na mňa neskôr vyskočili ako chýbajúce
sudo apt install texinfo libboost-dev g++ libusb-1.0-0-dev
a z adresy
https://sourceforge.net/projects/stm8-binutils-gdb/files/ som si stiahol najnovší súbor, toho času
https://sourceforge.net/projects/stm8-binutils-gdb/files/stm8-binutils-gdb-sources-2017-05-25.tar.gz/downloadRozbalil som ho do adresára ~/stm8, kde som hodlal vytvoriť všetky potrebné nástroje. Obsahuje tri hlavné časti – SDCC, OpenOCD a binutils patche pre príslušné komponenty. Vždy sa daný komponent (napriklad SDCC) stiahne z oficiálnych zdrojov, aplikujú sa patche pre podporu STM8 a následné sa patchnutý komponent skompiluje.
Nastavil som si
export PREFIX=/home/jarin/stm8
aby sa všetko konfigurovalo a inštalovalo do tohto lokálneho adresára, potom som sa mohol pustiť do sťahovania a patchovania jednotlivých častí...
./patch_binutils.sh
./configure_binutils.sh
./patch_sdcc.sh
./configure_sdcc.sh
./patch_openocd.sh
./configure_openocd.sh
...a následne ich kompilovania. Všetko sú to pomerne rozsiahle nástroje, takže si počas ich kompilácie môže človek vypiť kávu, teda tri:
cd binutils-gdb
make
make install
cd ..
cd sdcc-3.6.0
make
make install
cd ..
cd openocd-0.10.0
make
make install
cd ..
Toto všetko by v adresári ~/stm8/bin malo vytvoriť spustiteľné súbory, z ktorých nás v prvom kole najviac bude zaujímať sdcc, stm8-gdb a openocd.
Vzal som veľmi prostý, ale pre demonštračné účely dostačujúci príklad z
https://github.com/vdudouyt/sdcc-examples-stm8 a upravil som ho takto, aby blikal LED-kou na pine PD6
#include "stm8l.h"
volatile unsigned int d;
int main()
{
// Configure pins
PD_DDR = 0x40;
PD_CR1 = 0xFF;
do {
PD_ODR ^= 0x40;
for(d = 0; d < 30000; d++) { }
} while(1);
}
Zdroják som skompiloval príkazom (ignoroval som priložený makefile)
bin/sdcc -mstm8 test/blinky.c --out-fmt-elf --all-callee-saves --debug --verbose --stack-auto --fverbose-asm --float-reent –no-peep
Produktom kompilácie je viacero súborov, ale mňa zaujímal blinky.elf súbor. Aby som ho mohol v GDB použiť, musím si najprv spustiť openocd debug server príkazom
bin/openocd -f interface/stlink-v2.cfg -f target/stm8s001.cfg -c "init" -c "reset halt"
a ešte predtým v adresári ~/stm8/share/openocd/scripts/target vytvoriť súbor stm8s001.cfg s nasledovným obsahom:
#config script for STM8S001
#set ENABLE_STEP_IRQ 1
set FLASHEND 0x9FFF
set BLOCKSIZE 0x40
proc stm8_reset_rop {} {
mwb 0x4800 0x00
reset halt
}
source [find target/stm8.cfg]
reset_config none
Tento oňuchá USB port kde sídli ST-link s pripojeným STMS001 targetom a zahlási niečo takéto
čo znamená že vidí target, zastavil ho a ma ho pod kontrolou, pričom očakáva na porte 3333 ďalšie príkazy čo s tým.
Vo vedľajšom terminálovom okne som si spustil stm8-gdb príkazom
bin/stm8-gdb blinky.elf
a vysypalo to mňa toto
čo znamená že gdb je pripravený a pripojený. Je možné používať štandardné GDB príkazy, alebo sa dá začať príkazom start, ktorý naprogramuje obsah FLASH, nastaví dočasný breakpoint na funkcii main a mikrokontroler tam zostane čakať, indikujúc kde sa pravé nachádza.
Program sa dá spúšťať/zastavovať pomocou C a Ctrl+C, breakpointy nastavovať pomocou príkazu b, ale to už je štandardné GDB a zdá sa, že na internete sa dá nájsť veľa informačných zdrojov na tuto tému –
http://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb/ alebo
https://www.youtube.com/watch?v=2kLK_sdvC3QK GDB sa dá samozrejme použiť aj nejaký blýskavejší frontend, povedzme
Nemiver a potom to s STM8 môže vyzerať takto
ZáverTento mikrokontrolér je zaujímavý počin od STM, ale vidím v ňom niekoľko väčších či menších problémov, ktoré mi zneho kazia radosť.
Pevne verím, že nasledujúci pokus od 8-pinový mikrokontrolér od ST bude o kúsok lepší.
tento článok je z mikroZONE
( https://mikrozone.sk/pluginy/content/content.php?content.144 )