- Paruošimas aparatinei įrangai
- Supratimas apie GPIO Pinouts STM8S103F
- Pinout aprašymas ir patarimai, kaip pasirinkti STM8S103F GPIO
- STM8S programavimas GPIO įvestims ir išvestims naudojant SPL
- Programos įkėlimas ir testavimas
Mikrovaldikliams mirksi šviesos diodų programa yra lygi „sveiko pasaulio“ programai. Ankstesnėje mūsų pamokoje mes sužinojome, kaip pradėti naudotis STM8S103F3 kūrimo valdyba ir kaip nustatyti IDE ir kompiliatorių, kad būtų programuojami mūsų STM8S valdikliai. Mes taip pat sužinojome, kaip naudotis standartinėmis periferinėmis bibliotekomis, kaip sukompiliuoti ir įkelti kodą į mūsų mikrovaldiklį. Atlikę visus pagrindus, iš tikrųjų galite pradėti rašyti kodą. Šioje pamokoje sužinosime, kaip atlikti bendras GPIO funkcijas STM8S valdikliuose. Lentoje jau yra borto šviesos diodas, prijungtas prie B prievado 5 kaiščio, mes išmoksime mirksėti šį šviesos diodą, taip pat pridėsime išorinį šviesos diodą ir valdysime jį mygtuku. Jei esate visiškai naujas, prieš tęsdami, labai rekomenduojama perskaityti ankstesnę instrukciją.
Paruošimas aparatinei įrangai
Prieš pasinerdami į programą, pasiruoškite aparatūros jungtis. Kaip jau minėjome anksti, čia naudosime du šviesos diodus, vienas yra laive esantis šviesos diodas, kuris nuolat mirksės, o kitas - išorinis šviesos diodas, kuris bus įjungtas mygtuku. Idėja yra išmokti visas GPIO funkcijas paprastoje sąrankoje. Borto „Led“ jau prijungtas prie PB5 (PORTB pin5), todėl ką tik prijungiau LED prie PA3, o mygtuką - prie PA2, kaip matote toliau pateiktoje diagramoje.
Bet iš visų mūsų valdomų išvesties kaiščių, kodėl aš pasirinkau PA3 išėjimui ir PA2 įėjimui? Klausimai yra teisingi ir tai paaiškinsiu vėliau šiame straipsnyje. Mano aparatūros sąranka šiai pamokai rodoma žemiau. Kaip matote, savo „ST-link“ programuotoją taip pat prijungiau prie programavimo kaiščių, kurie ne tik užprogramuos mūsų plokštę, bet ir veiks kaip energijos šaltinis.
Supratimas apie GPIO Pinouts STM8S103F
Dabar grįžtama prie klausimo, kodėl PA2 įvesties ir kodėl PA3 išvesties? Norėdami tai suprasti, atidžiau pažvelkime į žemiau pateiktą mikrovaldiklio kištuką.
Kaip nurodyta iškabos schemoje, mūsų mikrovaldiklyje yra keturi prievadai, būtent PORT A, B, C ir D, žymimi atitinkamai PA, PB, PC ir PD. Kiekvienas GPIO kaištis taip pat yra su kai kuriomis kitomis specialiomis funkcijomis. Pvz., PB5 (PORT B 5 kontaktas) gali veikti ne tik kaip GPIO kaištis, bet ir kaip SDA kaištis I2C ryšiui ir kaip „Timer 1“ išvesties kaištis. Taigi, jei mes naudosime šį kaištį paprastiems GPIO tikslams, pvz., LED prijungimui, tada negalėsime naudoti I2C ir LED tuo pačiu metu. Deja, borto šviesos diodas yra prijungtas prie šio kaiščio, todėl čia mes neturime daug pasirinkimo galimybių, o šioje programoje mes nenaudosime „I2C“, todėl tai nėra didelė problema.
Pinout aprašymas ir patarimai, kaip pasirinkti STM8S103F GPIO
Tikrai tariant, nepakenktų naudoti PA1 įvesties kaištį ir jis tiesiog veiktų. Bet aš tai sąmoningai iškėliau, kad galėčiau parodyti jums keletą įprastų spąstų, į kuriuos galite patekti pasirinkdami GPIO kaiščius naujame mikrovaldiklyje. Geriausia išvengti spąstų - perskaityti informaciją apie kaiščius ir jų aprašymą, pateiktus STM8S103F3P6 duomenų lape. STM8S103F3P6 mikrovaldiklio kaiščių aprašymo informacija, paminėta duomenų lape, pateikiama žemiau paveikslėliuose.
Mūsų mikrovaldiklio įvesties kaiščiai gali būti plaukiojantys arba silpni, o išvesties kaiščiai gali būti „Open Drain“ arba „Push-pull“. Skirtumas tarp „Open Drain“ ir „Push-Pull“ išvesties kaiščių jau yra aptartas, todėl į tai nesigilinsime. Paprasčiau tariant, „Open Drain“ išvesties kaištis gali padaryti tik tiek žemą, tiek ne aukštą išvestį, o „push-pull“ išvesties kaištis gali padaryti tiek aukštą, tiek aukštą.
Be to, aukščiau pateiktoje lentelėje, taip pat galite pastebėti, kad išvesties kaištis gali būti greitas (10 Mhz) arba lėtas (2 MHz). Tai lemia GPIO greitį, jei norite labai greitai perjungti GPIO kaiščius tarp aukšto ir žemo, tada galime pasirinkti greitą išvestį.
Kai kurie GPIO kaiščiai mūsų valdiklyje palaiko „ True Open Drain“ (T) ir didelės kriauklės srovę (HS), kaip minėta aukščiau esančiame paveikslėlyje. Didelis skirtumas tarp „Open Drain“ ir „True Open Drain“ yra tas, kad išėjimo, prijungto prie atviro nutekėjimo, negalima ištraukti daugiau nei už mikrovaldiklio darbinę įtampą (Vdd), o tikrą atviro nutekėjimo išvesties kaištį - aukščiau nei Vdd. Kaiščiai su dideliu kriauklės pajėgumu reiškia, kad jis gali panardinti daugiau srovės. Bet kurio GPIO HS kaiščio šaltinis ir kriauklės srovė yra 20 mA, o maitinimo linija gali sunaudoti iki 100 mA.
Atidžiau pažvelgę į aukščiau pateiktą vaizdą, pastebėsite, kad beveik visi GPIO kaiščiai yra didelės kriauklės srovės (HS) tipo, išskyrus PB4 ir PB5, kurie yra tikro atviro nutekėjimo tipo (T). Tai reiškia, kad šių kaiščių negalima padaryti aukštai, jie negalės tiekti 3,3 V įtampos net tada, kai kaištis yra aukštas. Štai kodėl borto lemputė yra prijungta prie 3,3 V ir įžeminta per PB5, o ne maitinama tiesiai iš GPIO kaiščio.
Išsamų smeigtukų aprašymą rasite 28 duomenų lapo puslapyje. Kaip minėta aukščiau esančiame paveikslėlyje, PA1 automatiškai sukonfigūruojamas kaip silpnas prisitraukimas ir nerekomenduojamas naudoti kaip išvesties kaištis. Bet kokiu atveju jis gali būti naudojamas kaip įvesties kaištis kartu su mygtuku, tačiau aš nusprendžiau naudoti PA2 tik norėdamas pabandyti įjungti programą. Tai tik keli pagrindiniai dalykai, kurie bus naudingi, kai rašysime daug sudėtingesnes programas. Kol kas gerai, jei daug kas atsimušė į galvą, mes pateksime į jo sluoksnį kitose pamokose.
STM8S programavimas GPIO įvestims ir išvestims naudojant SPL
Sukurkite darbo sritį ir naują projektą, kaip aptarėme pirmojoje pamokoje. Galite pridėti visus antraštės ir šaltinio failus arba pridėti tik gpio, config ir stm8s failus. Atidarykite main.c failą ir pradėkite rašyti savo programą.
Įsitikinkite, kad įtraukėte antraštės failus, kaip parodyta aukščiau esančiame paveikslėlyje. Atidarykite main.c failą ir paleiskite kodą. Visą „main.c“ kodą galite rasti šio puslapio apačioje, o iš jo taip pat galėsite atsisiųsti projekto failą. Kodas paaiškinamas taip, taip pat galite kreiptis į SPL vartotojo vadovą arba vaizdo įrašą, susietą šio puslapio apačioje, jei esate nesusipratęs dėl kodavimo dalies.
Reikiamo uosto inicializavimas
Savo programą pradedame išjungdami reikiamus uostus. Kaip jau aptarėme anksčiau, kiekvienas GPIO kaištis turės daugybę kitų funkcijų, išskyrus tai, kad jis veiks tik kaip įprastas įvestis ir išvestis. Jei šie kaiščiai anksčiau buvo naudojami kitose programose, prieš juos naudojant juos reikia iš naujo inicializuoti. Tačiau tai nėra privaloma, tačiau tai yra gera praktika. Šios dvi kodo eilutės naudojamos ištrinant A ir B prievadus. Tiesiog naudokite sintaksę GPIO_DeInit (GPIOx); ir vietoje x pažymėkite uosto pavadinimą.
GPIO_DeInit (GPIOA); // paruoškite A prievadą darbui GPIO_DeInit (GPIOB); // paruošti B prievadą darbui
Įvesties ir išvesties GPIO deklaracija
Toliau turime deklaruoti, kurie kaiščiai bus naudojami kaip įvestis, o kurie - kaip išvestys. Mūsų atveju, kaištis PA2 bus naudojamas kaip įvestis, mes taip pat deklaruosime šį kaištį su vidiniu „Pull-up“, kad nereikėtų jo naudoti išoriškai. Sintaksė yra GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Kur x yra prievado pavadinimas, y yra PIN kodas ir z yra GPIO PIN režimas.
// Paskelbti PA2 kaip įvesties kaištį GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Tada mes turime deklaruoti kaiščius PA3 ir PB5 kaip išvestį. Vėlgi, galimi daugybė išvesties deklaravimo tipų, tačiau naudosime „GPIO_MODE_OUT_PP_LOW_SLOW“, o tai reiškia, kad mes jį paskelbsime kaip „push-pull“ tipo išvesties kaištį lėtai. Pagal numatytuosius nustatymus vertė bus maža. Sintaksė bus ta pati.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // Paskelbti PB5 kaip „push pull“ išvesties kaištį GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Žemiau pateiktoje SPL vartotojo vadovo nuotraukoje minimi visi galimi GPIO režimai (z).
Begalinė, kol kilpa
Po smeigtuko deklaracijos turime sukurti begalinę kilpą, kurios viduje mes amžinai mirksėsime LED ir stebėsime mygtuko būseną, kad įjungtumėte šviesos diodą. Begalinė kilpa gali sukurti arba tam tikrą laiką (1), arba su for (;;) . Čia aš naudoju (1).
o (1) {}
Įvesties kaiščio būsenos tikrinimas
Turime patikrinti įvesties smeigtuko būseną, sintaksė tai padaryti yra GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); kur x yra prievado pavadinimas ir y yra PIN kodas. Jei kaištis yra aukštas, gausime „1“, o jei kaištis bus žemas, gausime „0“. Mes įpratome „if“ kilpos viduje patikrinti, ar kaištis yra aukštas ar žemas.
jei (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jei paspaudžiamas mygtukas
Padaryti GPIO kaištį aukštą ar žemą
Kad GPIO kaištis būtų aukštas arba žemas, galime naudoti GPIO_WriteHigh (GPIOx, GPIO_PIN_y); ir GPIO_WriteLow (GPIOx, GPIO_PIN_y); atitinkamai. Čia mes padarėme šviesos diodą įsijungti, jei paspaudžiamas mygtukas, ir išsijungia, jei mygtukas nėra paspaustas.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // jei mygtukas nuspaustas GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED dega dar GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED dega
GPIO kaiščio perjungimas
Norėdami perjungti GPIO kaištį, turime GPIO_WriteReverse (GPIOx, GPIO_PIN_y); iškvietus šią funkciją, pasikeis išvesties kaiščio būsena. Jei kaištis yra aukštas, jis bus pakeistas į žemą, o jei jis yra žemas, jis bus pakeistas į aukštą. Mes naudojame šią funkciją, norėdami mirksėti PB5 esančiame laive esančiame šviesos diode.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Vėlavimo funkcija
Skirtingai nuo „Arduino“, kosminis kompiliatorius neturi iš anksto nustatytos uždelsimo funkcijos. Taigi turime sukurti patys. Mano uždelsimo funkcija pateikiama žemiau. Vertė „doe delay“ bus gauta kintamajame ms, o mes naudosime du ciklo palaikymui ar programos vykdymui. Kaip „ _asm“ („nop“) yra surinkimo instrukcija, kuri nereiškia jokios operacijos. Tai reiškia, kad valdiklis prisijungs prie „for“ ciklo neatlikdamas jokių operacijų, taip sukurdamas vėlavimą.
void delay (int ms) // Funkcijos apibrėžimas {int i = 0; int j = 0; už (i = 0; i <= ms; i ++) {už (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // neatlikite jokios operacijos // surinkimo kodas}}
Programos įkėlimas ir testavimas
Dabar, kai mūsų programa paruošta, galime ją įkelti ir išbandyti. Įkėlus mano aparatinė įranga veikė taip, kaip tikėtasi. Raudonas laive esantis šviesos diodas mirksi kas 500 milisekundžių, o išorinis žalias šviesos diodas įsijungia kiekvieną kartą, kai paspaudžiu jungiklį.
Visą darbą galite rasti toliau pateiktame vaizdo įraše. Kai pasieksite šį tašką, galite pabandyti prijungti jungiklį ir šviesos diodą prie skirtingų kaiščių ir iš naujo parašyti kodą, kad suprastumėte sąvoką. Taip pat galite žaisti su uždelsimo laiku ir patikrinti, ar aiškiai supratote sąvokas.
Jei turite klausimų, palikite juos komentarų skyriuje žemiau, o jei turite kitų techninių klausimų, galite naudoti mūsų forumus. Dėkojame, kad sekėte paskui, susitiksime kitoje pamokoje.