- Priprava strojne opreme
- Razumevanje izrezov GPIO na STM8S103F
- Opis izvlečka in nasveti za izbiro GPM STM8S103F
- Programiranje STM8S za GPIO vhod in izhod z uporabo SPL
- Nalaganje in preizkušanje programa
Za mikrokrmilnike je program za utripanje LED enakovreden programu "hello world". V prejšnji vadnici smo se naučili, kako začeti z razvojno ploščo STM8S103F3 in kako nastaviti IDE in prevajalnik za programiranje naših krmilnikov STM8S. Naučili smo se tudi, kako uporabljati standardne zunanje knjižnice ter kako prevesti in naložiti kodo v naš mikrokrmilnik. Z vsemi zajetimi osnovami dejansko začnemo pisati kodo. V tej vadnici bomo izvedeli, kako izvajati splošne funkcije GPIO na krmilnikih STM8S. Na plošči je že vgrajena LED dioda, ki je priključena na zatič 5 vhoda B, naučili se bomo, kako to LED utripati, dodali pa bomo tudi zunanjo LED in jo upravljali s tipko. Če ste popolnoma novi, je zelo priporočljivo, da preberete prejšnjo vadnico, preden nadaljujete.
Priprava strojne opreme
Preden se potopimo v program, pripravimo strojne povezave. Kot smo že omenili, bomo tu uporabili dve LED, ena je vgrajena LED, ki bo neprekinjeno utripala, druga pa zunanja LED, ki jo preklopimo s pritiskom na gumb. Ideja je, da se v preprosti nastavitvi naučite vseh funkcij GPIO. Vgrajeni Led je že povezan s PB5 (pin5 PORTB), zato sem pravkar priklopil LED na PA3 in gumb na PA2, kot lahko vidite na spodnjem diagramu.
Zakaj pa sem med vsemi izhodnimi zatiči, ki so na voljo na našem nadzorovanem, izbral PA3 za izhod in PA2 za vhod? Vprašanja so veljavna in to bom razložil kasneje v tem članku. Moja nastavitev strojne opreme za to vadnico je prikazana spodaj. Kot lahko vidite, sem svoj programator ST-link priključil tudi na programske nožice, ki ne bodo le programirale naše plošče, temveč bodo služile tudi kot vir energije.
Razumevanje izrezov GPIO na STM8S103F
Zdaj se vračamo k vprašanju, zakaj PA2 za vhod in zakaj PA3 za izhod? Da bi to razumeli, si podrobneje oglejmo pinout mikrokrmilnika, ki je prikazan spodaj.
Kot je prikazano na diagramu pinout, imamo na našem mikrokrmilniku štiri vrata, in sicer PORT A, B, C in D, označena s PA, PB, PC in PD. Vsak zatič GPIO je obrobljen tudi z neko drugo posebno funkcionalnostjo. Na primer, PB5 (zatič 5 PORTA B) ne more delovati samo kot zatič GPIO, temveč tudi kot zatič SDA za komunikacijo I2C in kot izhodni zatič Timer 1. Če torej ta pin uporabljamo za preproste GPIO namene, kot je povezava LED, potem ne bomo mogli uporabljati I2C in LED hkrati. Na žalost je vgrajena LED dioda priključena na ta zatič, zato tu nimamo veliko izbire in v tem programu ne bomo uporabljali I2C, zato ni večjih težav.
Opis izvlečka in nasveti za izbiro GPM STM8S103F
Resnično rečeno, ne bi škodilo, če bi uporabili PA1 vhodni zatič in bi samo delal zatič. Toda namerno sem to opozoril, da bi mi ponudil priložnost, da vam pokažem nekaj običajnih pasti, v katere bi lahko padli pri izbiri zatičev GPIO na novem mikrokrmilniku. Najbolje se je izogniti pasti, če preberete podrobnosti o zatičih in opis zatičev, ki so navedeni v podatkovnem listu STM8S103F3P6. Podrobnosti o opisu zatiča mikrokrmilnika STM8S103F3P6, ki so omenjeni v obrazcu, so prikazane pod slikami.
Vhodni zatiči na našem mikrokrmilniku so lahko plavajoči ali šibki vlečni, izhodni zatiči pa so lahko Open Drain ali Push-pull. Razlika med zatiči Open Drain in Push-Pull Output je že obravnavana, zato o podrobnostih tega ne bomo. Preprosto povedano, z izhodnim zatičem Open Drain lahko izhod postane le tako nizek in ne tako visok, medtem ko lahko izhodni zatič s potisnim izvlekom naredi izhod tako visok kot visok.
Poleg tega iz zgornje tabele lahko opazite tudi, da je izhodni zatič lahko hitri izhod (10 MHz) ali počasni izhod (2 MHz). To določa hitrost GPIO, če želite zelo hitro preklopiti zatiče GPIO med visoko in nizko, potem lahko izberemo Hitri izhod.
Nekateri zatiči GPIO na našem krmilniku podpirajo True Open Drain (T) in High Sink Current (HS), kot je omenjeno na zgornji sliki. Bistvena razlika med odprtim odtokom in resničnim odprtim odtokom je, da izhoda, priključenega na odprt odtok, ni mogoče potegniti visoko kot delovna napetost mikrokrmilnika (Vdd), medtem ko je resnični izhodni zatič odprtega odtoka mogoče potegniti višje od Vdd. Zatiči z visoko zmogljivostjo umivalnika pomenijo, da lahko potopi več toka. Vir in potopni tok katerega koli zatiča GPIO HS je 20 mA, medtem ko lahko daljnovod porabi do 100 mA.
Če natančneje pogledate zgornjo sliko, boste opazili, da so skoraj vsi zatiči GPIO tipa High Sink Current (HS), razen PB4 in PB5, ki sta True Open Drain Type (T). To pomeni, da teh zatičev ni mogoče postaviti visoko, tudi če je zatič visok, ne bodo mogli zagotoviti 3,3 V. Zato je vgrajeni vodnik priključen na 3.3V in ozemljen prek PB5, namesto da bi ga napajal neposredno iz zatiča GPIO.
Podroben opis zatiča si oglejte na strani 28 v obrazcu. Kot je omenjeno na zgornji sliki, je PA1 samodejno konfiguriran kot šibek dvig in ni priporočljivo, da se uporablja kot izhodni zatič. Kakor koli že, ga lahko uporabimo kot vhodni zatič skupaj s pritiskom na gumb, vendar sem se odločil, da uporabim PA2 samo zato, da poskusim omogočiti pull up iz programa. To je le nekaj osnovnih stvari, ki bodo koristne, ko pišemo veliko bolj zapletene programe. Za zdaj je v redu, če se vam je marsikaj odbilo od glave, bomo o tem razpravljali v drugih vajah.
Programiranje STM8S za GPIO vhod in izhod z uporabo SPL
Ustvarite delovni prostor in nov projekt, kot smo razpravljali v naši prvi vadnici. Lahko dodate vse glave in izvorne datoteke ali pa samo datoteke gpio, config in stm8s. Odprite datoteko main.c in začnite pisati program.
Prepričajte se, da ste vključili datoteke z glavo, kot je prikazano na zgornji sliki. Odprite datoteko main.c in zaženite kodo. Popolno kodo main.c najdete na dnu te strani, od tam pa boste lahko tudi prenesli projektno datoteko. Razlaga kode je naslednja. Če ste zmedeni glede kodiranja, se lahko obrnete tudi na uporabniški priročnik SPL ali na video, ki je povezan na dnu te strani.
Deinicializacija zahtevanih vrat
Naš program začnemo z deinicializacijo zahtevanih vrat. Kot smo že omenili, bo imel vsak GPIO zatič veliko drugih funkcij, ki ne delujejo kot običajni vhod in izhod. Če so bili ti žepki že uporabljeni za nekatere druge aplikacije, jih je treba pred začetkom deinicializirati. Ni obvezno, vendar je dobra praksa. Naslednji dve vrstici kode se uporabljata za deinicializacijo vrat A in vrat B. Samo uporabite sintakso GPIO_DeInit (GPIOx); in namesto x omenite ime pristanišča.
GPIO_DeInit (GPIOA); // pripravimo vrata A za delujoči GPIO_DeInit (GPIOB); // pripravimo vrata B za delo
Vhodna in izhodna izjava GPIO
Nato moramo razglasiti, kateri zatiči bodo uporabljeni kot vhodni in kateri kot izhodni. V našem primeru bo za vhod uporabljen zatič PA2, ta zatič pa bomo razglasili tudi z notranjim vlečenjem, tako da nam ga ni treba uporabljati zunaj. Sintaksa je GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Kjer je x ime vrat, y je številka PIN-a in z način GPIO Pin.
// prijavi PA2 kot vhodni izvlečni zatič GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Nato moramo zatiči PA3 in PB5 razglasiti za izhod. Ponovno je možnih veliko vrst izhodnih deklaracij, vendar bomo uporabili »GPIO_MODE_OUT_PP_LOW_SLOW«, kar pomeni, da ga bomo razglasili kot izhodni zatič tipa push-pull s počasno hitrostjo. In privzeto bo vrednost nizka. Sintaksa bo enaka.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // PB5 prijavimo kot push pull izhodni zatič GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Spodnji posnetek uporabniškega priročnika SPL omenja vse možne načine GPIO (z).
Neskončna zanka medtem
Po deklaraciji zatiča moramo ustvariti neskončno zanko, znotraj katere bomo LED večno utripali in spremljali stanje gumba za preklop LED. Neskončna zanka lahko ustvari s časom (1) ali z for (;;) . Tukaj sem uporabil while (1).
medtem ko (1) {}
Preverjanje stanja vhodnega zatiča
Preveriti moramo stanje vhodnega zatiča, sintaksa tega pa je GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); kjer je x ime vrat, y pa številka zatiča. Če je zatič visok, bomo dobili '1', če je zatič nizek, pa '0'. V notranjosti zanke if smo preverjali, ali je zatič visok ali nizek.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // če je gumb pritisnjen
Izdelava GPIO Pin High ali Low
Za izdelavo GPIO zatiča High ali Low lahko uporabimo GPIO_WriteHigh (GPIOx, GPIO_PIN_y); in GPIO_WriteLow (GPIOx, GPIO_PIN_y); oz. Tu smo naredili LED, da se vklopi, če pritisnete gumb, in ugasne, če gumba ne pritisnete.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // // če je pritisnjen gumb GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED sveti drugače GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED IZKLOPLJEN
Preklop PIN-a GPIO
Za preklop GPIO zatiča imamo GPIO_WriteReverse (GPIOx, GPIO_PIN_y); klic te funkcije bo spremenil stanje izhodnega zatiča. Če je zatič visok, se spremeni v nizek, če je nizek, pa v visok. To funkcijo uporabljamo za utripanje vgrajene LED na PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Funkcija zakasnitve
Za razliko od Arduina, vesoljni prevajalnik nima vnaprej določene funkcije zakasnitve. Torej ga moramo ustvariti sami. Moja funkcija zakasnitve je navedena spodaj. Vrednost doe delay bo prejeta v spremenljivko ms in uporabili bomo dve za zanko za zadrževanje ali izvajanje programa. Tako kot _asm ("nop") je navodilo za sestavljanje, ki ne pomeni nobene operacije. To pomeni, da bo krmilnik zavijal v zanko for, ne da bi izvedel kakršno koli operacijo, kar bo povzročilo zamudo.
void delay (int ms) // Opredelitev funkcije {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // ne izvajaj nobene operacije // montažna koda}}
Nalaganje in preizkušanje programa
Zdaj, ko je naš program pripravljen, ga lahko naložimo in preizkusimo. Po nalaganju je moja strojna oprema delovala po pričakovanjih. Vgrajena rdeča LED je utripala vsakih 500 milisekund in zunanja zelena LED se je vklopila vsakič, ko sem pritisnil stikalo.
Celotno delo najdete v spodnjem videoposnetku. Ko dosežete to točko, lahko poskusite povezati stikalo in LED na različne nožice in znova napišite kodo, da boste razumeli koncept. Lahko se tudi poigrate s časovnim zamikom, da preverite, ali ste koncepte jasno razumeli.
Če imate kakršna koli vprašanja, jih pustite v spodnjem oddelku za komentarje, za druga tehnična vprašanja pa lahko uporabite naše forume. Hvala, ker ste sledili, se vidimo v naslednji vadnici.