- Příprava hardwaru
- Porozumění GPIO Pinouts na STM8S103F
- Popis a tipy pro výběr GPIO STM8S103F
- Programování STM8S pro vstup a výstup GPIO pomocí SPL
- Nahrávání a testování programu
U mikrokontrolérů je program blikání LED ekvivalentní programu „ahoj svět“. V našem předchozím tutoriálu jsme se naučili, jak začít s vývojovou deskou STM8S103F3 a jak nastavit IDE a kompilátor pro programování našich řadičů STM8S. Naučili jsme se také, jak používat standardní periferní knihovny a jak kompilovat a nahrávat kód do našeho mikrokontroléru. Když pokryjeme všechny základní informace, začneme skutečně psát kód. V tomto kurzu se naučíme, jak provádět obecné funkce GPIO na řadičích STM8S. Deska již má integrovanou LED připojenou ke kolíku 5 portu B, naučíme se, jak tuto LED blikat a také přidat externí LED a ovládat ji tlačítkem. Pokud jste zcela noví, důrazně se doporučuje přečíst si předchozí výukový program, než budete pokračovat dále.
Příprava hardwaru
Než se ponoříme do programu, nechte připravit hardwarová připojení. Jak již bylo zmíněno dříve, budeme zde používat dvě LED diody, jedna je palubní LED, která bude blikat nepřetržitě a druhá je externí LED, která bude přepínána tlačítkem. Cílem je naučit se všechny funkce GPIO v jednoduchém nastavení. Integrovaná LED je již připojena k PB5 (pin5 na PORTB), takže jsem právě připojil LED k PA3 a tlačítko k PA2, jak vidíte na obrázku níže.
Ale ze všech výstupních kolíků, které jsou k dispozici na našem řízeném, proč jsem vybral PA3 pro výstup a PA2 pro vstup? Otázky jsou platné a vysvětlím to dále v tomto článku. Moje nastavení hardwaru pro tento výukový program je uvedeno níže. Jak vidíte, připojil jsem svůj programátor ST-link také k programovacím pinům, které budou nejen programovat naši desku, ale budou také fungovat jako zdroj energie.
Porozumění GPIO Pinouts na STM8S103F
Nyní se vracíme k otázce, proč PA2 pro vstup a proč PA3 pro výstup? Abychom tomu porozuměli, podívejme se blíže na vývod mikrokontroléru, který je zobrazen níže.
Podle pinoutového diagramu máme na našem mikrokontroléru čtyři porty, konkrétně PORT A, B, C a D označené PA, PB, PC a PD. Každý pin GPIO je také opatřen některými dalšími speciálními funkcemi. Například PB5 (pin 5 na PORT B) může fungovat nejen jako pin GPIO, ale také jako pin SDA pro komunikaci I2C a jako výstupní pin Timer 1. Pokud tedy použijeme tento pin pro jednoduché GPIO účely, jako je připojení LED, nebudeme moci používat I2C a LED současně. Je smutné, že palubní LED je připojena k tomuto kolíku, takže zde nemáme moc na výběr a v tomto programu nebudeme používat I2C, takže to není velký problém.
Popis a tipy pro výběr GPIO STM8S103F
Skutečně řečeno, nebylo by na škodu použít vstupní pin PA1 a fungoval by pouze na pin. Ale záměrně jsem to přinesl, abych mi poskytl příležitost ukázat vám některé běžné pasti, do kterých byste mohli spadnout při výběru pinů GPIO na novém mikrokontroléru. Nejlepším řešením, jak se pastím vyhnout, je přečíst si podrobnosti a popis pinů v datovém listu STM8S103F3P6. Podrobnosti o pinech mikrokontroléru STM8S103F3P6 jsou uvedeny níže v obrázcích.
Vstupní piny na našem mikrokontroléru mohou být buď plovoucí nebo slabé vytažení a výstupní piny mohou být buď Open Drain nebo Push-pull. Rozdíl mezi výstupními piny Open Drain a Push-Pull je již diskutován, proto se o tom nebudeme podrobně zabývat. Zjednodušeně řečeno, výstupní kolík Open Drain může výstup pouze tak nízký, ne tak vysoký, zatímco výstupní kolík push-pull může výstup jak vysoký, tak vysoký.
Kromě toho z výše uvedené tabulky si také můžete všimnout, že výstupním kolíkem může být buď rychlý výstup (10 Mhz), nebo pomalý výstup (2 MHz). To určuje rychlost GPIO, pokud chcete přepínat GPIO piny mezi vysokou a nízkou velmi rychle, pak můžeme zvolit rychlý výstup.
Některé piny GPIO na našem řadiči podporují True Open Drain (T) a High Sink Current (HS), jak je uvedeno na obrázku výše. Značný rozdíl mezi Open Drain a True Open Drain spočívá v tom, že výstup připojený k otevřenému odtoku nelze vytáhnout vysoko více než provozní napětí mikrokontroléru (Vdd), zatímco skutečný výstupní pin otevřeného odtoku lze vytáhnout výše než Vdd. Kolíky s funkcí High Sink znamenají, že mohou klesat více proudu. Zdroj a potenciometr jakéhokoli pinu GPIO HS je 20 mA, zatímco elektrické vedení může spotřebovat až 100 mA.
Při bližším pohledu na výše uvedený obrázek si všimnete, že téměř všechny piny GPIO jsou typu High Sink Current (HS), s výjimkou PB4 a PB5, které jsou True Open Drain Type (T). To znamená, že tyto piny nemohou být vysoké, nebudou schopné poskytovat 3,3 V, i když je pin vysoký. To je důvod, proč je palubní LED připojena k 3,3 V a uzemněna přes PB5 namísto napájení přímo z pinu GPIO.
Podrobný popis pinů najdete na straně 28 v datovém listu. Jak je uvedeno na výše uvedeném obrázku, PA1 je automaticky nakonfigurován jako slabý pull-up a nedoporučuje se jej používat jako výstupní pin. Každopádně jej lze použít jako vstupní kolík spolu s tlačítkem, ale rozhodl jsem se použít PA2, jen abych se pokusil povolit vytažení z programu. Je to jen několik základních věcí, které budou užitečné, když budeme psát mnohem složitější programy. Prozatím je v pořádku, pokud se mnoho věcí odrazilo od vaší hlavy, dostaneme se do této vrstvy v jiných výukových programech.
Programování STM8S pro vstup a výstup GPIO pomocí SPL
Vytvořte pracovní prostor a nový projekt, jak jsme diskutovali v našem prvním kurzu. Můžete buď přidat všechny záhlaví a zdrojové soubory, nebo přidat pouze soubory gpio, config a stm8s. Otevřete soubor main.c a začněte psát program.
Ujistěte se, že jste zahrnuli soubory záhlaví, jak je znázorněno na obrázku výše. Otevřete soubor main.c a spusťte kód. Kompletní kód main.c najdete ve spodní části této stránky a odtud si také budete moci stáhnout soubor projektu. Vysvětlení kódu je následující, můžete si také přečíst uživatelskou příručku SPL nebo video propojené ve spodní části této stránky, pokud máte nejasnosti ohledně kódovací části.
Deaktivace požadovaného portu
Náš program začíná deaktivací požadovaných portů. Jak jsme již diskutovali dříve, každý pin GPIO bude mít mnoho dalších funkcí, které s ním souvisejí, kromě toho, že fungují jako normální vstup a výstup. Pokud byly tyto piny dříve použity pro některé další aplikace, mělo by to být před jejich použitím deaktivováno. Není to povinné, je to však dobrá praxe. Následující dva řádky kódu se používají k deaktivaci portu A a portu B. Stačí použít syntaxi GPIO_DeInit (GPIOx); a místo x uveďte název portu.
GPIO_DeInit (GPIOA); // připravit port A pro práci GPIO_DeInit (GPIOB); // připravte port B na práci
Prohlášení o vstupu a výstupu GPIO
Dále musíme deklarovat, které piny budou použity jako vstup a které jako výstup. V našem případě bude jako vstup použit pin PA2, tento pin také deklarujeme interním Pull-up, abychom nemuseli jeden používat externě. Syntaxe je GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Kde x je název portu, y je číslo pinu a z je režim GPIO Pin.
// Deklarovat PA2 jako vstup pull up pin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Dále musíme deklarovat piny PA3 a PB5 jako výstup. Opět je možných mnoho typů deklarace výstupu, ale budeme používat „GPIO_MODE_OUT_PP_LOW_SLOW“, což znamená, že ji deklarujeme jako výstupní pin typu push-pull s nízkou rychlostí. Ve výchozím nastavení bude hodnota nízká. Syntaxe bude stejná.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Deklarovat PB5 jako push pull Výstupní pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Níže uvedený snímek z uživatelské příručky SPL zmiňuje všechny možné režimy GPIO (z).
Nekonečná smyčka while
Po deklaraci pinů musíme vytvořit nekonečnou smyčku, ve které budeme trvale blikat LED a sledovat stav tlačítka pro přepínání LED. Nekonečná smyčka může být vytvořena buď pomocí while (1), nebo pomocí for (;;) . Zde jsem použil while (1).
while (1) {}
Kontrola stavu vstupního kolíku
Musíme zkontrolovat stav vstupního pinu, syntaxe k tomu je GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); kde x je název portu a y je číslo pinu. Pokud je kolík vysoký, dostaneme '1' a pokud je kolík nízký, dostaneme '0'. Použili jsme uvnitř smyčky if, abychom zkontrolovali, zda je kolík vysoký nebo nízký.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // pokud je stisknuto tlačítko
Vytvoření vysokého nebo nízkého kolíku GPIO
Chcete-li, aby byl pin GPIO vysoký nebo nízký, můžeme použít GPIO_WriteHigh (GPIOx, GPIO_PIN_y); a GPIO_WriteLow (GPIOx, GPIO_PIN_y); resp. Zde jsme nechali LED svítit, pokud je stisknuto tlačítko, a zhasli, pokud není stisknuto tlačítko.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // pokud bylo stisknuto tlačítko GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED SVÍTÍ jinde GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED nesvítí
Přepínání pinů GPIO
Chcete-li přepnout pin GPIO, máme GPIO_WriteReverse (GPIOx, GPIO_PIN_y); volání této funkce změní stav výstupního pinu. Pokud je kolík vysoký, změní se na nízký a pokud je nízký, změní se na vysoký. Tuto funkci používáme k blikání palubní LED na PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Funkce zpoždění
Na rozdíl od Arduina nemá kosmický kompilátor předdefinovanou funkci zpoždění. Musíme si tedy jeden vytvořit sami. Moje funkce zpoždění je uvedena níže. Hodnota doe zpoždění bude přijata v proměnné ms a použijeme dvě pro smyčku k zadržení nebo provedení programu. Like _asm („nop“) je montážní instrukce, která nezakládá žádnou operaci. To znamená, že ovladač bude smyčkovat do smyčky for bez provedení jakékoli operace, čímž vytvoří zpoždění.
void delay (int ms) // Definice funkce {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // neprovádět žádnou operaci // montážní kód}}
Nahrávání a testování programu
Nyní, když je náš program připraven, můžeme jej nahrát a otestovat. Po nahrání můj hardware fungoval podle očekávání. Palubní červená LED dioda blikala každých 500 milisekund a externí zelená LED se rozsvítila pokaždé, když jsem stiskl spínač.
Kompletní práci najdete ve videu, na které odkazujete níže. Jakmile dosáhnete tohoto bodu, můžete se pokusit připojit přepínač a LED k různým pinům a přepsat kód, abyste porozuměli konceptu. Můžete si také zahrát s časováním zpoždění a zkontrolovat, zda jste těmto konceptům jasně porozuměli.
Máte-li jakékoli dotazy, nechte je prosím v sekci komentářů níže a pro další technické dotazy můžete využít naše fóra. Děkujeme, že jste nás sledovali, uvidíme se v dalším kurzu.