- Príprava hardvéru
- Pochopenie zapojenia GPIO na STM8S103F
- Popis a tipy na výber GPIO STM8S103F
- Programovanie STM8S pre vstup a výstup GPIO pomocou SPL
- Nahrávanie a testovanie programu
Pre mikrokontroléry je program blikania LED ekvivalentný programu „ahoj svet“. V našom predchádzajúcom tutoriáli sme sa naučili, ako začať s vývojovou doskou STM8S103F3 a ako nastaviť IDE a kompilátor na programovanie našich ovládačov STM8S. Naučili sme sa tiež, ako používať štandardné periférne knižnice a ako zostaviť a nahrať kód do nášho mikrokontroléra. Keď už máme pokryté všetky základné informácie, začnime skutočne písať kód. V tomto tutoriále sa dozvieme, ako vykonávať všeobecné funkcie GPIO na radičoch STM8S. Doska už má integrovanú LED pripojenú na pin 5 portu B, naučíme sa, ako túto LED blikať a tiež pridať externú LED a ovládať ju tlačidlom. Ak ste úplne nový, dôrazne sa odporúča prečítať si predchádzajúci návod, skôr ako budete pokračovať.
Príprava hardvéru
Pred ponorením sa do programu si nechajte pripraviť hardvérové pripojenia. Ako už bolo spomenuté skôr, budeme tu používať dve LED diódy, jedna je palubná LED, ktorá bude nepretržite blikať a druhá je externá LED, ktorá sa prepína tlačidlom. Cieľom je naučiť sa všetky funkcie GPIO v jednoduchom nastavení. Palubná LED dióda je už pripojená k PB5 (pin 5 na PORTB), takže som práve pripojil LED k PA3 a tlačidlo k PA2, ako vidíte na schéme nižšie.
Ale zo všetkých výstupných pinov, ktoré sú k dispozícii na našom riadenom, prečo som vybral PA3 pre výstup a PA2 pre vstup? Otázky sú platné a vysvetlím to ďalej v tomto článku. Moje hardvérové nastavenie pre tento tutoriál je zobrazené nižšie. Ako vidíte, pripojil som svoj programátor ST-link aj k programovacím pinom, ktoré budú nielen programovať našu dosku, ale budú slúžiť aj ako zdroj energie.
Pochopenie zapojenia GPIO na STM8S103F
Teraz sa vraciame k otázke, prečo PA2 pre vstup a prečo PA3 pre výstup? Aby sme tomu porozumeli, pozrime sa bližšie na pinout mikrokontroléra, ktorý je zobrazený nižšie.
Podľa pinoutového diagramu máme na našom mikrokontroléri štyri porty, konkrétne PORT A, B, C a D označené PA, PB, PC a PD. Každý pin GPIO je taktiež opatrený niektorými ďalšími špeciálnymi funkciami. Napríklad PB5 (pin 5 na PORT B) môže pracovať nielen ako pin GPIO, ale aj ako pin SDA pre komunikáciu I2C a ako výstupný pin Timer 1. Takže ak použijeme tento pin na jednoduché GPIO účely, ako je pripojenie LED, potom nebudeme môcť používať I2C a LED súčasne. Je smutné, že palubná LED je pripojená k tomuto kolíku, takže tu nemáme veľmi na výber a v tomto programe nebudeme používať I2C, takže to nie je veľký problém.
Popis a tipy na výber GPIO STM8S103F
Naozaj by nebolo na škodu použiť vstupný pin PA1 a fungoval by iba na pin. Ale zámerne som to priniesol, aby mi poskytol príležitosť ukázať vám niekoľko bežných pascí, do ktorých by ste mohli spadnúť pri výbere pinov GPIO na novom mikrokontroléri. Najlepšie sa pasciam vyhnete, ak si prečítate podrobnosti a popis pinov uvedených v údajovom liste STM8S103F3P6. Podrobnosti o kolíku mikrokontroléra STM8S103F3P6 sú uvedené v obrázkoch nižšie.
Vstupné piny na našom mikrokontroléri môžu byť buď plávajúce alebo slabé vytiahnutia a výstupné piny môžu byť buď Open Drain alebo Push-pull. Rozdiel medzi výstupnými kolíkmi Open Drain a Push-Pull je už diskutovaný, preto sa tým nebudeme podrobne zaoberať. Zjednodušene povedané, výstupný kolík otvoreného odtoku môže spôsobiť, že výstup bude iba taký nízky, ako nie vysoký, zatiaľ čo výstupný kolík typu push-pull môže mať výstup tak vysoký, ako aj vysoký.
Okrem toho z vyššie uvedenej tabuľky si tiež môžete všimnúť, že výstupným pinom môže byť buď rýchly výstup (10 Mhz), alebo pomalý výstup (2 MHz). Toto určuje rýchlosť GPIO, ak chcete prepínať svoje GPIO piny medzi vysokou a nízkou veľmi rýchlo, potom môžeme zvoliť rýchly výstup.
Niektoré piny GPIO na našom radiči podporujú True Open Drain (T) a High Sink Current (HS), ako je uvedené na obrázku vyššie. Značný rozdiel medzi otvoreným odtokom a skutočným otvoreným odtokom spočíva v tom, že výstup pripojený k otvorenému odtoku nemôže byť vytiahnutý vyššie ako prevádzkové napätie mikrokontroléra (Vdd), zatiaľ čo skutočný výstupný kolík otvoreného odtoku môže byť vytiahnutý vyššie ako Vdd. Kolíky s vysokou výdržou znamenajú, že môžu klesnúť o viac prúdu. Zdrojový a odberový prúd ľubovoľného kolíka GPIO HS je 20 mA, zatiaľ čo elektrické vedenie môže spotrebovať až 100 mA.
Pri bližšom pohľade na vyššie uvedený obrázok si všimnete, že takmer všetky piny GPIO sú typu High Sink Current (HS), s výnimkou typov PB4 a PB5, ktoré sú typu True Open Drain Type (T). To znamená, že tieto kolíky nemôžu byť vyrobené vysoko, nebudú schopné poskytnúť 3,3 V, aj keď je kolík vyrobený vysoko. To je dôvod, prečo je palubná LED pripojená k 3,3 V a uzemnená cez PB5 namiesto toho, aby ju napájala priamo z GPIO pinu.
Podrobný popis pinov nájdete na strane 28 v údajovom liste. Ako už bolo spomenuté na vyššie uvedenom obrázku, PA1 je automaticky nakonfigurovaný ako slabý pull-up a jeho výstupný pin sa neodporúča používať. V každom prípade sa dá použiť ako vstupný pin spolu s tlačidlom, ale rozhodol som sa použiť PA2, len aby som skúsil povoliť pull up z programu. Existuje iba niekoľko základných vecí, ktoré budú užitočné, keď budeme písať oveľa komplikovanejšie programy. Zatiaľ je v poriadku, ak sa vám veľa vecí odrazilo od hlavy, dostaneme sa do tejto vrstvy v ďalších návodoch.
Programovanie STM8S pre vstup a výstup GPIO pomocou SPL
Vytvorte pracovný priestor a nový projekt, o čom sme hovorili v našom prvom tutoriále. Môžete pridať všetky hlavičkové a zdrojové súbory alebo pridať iba súbory gpio, config a stm8s. Otvorte súbor main.c a začnite písať program.
Uistite sa, že ste zahrnuli hlavičkové súbory, ako je to znázornené na obrázku vyššie. Otvorte súbor main.c a spustite kód. Celý kód main.c nájdete v spodnej časti tejto stránky a odtiaľ si budete môcť stiahnuť aj súbor projektu. Vysvetlenie kódu je nasledovné, môžete si tiež prečítať používateľskú príručku k SPL alebo video prepojené v dolnej časti tejto stránky, ak ste v súvislosti s kódovacou časťou zmätení.
Deinicializácia požadovaného portu
Náš program začíname deinicializáciou požadovaných portov. Ako sme už diskutovali, každý pin GPIO bude mať s ním spojených mnoho ďalších funkcií okrem toho, že bude pracovať ako normálny vstup a výstup. Ak boli tieto piny predtým použité pre niektoré ďalšie aplikácie, malo by to byť predtým, ako ich použijeme, deaktivované. Nie je to povinné, je to osvedčený postup. Nasledujúce dva riadky kódu sa používajú na inicializáciu portu A a portu B. Stačí použiť syntax GPIO_DeInit (GPIOx); a namiesto x uveďte názov portu.
GPIO_DeInit (GPIOA); // pripravit port A na pracu GPIO_DeInit (GPIOB); // pripraviť port B na prácu
Vyhlásenie o vstupe a výstupe GPIO
Ďalej musíme deklarovať, ktoré piny sa použijú ako vstup a ktoré ako výstup. V našom prípade sa ako vstup použije pin PA2, ktorý taktiež deklarujeme s interným Pull-up, aby sme ho nemuseli používať externe. Syntax je GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Kde x je názov portu, y je číslo PIN a z je režim GPIO Pin.
// Deklarujte PA2 ako vstupný pull up pin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Ďalej musíme deklarovať piny PA3 a PB5 ako výstup. Opäť je možných veľa typov výstupných deklarácií, ale budeme používať „GPIO_MODE_OUT_PP_LOW_SLOW“, čo znamená, že ich deklarujeme ako výstupný pin typu push-pull s nízkou rýchlosťou. A predvolene bude hodnota nízka. Syntax bude rovnaká.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Deklarovať PB5 ako push pull Výstupný pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Nasledujúca snímka z užívateľskej príručky k SPL uvádza všetky možné režimy GPIO (z).
Nekonečná slučka while
Po deklarácii PINu je potrebné vytvoriť nekonečnú slučku, vnútri ktorej budeme stále blikať LED diódou a monitorovať stav tlačidla na prepínanie LED diódy. Nekonečná slučka môže byť vytvorená s while (1) alebo s for (;;) . Tu som použil while (1).
while (1) {}
Kontrola stavu vstupného kolíka
Musíme skontrolovať stav vstupného kolíka, ktorého syntax je GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); kde x je názov portu a y je číslo PIN. Ak je kolík vysoký, dostaneme „1“ a ak je kolík nízky, dostaneme „0“. Použili sme dovnútra slučky if, aby sme skontrolovali, či je pin vysoký alebo nízky.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ak je stlačené tlačidlo
Vytváranie vysokých alebo nízkych pinov GPIO
Ak chcete, aby bol pin GPIO vysoký alebo nízky, môžeme použiť GPIO_WriteHigh (GPIOx, GPIO_PIN_y); a GPIO_WriteLow (GPIOx, GPIO_PIN_y); resp. Tu sme nechali LED svietiť, ak je stlačené tlačidlo, a zhasli, pokiaľ nie je stlačené tlačidlo.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ak je stlačené tlačidlo GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED svieti inde GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED nesvieti
Prepínanie pinov GPIO
Ak chcete prepnúť pin GPIO, máme GPIO_WriteReverse (GPIOx, GPIO_PIN_y); volanie tejto funkcie zmení stav výstupného pinu. Ak je kolík vysoký, zmení sa na nízky a ak je nízky, zmení sa na vysoký. Túto funkciu používame na blikanie palubnej LED na PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Funkcia oneskorenia
Na rozdiel od Arduina nemá kozmický kompilátor preddefinovanú funkciu oneskorenia. Musíme si ho teda vytvoriť sami. Moja funkcia oneskorenia je uvedená nižšie. Hodnota doe oneskorenie bude prijatá v premennej ms a použijeme dve pre cyklus na zadržanie alebo vykonanie programu. Like _asm („nop“) je montážna inštrukcia, ktorá znamená, že nie je k dispozícii žiadna operácia. To znamená, že radič sa zapojí do slučky for bez vykonania akejkoľvek operácie, čo spôsobí oneskorenie.
void delay (int ms) // Definícia funkcie {int i = 0; int j = 0; pre (i = 0; i <= ms; i ++) {pre (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Nevykonávať žiadnu operáciu // montážny kód}}
Nahrávanie a testovanie programu
Teraz, keď je náš program pripravený, môžeme ho nahrať a vyskúšať. Po nahraní môj hardvér pracoval podľa očakávaní. Palubná červená LED dióda blikala každých 500 milisekúnd a externá zelená LED sa rozsvietila zakaždým, keď som stlačil vypínač.
Kompletné fungovanie nájdete vo videu, na ktoré odkazujete nižšie. Po dosiahnutí tohto bodu sa môžete pokúsiť pripojiť prepínač a kontrolku LED k rôznym pinom a prepísať kód, aby ste pochopili tento koncept. Môžete sa tiež pohrať s načasovaním oneskorenia a skontrolovať, či ste koncepciám jasne porozumeli.
Ak máte nejaké otázky, nechajte ich prosím v sekcii komentárov nižšie a pre ďalšie technické otázky môžete využiť naše fóra. Ďakujeme za sledovanie, uvidíme sa v ďalšom návode.