- Gør hardware klar
- Forståelse af GPIO Pinouts på STM8S103F
- Pinout-beskrivelse og tip til STM8S103F GPIO-valg
- Programmering STM8S til GPIO input og output ved hjælp af SPL
- Upload og test af programmet
For mikrokontrollere svarer et LED-blinkende program til programmet “hej verden”. I vores tidligere tutorial lærte vi, hvordan vi kommer i gang med STM8S103F3 Development Board, og hvordan vi opsætter IDE og compiler til at programmere vores STM8S-controllere. Vi har også lært, hvordan man bruger standard perifere biblioteker, og hvordan man kompilerer og uploader koden til vores mikrocontroller. Med alt det grundlæggende dækket kan vi faktisk begynde at skrive kode. I denne vejledning lærer vi, hvordan man udfører generelle GPIO-funktioner på STM8S-controllere. Kortet har allerede en indbygget LED tilsluttet pin 5 i port B, vi vil lære at blinke denne LED og også tilføje en ekstern LED og styre den med en trykknap. Hvis du er helt ny, anbefales det stærkt at læse den foregående vejledning, før du fortsætter videre.
Gør hardware klar
Før vi dykker ind i programmet, skal du gøre hardwareforbindelserne klar. Som nævnt tidligt bruger vi to lysdioder her, den ene er en indbygget LED, som blinker kontinuerligt, og den anden er en ekstern LED, der skiftes med en trykknap. Ideen er at lære al GPIO-funktionalitet i en enkel opsætning. Den indbyggede Led er allerede tilsluttet PB5 (pin5 i PORTB), så jeg har lige tilsluttet en LED til PA3 og en trykknap til PA2, som du kan se i diagrammet nedenfor.
Men af alle outputstifter, der er tilgængelige på vores kontrollerede, hvorfor valgte jeg PA3 til output og PA2 til input? Spørgsmålene er gyldige, og det forklarer jeg senere i denne artikel. Min hardwareopsætning til denne vejledning er vist nedenfor. Som du kan se, har jeg også tilsluttet min ST-link programmør til programmeringsstifter, som ikke kun programmerer vores kort, men også fungerer som en strømkilde.
Forståelse af GPIO Pinouts på STM8S103F
Vender nu tilbage til spørgsmålet, hvorfor PA2 til input og hvorfor PA3 til output? For at forstå det, lad os se nærmere på pinout på mikrocontrolleren, som er vist nedenfor.
I henhold til pinout-diagrammet har vi fire porte på vores mikrokontroller, nemlig PORT A, B, C og D betegnet med henholdsvis PA, PB, PC og PD. Hver GPIO-pin er også indkapslet med nogle andre specielle funktioner. For eksempel kan PB5 (pin 5 i PORT B) ikke kun fungere som en GPIO-pin, men også som en SDA-pin til I2C-kommunikation og som en Timer 1 output pin. Så hvis vi bruger denne pin til enkle GPIO-formål som at forbinde en LED, kan vi ikke bruge I2C og LED på samme tid. Desværre er den indbyggede LED tilsluttet denne pin, så vi har ikke meget valg her, og i dette program vil vi ikke bruge I2C, så det er ikke meget af et problem.
Pinout-beskrivelse og tip til STM8S103F GPIO-valg
Virkelig set ville det ikke skade at bruge PA1 en input pin, og det ville bare fungere pin. Men jeg har bevidst bragt dette op for at give mig en mulighed for at vise dig nogle almindelige fælder, som du kan falde i, når du vælger GPIO-ben på en ny mikrokontroller. Det bedste for at undgå fælderne er at læse stiftoplysningerne og stiftbeskrivelsen i STM8S103F3P6 databladet. For STM8S103F3P6 mikrokontroller pin beskrivelse detaljer, der er nævnt i databladet er vist nedenfor billeder.
Indgangsstifterne på vores mikrocontroller kan enten være flydende eller svag pull-up, og outputstifterne kan enten være Open Drain eller Push-pull. Forskellen mellem Open Drain og Push-Pull Output-ben er allerede diskuteret, og derfor kommer vi ikke nærmere ind på det. For at sige det enkelt kan en Open Drain output pin gøre output kun så lavt ikke så højt, mens en push-pull output pin kan gøre output både så højt som højt.
Bortset fra det fra ovenstående tabel kan du også bemærke, at en udgangsstift enten kan være hurtig udgang (10 MHz) eller langsom udgang (2 MHz). Dette bestemmer GPIO-hastigheden, hvis du vil skifte dine GPIO-ben mellem høj og lav meget hurtigt, så kan vi vælge Hurtig output.
Nogle GPIO-ben på vores controller understøtter True Open Drain (T) og High Sink Current (HS) som nævnt i ovenstående billede. En betydelig forskel mellem åben afløb og ægte åben afløb er, at udgangen, der er forbundet til åben afløb, ikke kan trækkes højt mere end driftsspændingen til mikrokontroller (Vdd), mens en ægte åben afløbsudgangsstift kan trækkes højere end Vdd. Stifter med høj vaskfunktion betyder, at den kan synke mere strøm. Kilden og vaskestrømmen for enhver GPIO HS-pin er 20 mA, mens strømledningen kan forbruge op til 100 mA.
Når vi ser nærmere på ovenstående billede, vil du bemærke, at næsten alle GPIO-ben er af typen Høj synkestrøm (HS) undtagen PB4 og PB5, som er sand åben afløbstype (T). Dette betyder, at disse stifter ikke kan gøres høje, de kan ikke levere 3,3 V, selv når stiften er lavet højt. Dette er grunden til, at den indbyggede led er forbundet til en 3,3 V og jordet via PB5 i stedet for at tænde den direkte fra GPIO-stiften.
Se side 28 på databladet for den detaljerede pinbeskrivelse. Som nævnt i ovenstående billede er PA1 automatisk konfigureret som en svag pull-up og anbefales ikke at blive brugt som en output pin. Under alle omstændigheder kan den bruges som en input pin sammen med en trykknap, men jeg besluttede at bruge PA2 bare for at prøve at muliggøre pull up fra programmet. Dette er blot nogle få grundlæggende ting, som vil være nyttige, når vi skriver meget mere komplicerede programmer. For nu er det okay, hvis mange ting sprang af dit hoved, kommer vi ind i det lag i andre tutorials.
Programmering STM8S til GPIO input og output ved hjælp af SPL
Opret et arbejdsområde og nyt projekt som vi diskuterede i vores første tutorial. Du kan enten tilføje alle header- og kildefiler eller kun tilføje gpio-, config- og stm8s-filerne. Åbn main.c- filen, og begynd at skrive dit program.
Sørg for, at du har inkluderet header-filerne som vist på billedet ovenfor. Åbn main.c- filen og start koden. Den komplette main.c-kode findes nederst på denne side, og du vil også kunne downloade projektfilen derfra. Forklaringen på koden er som følger, du kan også henvise til SPL-brugervejledningen eller den linkede video nederst på denne side, hvis du er forvirret over kodningsdelen.
Afinitialisering af den krævede port
Vi begynder vores program med at de-initialisere de nødvendige porte. Som vi diskuterede tidligere, vil hver GPIO-pin have mange andre funktioner forbundet med den, bortset fra bare at arbejde som en normal input og output. Hvis disse ben tidligere er blevet brugt til andre applikationer, skal de initialiseres, inden vi bruger dem. Det er ikke obligatorisk, men det er en god praksis. De følgende to linier med kode bruges til at de-initialisere Port A og Port B. Brug bare syntaks GPIO_DeInit (GPIOx); og nævne portnavnet i stedet for x.
GPIO_DeInit (GPIOA); // forbered port A til at arbejde GPIO_DeInit (GPIOB); // forbered port B til arbejde
Indgang og udgang GPIO-erklæring
Dernæst skal vi erklære, hvilke ben der skal bruges som input og hvilke som output. I vores tilfælde vil pin PA2 blive brugt som input, vi erklærer også denne pin med intern pull-up, så vi ikke behøver at bruge en eksternt. Syntaksen er GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Hvor x er portnavnet, er y pinnummeret, og z er GPIO Pin-tilstand.
// Erklær PA2 som input pull up pin GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Dernæst skal vi erklære stifterne PA3 og PB5 som output. Igen er mange typer outputdeklarationer mulige, men vi bruger “GPIO_MODE_OUT_PP_LOW_SLOW”, hvilket betyder, at vi vil erklære det som en output pin af push-pull-type med langsom hastighed. Og som standard vil værdien være lav. Syntaksen vil være den samme.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Erklær PB5 som push pull Output pin GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Nedenstående øjebliksbillede fra SPL-brugervejledningen nævner alle mulige GPIO-tilstande (z).
Uendelig mens sløjfe
Efter pin-erklæringen er vi nødt til at oprette en uendelig løkke, hvori vi fortsætter med at blinke LED'en for evigt og overvåge status på trykknappen for at skifte LED. Den uendelige løkke kan enten oprette med et stykke tid (1) eller med et for (;;) . Her har jeg brugt mens (1).
mens (1) {}
Kontrol af status for input-pin
Vi er nødt til at kontrollere status for input pin, syntaksen for at gøre det er GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); hvor x er portnavnet og y er pinkoden. Hvis stiften er høj, får vi '1', og hvis stiften er lav, får vi en '0'. Vi har brugt ind i en if-løkke for at kontrollere, om stiften er høj eller lav.
hvis (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // hvis der trykkes på knappen
Oprettelse af en GPIO-pin høj eller lav
For at lave en GPIO-pin høj eller lav, kan vi bruge GPIO_WriteHigh (GPIOx, GPIO_PIN_y); og GPIO_WriteLow (GPIOx, GPIO_PIN_y); henholdsvis. Her har vi fået LED'en til at tænde, hvis der trykkes på knappen og slukkes, hvis der ikke trykkes på knappen.
hvis (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // hvis der trykkes på knappen GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED TIL ellers GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED slukket
Skift af en GPIO-pin
For at skifte en GPIO-pin har vi GPIO_WriteReverse (GPIOx, GPIO_PIN_y); Når du kalder denne funktion, ændres udgangsstiftets status. Hvis stiften er høj, ændres den til lav, og hvis den er lav, ændres den til høj. Vi bruger denne funktion til at blinke den indbyggede LED på PB5.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Forsinkelsesfunktion
I modsætning til Arduino har den kosmiske kompilator ikke en foruddefineret forsinkelsesfunktion. Så vi er nødt til at oprette en på egen hånd. Min forsinkelsesfunktion er angivet nedenfor. Værdien for forsinkelsen modtages i variablen ms, og vi bruger to til loop til at holde eller programmere udførelse. Ligesom _asm ("nop") er en monteringsinstruktion, der ikke står for nogen operation. Dette betyder, at controlleren vil løkke ind i for-løkken uden at udføre nogen handling, hvilket skaber en forsinkelse.
ugyldig forsinkelse (int ms) // Funktionsdefinition {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Udfør ingen handling // samlingskode}}
Upload og test af programmet
Nu hvor vores program er klar, kan vi uploade det og teste det. Efter upload, fungerede min hardware som forventet. Den indbyggede røde LED blinkede for hver 500 millisekunder, og den eksterne grønne LED tændte hver gang jeg trykkede på kontakten.
Det komplette arbejde kan findes i den linkede video nedenfor. Når du har nået dette punkt, kan du prøve at forbinde kontakten og LED'en til forskellige ben og omskrive koden for at forstå konceptet. Du kan også spille med forsinkelsestimingen for at kontrollere, om du har forstået begreberne tydeligt.
Hvis du har spørgsmål, bedes du lade dem være i kommentarfeltet nedenfor, og hvis du har andre tekniske spørgsmål, kan du bruge vores fora. Tak for at følge med, vi ses i næste vejledning.