- A hardver előkészítése
- A GPIO Pinouts megismerése az STM8S103F készüléken
- Pinout leírása és tippek az STM8S103F GPIO kiválasztásához
- Az STM8S programozása a GPIO be- és kimenethez SPL használatával
- A program feltöltése és tesztelése
A mikrovezérlők számára a LED-ek villogása megegyezik a „helló világ” programmal. Korábbi oktatóanyagunkban megtanultuk, hogyan kell elindulni az STM8S103F3 Fejlesztői Testülettel, és hogyan kell beállítani az IDE-t és a fordítót az STM8S-vezérlők programozásához. Megtanultuk a standard perifériás könyvtárak használatát, valamint a kód fordítását és feltöltését a mikrovezérlőnkbe. Ha minden alapot lefed, lehetővé teszi a kód írását. Ebben az oktatóanyagban megtudhatjuk, hogyan lehet általános GPIO funkciókat végrehajtani az STM8S vezérlőkön. Az alaplapnak már van egy fedélzeti LED-je, amely a B port 5. érintkezőjéhez van csatlakoztatva. Megtanuljuk, hogyan kell villogni ennek a LED-nek, valamint hozzáadunk egy külső LED-et és egy nyomógombbal vezérelhetjük. Ha teljesen új vagy, akkor a továbblépés előtt erősen ajánlott elolvasni az előző oktatóanyagot.
A hardver előkészítése
Mielőtt belevágnánk a programba, készítsük elő a hardver csatlakozásokat. Mint korán említettük, itt két LED-et fogunk használni, az egyik egy fedélzeti LED, amely folyamatosan villog, a másik pedig egy külső LED, amelyet nyomógombbal kapcsolnak be. Az ötlet az, hogy megtanulják a GPIO összes funkcióját egy egyszerű beállítással. A fedélzeti Led már csatlakozik a PB5-hez (a PORTB 5. tűje), ezért épp csatlakoztattam egy LED-et a PA3-hoz és egy nyomógombot a PA2-hez, amint az az alábbi ábrán látható.
De a vezérlésünkön elérhető összes kimeneti tű közül miért választottam a PA3-at a kimenethez és a PA2-t a bemenethez? A kérdések érvényesek, és ezt a cikk későbbi részében elmagyarázom. Az oktatóanyag hardverbeállítása az alábbiakban látható. Amint láthatja, az ST-link programozómat is csatlakoztattam a programozó csapokhoz, amelyek nemcsak az alaplapunkat programozzák, hanem áramforrásként is működnek.
A GPIO Pinouts megismerése az STM8S103F készüléken
Most visszatérve arra a kérdésre, hogy miért PA2 a bemenetre és miért PA3 a kimenetre? Ennek megértéséhez nézzük meg közelebbről a mikrovezérlő pinoutját, amely alább látható.
A pinout-diagramnak megfelelően a mikrokontrollerünkön négy port van, nevezetesen a PORT A, B, C és D, amelyeket PA, PB, PC és PD jelöl. Mindegyik GPIO csap más speciális funkcióval is rendelkezik. Például a PB5 (a PORT B 5. érintkezője) nemcsak GPIO tűként, hanem SDA tűként is működhet az I2C kommunikációhoz és Timer 1 kimeneti tűként. Tehát, ha ezt a csapot egyszerű GPIO célokra használjuk, például egy LED csatlakoztatására, akkor nem tudjuk egyszerre használni az I2C-t és a LED-et. Sajnos a fedélzeti LED ehhez a tűhöz van csatlakoztatva, így itt nincs sok választási lehetőségünk, és ebben a programban nem az I2C-t fogjuk használni, tehát nem nagy probléma.
Pinout leírása és tippek az STM8S103F GPIO kiválasztásához
Valójában nem ártana a PA1 bemeneti tűt használni, és csak működni fog. De ezt szándékosan hoztam fel, hogy alkalmat nyújtsak arra, hogy megmutassak néhány gyakori csapdát, amelyekbe beleeshet, amikor kiválasztja a GPIO csapokat egy új mikrokontrolleren. A csapdákat elkerülni a legjobb, ha elolvassa az érintkezők részleteit és a leírás leírását, amelyeket az STM8S103F3P6 adatlapon talál. Az STM8S103F3P6 mikrovezérlő pin leírásához az adatlapban említett részletek a képek alatt találhatók.
A mikrovezérlőnk bemeneti csapjai lehetnek lebegő vagy gyenge felhúzásúak, a kimeneti csapok pedig nyitott leeresztés vagy nyomás-húzás lehetnek. Az Open Drain és a Push-Pull Output csapok közötti különbségről már szó esett, ezért ezt nem részletezzük. Leegyszerűsítve: az Open Drain kimenőcsap csak kicsi, de nem olyan magas kimenetet eredményezhet, míg egy push-pull kimeneti tű mind a magas, mind a magas kimenetet.
A fenti táblázaton kívül azt is észreveheti, hogy egy kimeneti tű lehet gyors kimenet (10 Mhz) vagy lassú kimenet (2 MHz). Ez meghatározza a GPIO sebességét, ha nagyon gyorsan szeretné váltani a GPIO csapokat a magas és az alacsony között, akkor választhatjuk a Gyors kimenetet.
Vezérlőnk néhány GPIO-csapja támogatja a True Open Drain (T) és a magas süllyedési áramot (HS), amint az a fenti képen is szerepel. Jelentős különbség az Open Drain és a True Open Drain között az, hogy a nyitott lefolyóhoz csatlakoztatott kimenet nem húzható nagyobbra, mint a mikrovezérlő üzemi feszültsége (Vdd), míg a valódi nyitott lefolyású kimeneti csap a Vdd-nél magasabbra húzható. A nagy mosogató képességgel rendelkező csapok azt jelentik, hogy nagyobb áramot tudnak süllyeszteni. Bármely GPIO HS tű forrás- és mosogatóárama 20mA, míg az áramvezeték akár 100 mA-t is képes fogyasztani.
Közelebbről megnézve a fenti képet, észreveheti, hogy szinte az összes GPIO érintkezõ nagy mosogatóáramú (HS) típusú, kivéve a PB4 és a PB5, amelyek True Open Drain Type (T). Ez azt jelenti, hogy ezeket a csapokat nem lehet magasra tenni, akkor sem képesek 3,3 V feszültséget biztosítani, ha a csap magasra van állítva. Ezért van az, hogy a fedélzeti ledet egy 3.3 V-hoz csatlakoztatják, és a PB5-n keresztül földelik, ahelyett, hogy közvetlenül a GPIO tűről táplálnák.
A részletes pin leírást lásd az adatlap 28. oldalán. Amint a fenti képen említettük, a PA1 automatikusan gyenge felhúzásként van konfigurálva, és nem ajánlott kimeneti tűként használni. Egyébként beviteli tűként használható egy nyomógombbal együtt, de úgy döntöttem, hogy csak a PA2-t használom, hogy megpróbáljam engedélyezni a programból történő felhúzást. Ez csak néhány alapvető dolog, amely hasznos lehet, ha sokkal bonyolultabb programokat írunk. Egyelőre rendben van, ha sok minden elrugaszkodott a fejedtől, más oktatóanyagokba bele fogunk kerülni.
Az STM8S programozása a GPIO be- és kimenethez SPL használatával
Hozzon létre egy munkaterületet és egy új projektet, amint azt az első oktatóanyagunkban tárgyaltuk. Hozzáadhatja az összes fejléc- és forrásfájlt, vagy csak a gpio, a config és az stm8s fájlokat. Nyissa meg a main.c fájlt, és kezdje el írni a programot.
Győződjön meg arról, hogy a fejlécfájlokat a fenti képen látható módon tartalmazza. Nyissa meg a main.c fájlt, és indítsa el a kódot. A teljes main.c kód az oldal alján található, és onnan is letöltheti a projekt fájlt. A kód magyarázata a következő, hivatkozhat az SPL felhasználói kézikönyvére vagy az oldal alján linkelt videóra is, ha zavart a kódolási rész miatt.
A szükséges port inicializálása
Programunkat a szükséges portok inicializálásával kezdjük. Ahogy korábban megbeszéltük, minden GPIO-csat sok más funkcióval fog társulni, azon kívül, hogy normál bemenetként és kimenetként működik. Ha ezeket a csapokat korábban más alkalmazásokhoz használták, akkor azokat inicializálni kell, mielőtt felhasználnánk őket. Nem kötelező, azonban jó gyakorlat. A következő két kódsort használjuk az A és a B port inicializálásához. Csak használjuk a GPIO_DeInit (GPIOx) szintaxist ; és említsd meg a port nevet x helyett.
GPIO_DeInit (GPIOA); // előkészíti az A portot a GPIO_DeInit (GPIOB) működéséhez; // előkészíti a B portot a munkavégzéshez
Bemeneti és kimeneti GPIO nyilatkozat
Ezután deklarálnunk kell, hogy melyik csapokat használjuk bemenetként és melyeket kimenetként. Esetünkben a PA2 tűt fogjuk használni bemenetként, ezt a csapot belső kihúzással is deklaráljuk, hogy ne kelljen külsőleg használni. A szintaxis GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Ahol x a port neve, y a pin száma, és z a GPIO Pin mód.
// A PA2 deklarálása bemeneti felhúzócsapként GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Ezután kimenetnek kell nyilvánítanunk a PA3 és a PB5 csapokat. Ismét sokféle kimeneti deklaráció lehetséges, de a „GPIO_MODE_OUT_PP_LOW_SLOW” -t fogjuk használni, ami azt jelenti, hogy lassú push-pull típusú kimeneti tűként deklaráljuk. Alapértelmezés szerint az érték alacsony lesz. A szintaxis ugyanaz lesz.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // A PB5 deklarálása push pull kimeneti tűként GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Az SPL felhasználói kézikönyv alábbi pillanatképe az összes lehetséges GPIO módot megemlíti (z).
Végtelen, míg hurok
A tűk deklarálása után létre kell hoznunk egy végtelen hurkot, amelyen belül örökké villogni fogunk a LED-en, és figyelemmel kísérjük a nyomógomb állapotát a LED váltásához. A végtelen hurok létrehozhat egy ideig (1) vagy egy for-tal (;;) . Itt használtam a (1) -t.
míg (1) {}
A bemeneti tű állapotának ellenőrzése
Ellenőriznünk kell a bemeneti pin állapotát, ennek szintaxisa GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); ahol x a port neve és y a pin száma. Ha a tű magas, akkor 1-et kapunk, és ha a tű alacsony, akkor 0-t kapunk. Az if hurok belsejében már megszokhattuk, hogy ellenőrizzük, hogy a tű magas vagy alacsony-e.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ha megnyomják a gombot
Magas vagy alacsony GPIO-tű készítése
A GPIO pin magas vagy alacsony létrehozásához használhatjuk a GPIO_WriteHigh (GPIOx, GPIO_PIN_y); és GPIO_WriteLow (GPIOx, GPIO_PIN_y); illetőleg. Itt a LED-et bekapcsoljuk, ha megnyomjuk a gombot, és kikapcsolunk, ha nem nyomjuk meg a gombot.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ha a gombot megnyomjuk GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED világít még GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED nem világít
GPIO-pin bekapcsolása
A GPIO pin váltásához GPIO_WriteReverse (GPIOx, GPIO_PIN_y) van; ennek a funkciónak a meghívása megváltoztatja a kimeneti pin állapotát. Ha a csap magas, akkor alacsonyra vált, és ha alacsony, akkor magasra. Ezt a funkciót használjuk a fedélzeti LED villogására a PB5-n.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Késleltetés funkció
Az Arduinótól eltérően a kozmikus fordítónak nincs előre definiált késleltetési funkciója. Tehát egyedül kell létrehoznunk egyet. A késleltetési funkcióm az alábbiakban látható. A késleltetés értéke megkapja az ms változót, és kettőt fogunk használni a ciklus tartására vagy a program végrehajtására. A _asm (“nop”) egy szerelési utasítás, amely nem jelenti a műveletet. Ez azt jelenti, hogy a vezérlő bármilyen művelet végrehajtása nélkül bekapcsolódik a for ciklusba, így késleltetést hoz létre.
void delay (int ms) // Funkciódefiníció {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // ne végezzen műveletet // összeállítási kód}}
A program feltöltése és tesztelése
Most, hogy programunk készen áll, feltölthetjük és tesztelhetjük. A feltöltés után a hardverem a várakozásoknak megfelelően működött. A fedélzeti piros LED 500 milliszekundumonként villogott, és a külső zöld LED minden alkalommal bekapcsol, amikor megnyomtam a kapcsolót.
A teljes munka megtalálható az alábbi linkre kattintva. Ha elérte ezt a pontot, megpróbálhatja összekapcsolni a kapcsolót és a LED-et különböző csapokkal, és újraírni a kódot, hogy megértse a koncepciót. Játszhat a késleltetés időzítésével is, hogy ellenőrizze, jól értette-e a fogalmakat.
Ha bármilyen kérdése van, kérjük, hagyja őket az alábbi megjegyzés részben, és egyéb technikai kérdések esetén használhatja fórumunkat. Köszönjük, hogy követte, találkozunk a következő oktatóanyagban.