- Laitteiston valmistelu
- STM8S103F: n GPIO-pinoutien ymmärtäminen
- Pinoutin kuvaus ja vinkkejä STM8S103F GPIO -valintaan
- STM8S: n ohjelmointi GPIO-tulolle ja -lähdölle SPL: n avulla
- Ohjelman lataaminen ja testaaminen
Mikrokontrollereille LED-vilkkuva ohjelma vastaa "hei maailma" -ohjelmaa. Edellisessä opetusohjelmassa opimme, miten pääset alkuun STM8S103F3-kehityskortilla ja kuinka määritetään IDE ja kääntäjä ohjelmoimaan STM8S-ohjaimet. Olemme myös oppineet käyttämään tavallisia oheiskirjastoja ja kuinka kääntää ja ladata koodi mikro-ohjaimeemme. Kun kaikki perusasiat on käsitelty, voit aloittaa koodin kirjoittamisen. Tässä opetusohjelmassa opimme suorittamaan yleisiä GPIO-toimintoja STM8S-ohjaimille. Piirilevyssä on jo sisäänrakennettu LED-liitäntä portin B nastaa 5, opimme kuinka vilkuttaa tätä LEDiä ja lisätä myös ulkoinen LED ja ohjata sitä painikkeella. Jos olet täysin uusi, on erittäin suositeltavaa lukea edellinen opetusohjelma ennen kuin jatkat.
Laitteiston valmistelu
Ennen kuin sukellamme ohjelmaan, anna laitteistoyhteyksien olla valmiina. Kuten alussa mainittiin, käytämme täällä kahta LEDiä, yksi on sisäinen LED, joka vilkkuu jatkuvasti ja toinen on ulkoinen LED, joka kytketään painikkeella. Ajatuksena on oppia kaikki GPIO-toiminnot yksinkertaisella asetuksella. Sisäinen Led on jo kytketty PB5: een (PORTB: n pin5), joten olen juuri liittänyt LEDin PA3: een ja painikkeen PA2: een, kuten alla olevasta kaaviosta näet.
Mutta kaikista ohjaamassamme käytettävissä olevista lähtöliittimistä miksi valitsin PA3 lähdölle ja PA2 tulolle? Kysymykset ovat päteviä, ja selitän sen myöhemmin tässä artikkelissa. Tämän opetusohjelman laitteistomääritykset on esitetty alla. Kuten näette, olen myös liittänyt ST-link-ohjelmoijani ohjelmointineuloihin, jotka paitsi ohjelmoivat korttimme, mutta toimivat myös virtalähteenä.
STM8S103F: n GPIO-pinoutien ymmärtäminen
Palataan nyt kysymykseen, miksi PA2 syötteelle ja miksi PA3 lähdölle? Tämän ymmärtämiseksi katsotaanpa tarkemmin alla olevan mikrokontrollerin pinoutia.
Pinout-kaavion mukaan mikrokontrollerissamme on neljä porttia, nimittäin PORT A, B, C ja D, joita merkitään vastaavasti PA, PB, PC ja PD. Jokainen GPIO-nasta on myös klubimajoitettu jollakin muulla erikoistoiminnolla. Esimerkiksi PB5 (PORT B: n nasta 5) ei voi toimia vain GPIO-nastana, vaan myös SDA-nastana I2C-viestinnässä ja ajastin 1 -ulostapina. Joten jos käytämme tätä nastaa yksinkertaisiin GPIO-tarkoituksiin, kuten LEDin liittämiseen, emme voi käyttää I2C: tä ja LEDiä samanaikaisesti. Valitettavasti ajoneuvon LED on kytketty tähän tapiin, joten meillä ei ole paljon valinnanvaraa täällä, ja tässä ohjelmassa emme aio käyttää I2C: tä, joten se ei ole suuri ongelma.
Pinoutin kuvaus ja vinkkejä STM8S103F GPIO -valintaan
Todellakin, ei olisi haittaa käyttää PA1-tulotappia ja se vain toimisi. Mutta toin tämän tarkoituksella tarjoamaan minulle mahdollisuuden näyttää sinulle joitain yleisiä ansoja, joihin saatat joutua, kun valitset GPIO-nastat uudelle mikrokontrollerille. Paras välttää ansoja on lukea nastatiedot ja neulan kuvaus, jotka on annettu STM8S103F3P6-tietolomakkeessa. STM8S103F3P6-mikrokontrolleri-nastan kuvauksen yksityiskohdat, jotka on mainittu tietolomakkeessa, esitetään kuvien alla.
Mikrokontrollerimme tulotapit voivat olla joko kelluvia tai heikkoja vetovoimia ja lähtönastat voivat olla joko avointa tyhjennystä tai työntöä. Open Drain- ja Push-Pull Output -nastojen välisestä erosta on jo keskusteltu, joten emme pääse siihen yksityiskohtiin. Yksinkertaisesti sanottuna, avoimen tyhjennyksen ulostulotappi voi tehdä ulostulosta vain niin matalan eikä yhtä korkean, kun taas työntövetäisen ulostulotapin avulla lähtö voi olla sekä korkea että korkea.
Yllä olevan taulukon lisäksi voit myös huomata, että ulostulotappi voi olla joko nopea lähtö (10 Mhz) tai hidas lähtö (2 MHz). Tämä määrittää GPIO-nopeuden, jos haluat vaihtaa GPIO-nastat erittäin korkean ja matalan välillä, voimme valita nopean lähdön.
Jotkut ohjaimen GPIO-nastat tukevat True Open Drain (T) - ja High Sink Current (HS) -viestejä, kuten yllä olevassa kuvassa mainitaan. Huomattava ero avoimen tyhjennyksen ja todellisen avoimen tyhjennyksen välillä on, että avoimeen viemäriin kytkettyä lähtöä ei voida vetää korkeammalle kuin mikro-ohjaimen käyttöjännite (Vdd), kun taas todellinen tyhjennyksen ulostulotappi voidaan vetää korkeammalle kuin Vdd. Nastat, joilla on korkea uppoamisominaisuus, tarkoittaa, että ne voivat upottaa enemmän virtaa. Minkä tahansa GPIO HS -nastan lähde- ja pesuallavirta on 20 mA, kun taas virtajohto voi kuluttaa jopa 100 mA.
Tarkastelemalla yllä olevaa kuvaa tarkemmin, huomaat, että melkein kaikki GPIO-nastat ovat High Sink Current (HS) -tyyppisiä, paitsi PB4 ja PB5, jotka ovat True Open Drain Type (T). Tämä tarkoittaa, että näitä nastoja ei voida tehdä korkeiksi, ne eivät pysty tuottamaan 3,3 V: n virtaa, vaikka tappi olisi tehty korkealle. Siksi sisäinen led on kytketty 3,3 V: iin ja maadoitettu PB5: n kautta sen sijaan, että virtalähde olisi suoraan GPIO-nastasta.
Katso yksityiskohtainen tappi-kuvaus tietolomakkeen sivulta 28. Kuten yllä olevassa kuvassa mainittiin, PA1 konfiguroidaan automaattisesti heikkona vetona eikä sitä suositella käytettäväksi ulostulona. Joka tapauksessa sitä voidaan käyttää syöttötapina yhdessä painikkeen kanssa, mutta päätin käyttää PA2: ta vain yrittääkseni sallia vedon ohjelmasta. Nämä ovat vain muutamia perusasioita, joista on hyötyä, kun kirjoitamme paljon monimutkaisempia ohjelmia. Toistaiseksi on kunnossa, jos monet asiat pomppii päältäsi, pääsemme siihen kerrokseen muissa opetusohjelmissa.
STM8S: n ohjelmointi GPIO-tulolle ja -lähdölle SPL: n avulla
Luo työtila ja uusi projekti, kuten keskustelimme ensimmäisessä opetusohjelmassa. Voit joko lisätä kaikki otsikko- ja lähdetiedostot tai lisätä vain gpio-, config- ja stm8s-tiedostot. Avaa main.c- tiedosto ja aloita ohjelman kirjoittaminen.
Varmista, että olet sisällyttänyt otsikkotiedostot yllä olevan kuvan mukaisesti. Avaa main.c- tiedosto ja käynnistä koodi. Koko main.c-koodi löytyy tämän sivun alareunasta, ja voit myös ladata projektitiedoston sieltä. Koodin selitys on seuraava. Voit myös viitata SPL-käyttöoppaaseen tai tämän sivun alaosaan linkitettyyn videoon, jos olet hämmentynyt koodausosasta.
Vaaditun portin alustaminen
Aloitamme ohjelmamme poistamalla vaaditut portit. Kuten aiemmin keskustelimme, jokaisella GPIO-nastalla on monia muita toimintoja, jotka eivät liity pelkästään normaaliin tuloon ja lähtöön. Jos näitä nastoja on aiemmin käytetty joissakin muissa sovelluksissa, se on alustettava ennen niiden käyttöä. Se ei ole pakollinen, mutta se on hyvä käytäntö. Seuraavia kahta koodiriviä käytetään porttien A ja B alustamiseen. Käytä vain syntaksia GPIO_DeInit (GPIOx); ja mainitse portin nimi x: n sijasta.
GPIO_DeInit (GPIOA); // valmistele portti A GPIO_DeInit (GPIOB) -työkalua varten; // valmistele portti B työskentelyä varten
Syöttö ja lähtö GPIO-ilmoitus
Seuraavaksi meidän on ilmoitettava, mitä nastoja käytetään syötteenä ja mitä lähtöinä. Meidän tapauksessamme nasta PA2 käytetään syötteenä, ilmoitamme myös tämän nastan sisäisellä pull-upilla, jotta meidän ei tarvitse käyttää sitä ulkoisesti. Syntaksi on GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Missä x on portin nimi, y on pin-numero ja z on GPIO-nastatila.
// Ilmoitetaan PA2 syötteen vetotapiksi GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Seuraavaksi meidän on ilmoitettava nastat PA3 ja PB5 tuotokseksi. Jälleen monentyyppiset lähtöilmoitukset ovat mahdollisia, mutta käytämme ”GPIO_MODE_OUT_PP_LOW_SLOW”, mikä tarkoittaa, että ilmoitamme sen push-pull -tyyppiseksi lähtöliittimeksi hitaalla nopeudella. Ja oletusarvoisesti arvo on pieni. Syntaksi on sama.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Ilmoitetaan PB5 push pull -ulostulona GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Alla oleva SPL-käyttöohjeen tilannekuva mainitsee kaikki mahdolliset GPIO-tilat (z).
Ääretön silmukka
Tappi-ilmoituksen jälkeen meidän on luotava ääretön silmukka, jonka sisällä vilkkumme jatkuvasti LED: ää ikuisesti ja seuraamme LED-painikkeen tilaa. Ääretön silmukka voi joko luoda hetken (1) tai for: lla (;;) . Täällä olen käyttänyt while (1).
kun (1) {}
Tulotapin tilan tarkistaminen
Meidän on tarkistettava syöttötapin tila. Syntaksi on GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); missä x on portin nimi ja y on pin-numero. Jos tappi on korkea, saamme '1' ja jos tappi on matala, '0'. Olemme tottuneet sisään if-silmukan sisään tarkistamaan, onko tappi korkea tai matala.
jos (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jos painiketta painetaan
GPIO-nastan asettaminen korkeaksi tai matalaksi
GPIO-nastan asettamiseksi korkeaksi tai matalaksi voimme käyttää GPIO_WriteHigh (GPIOx, GPIO_PIN_y); ja GPIO_WriteLow (GPIOx, GPIO_PIN_y); vastaavasti. Täällä olemme saaneet LED-valon syttymään, jos painiketta painetaan, ja sammuttamaan, jos painiketta ei paineta.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jos painiketta painetaan GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED palaa muuten GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED ei pala
GPIO-nastan vaihtaminen
GPIO-nastan vaihtamiseksi meillä on GPIO_WriteReverse (GPIOx, GPIO_PIN_y); kutsumalla tämä toiminto muuttaa lähtönastan tilaa. Jos tappi on korkea, se muutetaan matalaksi ja jos se on matala, se muutetaan korkeaksi. Käytämme tätä toimintoa vilkkumaan PB5: n sisäinen LED.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Viivetoiminto
Toisin kuin Arduino, kosmisella kääntäjällä ei ole ennalta määritettyä viivetoimintoa. Joten meidän on luotava yksi omasta. Viivetoimintoni on annettu alla. Arvo viive vastaanotetaan muuttujassa ms, ja me käytämme kahta silmukan pitämiseen tai ohjelman suorittamiseen. Kuten _asm (“nop”) on asennusohje, joka ei tarkoita mitään toimintaa. Tämä tarkoittaa, että ohjain silmukkaa for-silmukkaan suorittamatta mitään toimintoa, mikä luo viiveen.
void delay (int ms) // Funktion määritelmä {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {varten (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Suorita mitään toimintoa // kokoonpanokoodi}}
Ohjelman lataaminen ja testaaminen
Nyt kun ohjelmamme on valmis, voimme ladata sen ja testata sitä. Ladattuani laitteistoni toimi odotetulla tavalla. Sisäinen punainen LED vilkkuu 500 millisekunnin välein ja ulkoinen vihreä LED syttyi aina, kun painan kytkintä.
Koko työ löytyy alla olevasta videosta. Kun olet saavuttanut tämän pisteen, voit yrittää kytkeä kytkimen ja LEDin eri nastoihin ja kirjoittaa koodin uudelleen käsitteen ymmärtämiseksi. Voit myös pelata viiveajoituksella tarkistaaksesi, oletko ymmärtänyt käsitteet selvästi.
Jos sinulla on kysyttävää, jätä ne alla olevaan kommenttiosioon ja muita teknisiä kysymyksiä varten voit käyttää foorumeitamme. Kiitos seurannastasi, nähdään seuraavassa opetusohjelmassa.