Zkratkou GPIO (General Purpose Input Output) se označují vstupy/výstupy či též "vývody" nebo "piny" mikrokontroléru. Tyto vstupy a výstupy jsou tím nejdůležitějším co musíte při práci s mikrokontrolérem ovládat. Skrze GPIO může mikrokontrolér vnímat a ovládat okolní svět. Prakticky neexistuje aplikace kdy by mikrokontrolér vstupy a výstupy nepotřeboval. Protože k GPIO se připojuje veškerý okolní hardware je nutné znát a dodržovat jejich elektrické parametry a limity. Je toho docela hodně, takže se rovnou pustíme do práce.
Z dílu o Nucleo kitu už víte jak jsou rozloženy vývody mikrokontroléru na postranních konektorech. Taky jste se tam dočetli že na vývodu PC5 je připojena LED dioda. Ti bystřejší z vás si mohli všimnout že GPIO se sdružují do osmic (zvaných též "porty"). Když si v datasheetu nalistujete kapitolu "Pinouts and pin description", uvidíte že náš mikrokontrolér (od teď už jen MCU) má porty GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG a GPIOI. Jednotlivé vývody v portu se označují číslem mezi 0 a 7 (např. PE0, PC6 atd.). Některé porty neobsahují všech osm pinů. Například GPIOA na našem MCU neobsahuje PA0 a PA7 nebo GPIOI má jen jeden vývod a to PI0. S každým GPIO se dá pracovat naprosto samostatně. Takže třeba PE0 může sloužit k ovládání LEDky, PE1 naopak snímat stav tlačítka a podobně. Navíc ale můžeme portem pracovat jako s celkem, tedy ovládat všech jeho (až) 8 vývodů zároveň (to se vám bude hodit třeba při ovládání segmentovky a možná později i k mnohem sofistikovanějším funkcím). No a my si teď motivačně zablikáme LEDkou a pak se pustíme do ostré práce.
#include "stm8s.h" void main(void){ // tyto příkazy se vykonají jednou po restartu MCU // LEDku máme na pinu PC5 // nastavíme Pin 5 portu C jako výstup (OUT) typu Push-Pull (PP) s výstupem v log.0 (LOW) a s nízkou (SLOW) rychlostí. GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW); while (1){ // toto se vykonává stále dokola GPIO_WriteHigh(GPIOC,GPIO_PIN_5); // zapíšeme na PC5 log. úroveň High (log.1) - rozsvítí LED GPIO_WriteLow(GPIOC,GPIO_PIN_5); // zapíšeme na PC5 log. úroveň Low (log.0) - zhasne LED } }
Když si tento kód přeložíte a pomocí debuggeru krokujete, uvidíte že střídavě zhasíná a rozsvěcí LEDku. Když ale program spustíte aby běžel plnou rychlostí, žádné blikání neuvidíte. Program se totiž vykonává tak rychle že LEDku stihne rozsvítit a zhasnout "milionkrát" za sekundu. My se přirozeně časem dopracujeme k tomu jak s LEDkou blikat libovolnou rychlostí, ale kvůli tomu tady teď nejsme. Jsme tu proto abychom se naučili ovládat GPIO. Podívejme se tedy na náš příklad. Obsahoval tři funkce.
Motivaci máme za sebou a začneme pořádně od základů. Tedy od "elektriky", od hardwaru. Oprašte své znalosti o zatěžovací charakteristice zdroje napětí neboť přichází první příklad.
Jestli jste si před rokem mysleli, že vám zrovna tahle "teorie" k ničemu nebude, tak jste na omylu. Protože přesně takhle se chovají výstupy našeho mikrokontroléru. Pin nakonfigurovaný jako výstup typu push-pull se při nastavení do log.1 (úroveň "high") chová jako zdroj napětí 5V s vnitřním odporem přibližně 120 Ohm. Samozřejmě že to platí pro mikrokontrolér napájený napětím 5V. Při napájení 3.3V se chová jako měkký zdroj 3.3V. Zkusme si raději ještě jeden příklad.
Tento příklad demonstruje opačnou situaci. Tedy stav kdy je pin nastaven jako výstup s log. úrovní Low (log.0). Opět se chová jako "měkký" zdroj 0V. Jeho vnitřní odpor v tomto stavu bývá okolo 70Ohm. Je tedy o něco "tvrdší" než v log.1. Obě tyto situace si můžete snadno vyzkoušet.
void main(void){ // kód tady se vykoná jednorázově po spuštění nebo restartu programu GPIO_Init(GPIOB,GPIO_PIN_7,GPIO_MODE_OUT_PP_HIGH_SLOW); // nastavíme PB7 jako výstup typu push-pull (LEDka) do úrovně High (log.1) while (1){ // kód zde se vykonává stále dokola až do vypnutí MCU - zrovna nemá co dělat :) } }
Poslední příklad nás přivede k jedné z nejdůležitějších informací.
Asi tušíte, že tenhle případ nebudeme procvičovat. Jedná se totiž o zkrat výstupu a proud jsme odhadli na něco přes 40mA. Takový zkrat by měl neblahé důsledky pro náš mikrokontrolér. V datasheetu se můžeme dočíst že Maximální povolený proud tekoucí výstupem nebo vstupem je 20mA !. V tomto případě bychom ho tedy překročili 2x a mohli bychom mikrokontrolér zničit. Buďte opatrní a této situaci se vyhýbejte.
Vnitřní odpor není konstantních 120 nebo 70 Ohm. Je závislý na zatěžovacím proudu a může se lišit až o desítky procent. Není stejný na všech pinech, některé piny našeho MCU jsou tzv. "High Sink" a mají menší vnitřní odpor když jsou v úrovni Low. Závislosti výstupního napětí na zatěžovacím proudu jsou vykreslené v grafech figure 24 až figure 31 v datasheetu ("Typical output level curves"). Možná se také pozastavujete nad slovíčkem SLOW v konfiguraci výstupu a zamýšlíte se zda existuje taky nějaké FAST ? Ano existuje, volbou SLOW nebo FAST si volíme rychlost přeběhu (strmost hrany přechodu mezi log.1 a log.0). Já jsem se ale rozhodl vám tím zatím neplést hlavu, protože to jsou funkce, které využijete až jako pokročilí. Volba SLOW je pro začátek výhodnější kvůli nižšímu rušení :) Nebojte i tak se jedná o časy v řádu jednotek až desítek nanosekund.
Home
| V1.00 27.4.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /