- Priprema hardvera
- Razumijevanje GPIO pinouta na STM8S103F
- Opis i savjeti za pinout za odabir STM8S103F GPIO
- Programiranje STM8S za GPIO ulaz i izlaz pomoću SPL-a
- Učitavanje i testiranje programa
Za mikrokontrolere, program za treptanje LED ekvivalentan je programu "hello world". U našem prethodnom vodiču naučili smo kako započeti sa STM8S103F3 razvojnom pločom i kako postaviti IDE i kompajler za programiranje naših STM8S kontrolera. Također smo naučili kako koristiti standardne periferne knjižnice te kako kompilirati i prenijeti kod u naš mikrokontroler. Sa svim pokrivenim osnovama, zapravo započinjemo s pisanjem koda. U ovom uputstvu naučit ćemo kako izvoditi opće GPIO funkcije na STM8S kontrolerima. Ploča već ima ugrađenu LED diodu povezanu na pin 5 priključka B, naučit ćemo kako treptati ovu LED diodu, a također ćemo dodati vanjsku LED diodu i kontrolirati je tipkom. Ako ste potpuno novi, toplo se preporučuje da pročitate prethodni vodič prije nego što nastavite dalje.
Priprema hardvera
Prije nego što uđemo u program, pripremite hardverske veze. Kao što smo ranije spomenuli, ovdje ćemo koristiti dvije LED diode, jedna je ugrađena LED koja će neprekidno treptati, a druga je vanjska LED dioda koja će se prebacivati tipkom. Ideja je naučiti svu GPIO funkcionalnost jednostavnim postavljanjem. Ugrađeni Led već je spojen na PB5 (pin5 PORTB-a), pa sam upravo spojio LED na PA3 i tipku na PA2, kao što možete vidjeti na donjem dijagramu.

Ali, od svih izlaznih pinova dostupnih na našem kontroliranom, zašto sam odabrao PA3 za izlaz i PA2 za ulaz? Pitanja su valjana i to ću objasniti kasnije u ovom članku. Moja postavka hardvera za ovaj vodič je prikazana u nastavku. Kao što vidite, također sam svoj ST-link programer povezao s programskim iglama koje ne samo da će programirati našu ploču već će djelovati i kao izvor napajanja.

Razumijevanje GPIO pinouta na STM8S103F
Sada se vraćamo na pitanje, zašto PA2 za ulaz i zašto PA3 za izlaz? Da bismo to razumjeli, pogledajmo pobliže pinout mikrokontrolera koji je prikazan u nastavku.

Prema dijagramu pinouta, na našem mikrokontroleru imamo četiri porta, i to PORT A, B, C i D koji su označeni PA, PB, PC i PD. Svaki GPIO pin također je spojen s nekom drugom posebnom funkcionalnošću. Na primjer, PB5 (pin 5 PORTA B) ne može raditi samo kao GPIO pin, već i kao SDA pin za I2C komunikaciju i kao izlazni pin Timer 1. Dakle, ako ovaj pin koristimo za jednostavne GPIO svrhe, poput spajanja LED-a, tada nećemo moći istovremeno koristiti I2C i LED. Nažalost, ugrađena LED dioda spojena je na ovaj pin, tako da ovdje nemamo puno izbora, a u ovom programu nećemo koristiti I2C, pa to nije velik problem.
Opis i savjeti za pinout za odabir STM8S103F GPIO
Iskreno govoreći, ne bi škodilo koristiti PA1 ulazni pin, a to bi samo radio pin. No, namjerno sam ovo pokrenuo kako bih mi pružio priliku da vam pokažem neke uobičajene zamke u koje biste mogli upasti prilikom odabira GPIO pinova na novom mikrokontroleru. Najbolje je izbjeći zamke da pročitate detalje pin-a i opis pin-a koji su navedeni u tablici podataka STM8S103F3P6. Za opis pin-a mikrokontrolera STM8S103F3P6 detalji koji su spomenuti u tehničkom listu prikazani su ispod slika.

Ulazne igle na našem mikrokontroleru mogu biti plutajuće ili slabo povlačenje, a izlazne igle mogu biti Otvoreni odvod ili Puh-povuci. Već je razgovarano o razlici između otvorenih odvodnih i izlazno-izvlačnih pinova, stoga nećemo ulaziti u detalje o tome. Pojednostavljeno, izlazni pin s otvorenim odvodom može učiniti izlaz nižim i ne tako visokim, dok izlazni pin pomoću push-pull može učiniti izlaz i visokim i visokim.
Osim onoga iz gornje tablice, također možete primijetiti da izlazni pin može biti Brzi izlaz (10 MHz) ili Spori izlaz (2 MHz). Ovo određuje GPIO brzinu, ako želite vrlo brzo prebaciti GPIO pinove između visoke i niske, tada možemo odabrati Brzi izlaz.

Neki GPIO pinovi na našem kontroleru podržavaju True Open Drain (T) i High Sink Current (HS), kao što je spomenuto na gornjoj slici. Značajna razlika između otvorenog odvoda i istinskog otvorenog odvoda je u tome što se izlaz povezan na otvoreni odvod ne može povući više od radnog napona mikrokontrolera (Vdd), dok se istinski izlazni zatik otvorenog odvoda može povući veći od Vdd. Pribadače s visokom sposobnošću umivaonika znače da mogu potonuti više struje. Izvor i struja poniranja bilo kojeg GPIO HS pina je 20mA, dok dalekovod može potrošiti do 100 mA.
Ako malo bolje pogledate gornju sliku, primijetit ćete da su gotovo svi GPIO pinovi tipa High Sink Current (HS), osim PB4 i PB5 koji su True Open Drain Type (T). To znači da ove pinove nije moguće podići visoko, neće moći pružiti 3,3 V čak i kada je pinove postavljene visoko. Zbog toga je ugrađena led spojena na 3.3V i uzemljena preko PB5, umjesto da se napaja izravno s GPIO pina.

Detaljan opis pribadače potražite na stranici 28 na tehničkom listu. Kao što je spomenuto na gornjoj slici, PA1 se automatski konfigurira kao slabo izvlačenje i ne preporučuje se koristiti kao izlazni pin. U svakom slučaju može se koristiti kao ulazni klin zajedno s tipkom, ali odlučio sam koristiti PA2 samo kako bih pokušao omogućiti povlačenje iz programa. Ovo je samo nekoliko osnovnih stvari koje će biti korisne kada napišemo puno složenije programe. Za sada je u redu ako vam se mnoge stvari odbiju od glave, ući ćemo u to u drugim vodičima.
Programiranje STM8S za GPIO ulaz i izlaz pomoću SPL-a
Stvorite radni prostor i novi projekt o čemu smo raspravljali u našem prvom vodiču. Možete dodati sva zaglavlja i izvorne datoteke ili dodati samo datoteke gpio, config i stm8s. Otvorite datoteku main.c i počnite pisati svoj program.

Obavezno uključite datoteke zaglavlja kao što je prikazano na gornjoj slici. Otvorite datoteku main.c i pokrenite kôd. Kompletni main.c kôd nalazi se na dnu ove stranice, a odatle ćete moći i preuzeti projektnu datoteku. Objašnjenje koda je sljedeće, možete se također pozvati na korisnički priručnik SPL-a ili video link na dnu ove stranice ako ste zbunjeni oko dijela kodiranja.
Deinicijalizacija potrebnog priključka
Naš program započinjemo Deinicijalizacijom potrebnih priključaka. Kao što smo ranije razgovarali, svaki GPIO pin ima brojne druge funkcije povezane s njim, osim što radi samo kao uobičajeni ulaz i izlaz. Ako su se ove igle prethodno koristile za neke druge programe, tada ih treba deinicijalizirati prije nego što ih upotrijebimo. Nije obvezno, međutim dobra je praksa. Sljedeća dva retka koda koriste se za deinicijalizaciju porta A i porta B. Samo upotrijebite sintaksu GPIO_DeInit (GPIOx); i spomenite ime luke umjesto x.
GPIO_DeInit (GPIOA); // pripremiti port A za radni GPIO_DeInit (GPIOB); // pripremiti priključak B za rad
Ulazna i izlazna GPIO deklaracija
Dalje, moramo proglasiti koje će se igle koristiti kao ulaz, a koje kao izlaz. U našem slučaju, pin PA2 će se koristiti kao ulaz, također ćemo prijaviti ovaj pin s unutarnjim povlačenjem, tako da ga ne moramo koristiti izvana. Sintaksa je GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Gdje je x naziv priključka, y je broj pina, a z je način GPIO pina.
// Deklarirajte PA2 kao ulazni izvlačni pin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Dalje, igle PA3 i PB5 moramo proglasiti izlazima. Ponovno su moguće mnoge vrste deklaracije izlaza, ali mi ćemo koristiti "GPIO_MODE_OUT_PP_LOW_SLOW", što znači da ćemo ga deklarirati kao izlazni pin push-pull tipa s malom brzinom. A prema zadanim postavkama vrijednost će biti niska. Sintaksa će biti ista.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Deklarirajte PB5 kao push pull izlazni pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Snimka u nastavku iz korisničkog priručnika SPL-a spominje sve moguće GPIO načine (z).

Beskonačna dok petlja
Nakon deklaracije pin-a, moramo stvoriti beskonačnu petlju unutar koje ćemo neprestano treptati LED i nadzirati status tipke za prebacivanje LED-a. Beskonačna petlja može se stvoriti s neko vrijeme (1) ili s for (;;) . Ovdje sam koristio while (1).
dok (1) {}
Provjera statusa ulaznog pina
Moramo provjeriti status ulaznog pina, sintaksa za to je GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); gdje je x naziv porta, a y pin broj. Ako je pin visok, dobit ćemo '1', a ako je pin nizak, dobit ćemo '0'. Nekad smo petlju if provjeravali je li pin visok ili nizak.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // ako je pritisnuta tipka
Izrada GPIO pin visoke ili niske
Za izradu GPIO pin visoke ili niske, možemo koristiti GPIO_WriteHigh (GPIOx, GPIO_PIN_y); i GPIO_WriteLow (GPIOx, GPIO_PIN_y); odnosno. Ovdje smo napravili LED da se pali ako se pritisne tipka i isključuje ako se ne pritisne.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // // ako je pritisnut gumb GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED uključen inače GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED ISKLJUČEN
Uključivanje i isključivanje GPIO pina
Za prebacivanje GPIO pina imamo GPIO_WriteReverse (GPIOx, GPIO_PIN_y); pozivanjem ove funkcije promijenit će se status izlaznog pina. Ako je iglica visoka, promijenit će se u nisku, a ako je niska, promijenit će se u visoku. Ovu funkciju koristimo za treptanje ugrađene LED diode na PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Funkcija odgode
Za razliku od Arduina, kozmički kompajler nema unaprijed definiranu funkciju odgode. Stoga ga moramo sami stvoriti. Moja funkcija odgode data je u nastavku. Vrijednost doe delay će se primiti u varijablu ms i upotrijebit ćemo dvije for petlje za zadržavanje ili izvršavanje programa. Poput _asm ("nop") je uputa za sastavljanje koja ne znači nikakvu operaciju. To znači da će kontroler petlju petlje for izvršiti bez izvođenja bilo kakvih operacija, stvarajući time kašnjenje.
void delay (int ms) // Definicija 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 izvodimo nikakvu operaciju // kod za montažu}}
Učitavanje i testiranje programa
Sad kad je naš program spreman, možemo ga prenijeti i testirati. Nakon prijenosa, moj je hardver radio kako se očekivalo. Ugrađena crvena LED lampica treptala je svakih 500 milisekundi, a vanjska zelena LED lampica se uključivala svaki put kad sam pritisnuo prekidač.

Kompletan rad možete pronaći u video linku ispod. Nakon što dosegnete ovu točku, možete pokušati spojiti prekidač i LED na različite igle i ponovo napisati kôd da biste razumjeli koncept. Također se možete poigrati vremenom odgode kako biste provjerili jeste li jasno razumjeli koncepte.
Ako imate bilo kakvih pitanja, ostavite ih u odjeljku za komentare u nastavku, a za ostala tehnička pitanja možete koristiti naše forume. Hvala što ste slijedili, vidimo se u sljedećem vodiču.

