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 Good
V 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 Ugly
Zostá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 GDB
Keď 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
  1. 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/download
Rozbalil 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
  1. 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í...
  1. ./patch_binutils.sh
  2. ./configure_binutils.sh
  3. ./patch_sdcc.sh
  4. ./configure_sdcc.sh
  5. ./patch_openocd.sh
  6. ./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:

  1. cd binutils-gdb
  2. make
  3. make install
  4. cd ..
  5.  
  6. cd sdcc-3.6.0
  7. make
  8. make install
  9. cd ..
  10.  
  11. cd openocd-0.10.0
  12. make
  13. make install
  14. 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

  1. #include "stm8l.h"
  2. volatile unsigned int d;
  3. int main()
  4. {
  5.         // Configure pins
  6.         PD_DDR = 0x40;
  7.         PD_CR1 = 0xFF;
  8.         do {
  9.                 PD_ODR ^= 0x40;
  10.                 for(d = 0; d < 30000; d++) { }
  11.         } while(1);
  12. }


Zdroják som skompiloval príkazom (ignoroval som priložený makefile)
  1. 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
  1. 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:
  1. #config script for STM8S001
  2.  
  3. #set ENABLE_STEP_IRQ 1
  4. set FLASHEND 0x9FFF
  5. set BLOCKSIZE 0x40
  6.  
  7. proc stm8_reset_rop {} {
  8.    mwb 0x4800 0x00
  9.    reset halt
  10. }
  11.  
  12. source [find target/stm8.cfg]
  13. 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_sdvC3Q

K GDB sa dá samozrejme použiť aj nejaký blýskavejší frontend, povedzme Nemiver a potom to s STM8 môže vyzerať takto


Záver
Tento 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://www.mikrozone.sk/pluginy/content/content.php?content.144 )