- Serijinis ryšys per STM8S103F3P6
- STM8S103F3P6 nuosekliojo ryšio kaiščiai
- STM8S nuoseklaus ryšio grandinės schema
- STVD nustatymas nuosekliam ryšiui
- STM8S programavimas nuosekliam ryšiui
- LED valdymas iš nuoseklaus monitoriaus
- STM8S serijinės bibliotekos gilesnis žvilgsnis
Naujo mikrovaldiklio programavimas dažnai užtrunka ilgiau dėl naujų registrų tvarkymo būdų ir nežinant, kas ką tiksliai daro. Tas pats pasakytina ir apie derinimą, taip pat nesakant. Štai kodėl programuotojai gana dažnai naudoja savo kodo lūžio taškus ir peržengia juos naudodami derintuvą. Bet norint naudoti derintuvą gali prireikti papildomos aparatūros (dažniausiai brangesnės) ir papildomo laiko. Būdamas „Arduino“ gerbėjų berniuku, vienas dalykas, dėl kurio mes visi galime susitarti, yra serijinio spausdinimo pareiškimų naudojimas derinimui ir mūsų kodo supratimas labai palengvina gyvenimą. Ką galime tą patį pakartoti STM8 su kosminiais C kompiliatoriumi ir SPL bibliotekomis? Na, tai labai įmanoma, ir tai yra būtent tai, ką mes ketiname padaryti šiame trečiame mūsų pamokų ciklo pamokyme.Taip pat patikrinsite, kaip pradėti naudotis „STM8S“ (1 pamoka) ir „STM8S GPIO“ valdymu (2 pamoka), jei čia esate visiškai naujas. Be to, mes taip pat ištyrėme galimybę programuoti STM8S su „Arduino“ greitai pradedantiems. Viskas, kas pasakyta, eikime į pamoką.
Serijinis ryšys per STM8S103F3P6
Iš STM8S103F3P6 duomenų lapo galime pamatyti, kad mūsų 8 bitų valdiklis palaiko UART ryšį daugeliu skirtingų režimų. Valdiklis taip pat turi laikrodžio išvesties kaištį sinchroniniam UART ryšiui ir taip pat gali palaikyti „SmarCard“, „IrDA“ ir „LIN“. Bet mes šiame tyrime neišsiaiškinsime nieko, kad tik nenukryptume nuo sudėtingumo. Išmoksime, kaip atlikti paprastą UART skaitymą ir rašymą.
Pamoka taip pat pateikia antraštės failą, vadinamą stm8s103 serial.h, kuriuo galite atlikti paprastas UART komandas, tokias kaip „Serial begin“, „Serial read“, „serial print“ ir kt. Iš esmės galėsite nuosekliajame monitoriuje spausdinti char, int ir string. taip pat skaitykite char iš serijinio monitoriaus. Šios pamokos pabaigoje galėsite valdyti šviesos diodą iš nuoseklaus monitoriaus ir gauti atsiliepimų apie šviesos diodo būseną. Pirmiau minėtas antraštės failas priklauso nuo SPL bibliotekų, todėl įsitikinkite, kad laikėtės pradžios pamokos.
STM8S103F3P6 nuosekliojo ryšio kaiščiai
Pradėkime nuo aparatinės įrangos pusės. Greitai pažvelgę į žemiau pateiktus STM8S103F3P6 mikrovaldiklio kištukus, matome, kad UART ryšiui bus naudojami 1, 2 ir 3 kaiščiai.
Tarp trijų, 1 kaištis yra UART laikrodžio kaištis, kuris bus naudojamas tik sinchroninio UART ryšio metu, todėl mums jo čia nereikės. 2 kaištis yra UART siųstuvo kaištis ir 3 kaištis yra UART imtuvo kaištis. Atkreipkite dėmesį, kad šie kaiščiai taip pat gali būti dvigubi kaip analoginis kaištis arba įprastas GPIO kaištis.
STM8S nuoseklaus ryšio grandinės schema
Grandinės schema čia labai paprasta, programavimui turime prijungti savo ST-LINK 2 ir nuosekliems duomenims nuskaityti USB į TTL keitiklį. Atkreipkite dėmesį, kad mūsų STM8S valdiklis veikia 3,3 V logikos lygiu, todėl įsitikinkite, kad jūsų USB į TTL keitiklis taip pat palaiko 3,3 V logiką. Visa grandinės schema parodyta žemiau.
Turite prijungti „ST-link“ viename USB prievade ir USB į TTL keitiklį kitame nešiojamojo kompiuterio USB prievade, kad galėtumėte vienu metu programuoti ir stebėti duomenis. UART jungtis yra paprasta, tiesiog prijunkite savo STM8S mikrovaldiklio žemę ir Rx / Tx kaištį prie USB į TTL keitiklio Tx / Rx kaiščių. Čia maitinau valdiklį naudodamas „ST-Link“ Vcc kaištį ir palikęs atvirą TTL keitiklio kaištį. Tai galite padaryti ir atvirkščiai. Rinkoje yra daugybė USB į TTL keitiklių tipų, tik įsitikinkite, kad jis gali veikti su 3,3 V loginiais signalais ir paprasčiausiai ieškoti „Tx“, „Rx“ ir „GND“ smeigtukų ir užmegzti aukščiau nurodytą ryšį. Mano aparatinės įrangos sąranka parodyta žemiau.
Norėdami sukurti nuoseklųjį ryšio būdą, pateikėme antraštės failą STM8S_Serial.h . Naudodami šį antraštės failą, galite atlikti paprastas „Arduino“ funkcijas kaip nuoseklųjį ryšį.
Visus reikalingus šio projekto failus galite rasti mūsų STM8S103F3_SPL „Github“ puslapyje. Jei jums reikia tik šio konkretaus antraštės failo, galite jį atsisiųsti iš toliau pateiktos nuorodos.
Atsisiųskite STM8S_Serial.h
STVD nustatymas nuosekliam ryšiui
Norėdami dirbti su nuosekliu ryšiu, naudosime daugelį naudodami anksčiau aptartą antraštės failo funkciją STM8S_Serial.h . Bet biblioteka turi kitų priklausomybių, daug SPL UART ir laikrodžio susijusių antraščių ir C failų. Taigi nuo šio momento geriau įtraukti visus antraštės ir C failus į mūsų projektą, kad būtų išvengta kompiliavimo klaidos. Mano STVD darbo aplinka atrodo taip.
Įsitikinkite, kad įtraukėte visus SPL šaltinio failus ir Įtraukite failą, kaip tai darėme mūsų pirmojoje pamokoje. Taip pat įsitikinkite, kad pridėjote antraštės failą stm8s103_serial.h . Šiai antraštei nėra C failo.
STM8S programavimas nuosekliam ryšiui
Kai STVD projektas setup yra pasirengęs, galime pradėti rašyti savo kodą į main.c failą. Visą šios mokymo programos kodą galite rasti šio puslapio apačioje. Paaiškinimas yra toks.
Pirmas žingsnis yra įtraukti reikalingus antraštės failus, čia aš pridėjau pagrindinį antraštės failą (stm8s) ir stm8s_103_serial antraštės failą, kurį ką tik atsisiuntėme.
// Būtinos antraštės # apima „STM8S.h“ #include “stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Toliau mes naudojame dizaino makrokomandas įvesties ir išvesties kaiščiams nurodyti. Čia bus valdomas tik borto šviesos diodas, prijungtas prie B prievado pin5, todėl mes jam suteikiame pavadinimą kaip test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // bandymo šviesos diodas prijungtas prie PB5
Judėdami pagrindinės funkcijos viduje, kaištį apibrėžsime kaip išvestį. Jei nesate susipažinę su pagrindinėmis GPIO funkcijomis, grįžkite į STM8S GPIO mokymo programą.
// Kaiščių apibrėžimai // Skelbti PB5 kaip „push pull“ išvesties kaištį GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Tada mes inicijuojame savo nuoseklaus ryšio prievadus 9600 baudų greičiu. Tiems, kurie yra nauji, 9600 yra greitis, kuriuo duomenų bitai bus perduodami ryšio metu. Jei čia nustatysite 9600, tą patį turėsite nustatyti ir stebėjimo programinėje įrangoje. Tada mes taip pat atspausdiname eilutę „Enter command“ ir pereiname prie kitos eilutės.
Serijos pradžia (9600); // Inicijuoti nuoseklųjį ryšį 9600 baudos greičiu Serial_print_string ("Enter komanda"); // išspausdinti eilutę Serial_newline (); // pereiti prie kitos eilutės
Pereidami prie begalinio ciklo, mes naudojame funkciją „ Serial_available“, kad patikrintume, ar yra gaunamų nuoseklių duomenų. Jei taip, mes jį perskaitome ir išsaugome kintamajame, vadinamame ch, taip pat atspausdiname tą patį naudodami Serial_print . Tada, jei gauta vertė yra 0, mes išjungsime šviesos diodą, o jei jis yra 1, įjungsime šviesos diodą
if (Serial_available ()) {Serial_print_string ("Paspaudėte:"); ch = nuoseklus_skaitymo_charas (); Nuoseklus_spausdinimo_charas (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (testas_LED); // LED išjungta, jei (ch == '1') GPIO_WriteLow (test_LED); // Šviesos diodas įjungtas}
Tai atlikus, šios pamokos programavimas yra baigtas, tiesiog įkelkite kodą, pateiktą šio puslapio apačioje, ir galėsite valdyti šviesos diodą iš nuoseklaus monitoriaus.
LED valdymas iš nuoseklaus monitoriaus
Įkėlę kodą, galite atidaryti bet kurį nuoseklųjį monitorių 9600 baudos greičiu. Aš naudoju patį „Arduino“ nuoseklųjį monitorių, kad būtų patogiau juo naudotis. Paspauskite atstatymo mygtuką ir turėtumėte pamatyti pranešimą „Įveskite komandą“. Tada, jei įvesite 1 ir paspausite enter, borto lemputė turėtų įsijungti, panašiai kaip 0, ji turėtų išsijungti.
Visą darbą galite rasti vaizdo įraše, susietame šio puslapio apačioje. Jei turite klausimų, palikite juos komentarų skiltyje. Taip pat galite naudoti mūsų forumus kitiems techniniams klausimams pateikti.
STM8S serijinės bibliotekos gilesnis žvilgsnis
Tiems, kurie nori sužinoti, kas iš tikrųjų vyksta STM8S103F3_Serial antraštės faile, skaitykite toliau.
Šis antraštės failas gerai tinka pradedančiųjų lygio programavimui, tačiau jei naudojate kitą STM8S valdiklio versiją arba ieškote papildomų parinkčių, galbūt norėsite šiek tiek pakoreguoti šią antraštę arba tiesiogiai dirbti su SPL bibliotekomis. Parašiau šį antraštės failą kaip sunokusį iš UART1 antraštės failo, mano antraštės failo paaiškinimas yra toks.
Perskaitykite simbolį iš „Serial Monitor“
Ši funkcija padeda perskaityti vieną simbolį, kuris buvo išsiųstas į mikrovaldiklį iš nuoseklaus monitoriaus.
char Serial_read_char (negaliojantis) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == ATMETTI); UART1_ClearFlag (UART1_FLAG_RXNE); grįžti (UART1_ReceiveData8 ()); }
Mes laukiame, kol RXE vėliava bus nustatyta, kad būtų baigtas priėmimas, tada išvalykite vėliavą, kad patvirtintumėte priėmimą. Galiausiai išsiunčiame gautus 8 bitų duomenis kaip šios funkcijos rezultatą.
Simbolio spausdinimas į „Serial Monitor“
Ši funkcija perduoda vieną simbolį iš mikrovaldiklio į nuoseklųjį monitorių.
negaliojantis „Serial_print_char“ (char value) {UART1_SendData8 (value); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATMETTI); // laukti siuntimo}
Funkcija tiesiog užrašo 8 bitų vertę ir laukia, kol bus baigta perduoti, patikrindama UART1_FLAG_TXE į SET
Inicijuojama nuoseklioji komunikacija
Ši funkcija inicijuoja serijinį ryšį reikiamu duomenų perdavimo greičiu.
negaliojantis Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init (GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit (); // Deinitializuokite UART periferinius įrenginius UART1_Init (baud_rate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // (BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) UART1_Cmd (ENABLE); }
Be duomenų perdavimo spartos, nuosekliam ryšiui turi būti nustatyti kiti parametrai, pvz., Duomenų bitų skaičius, sustabdymo bitų skaičius, paritetas ir kt. Dažniausias (panašus į „Arduino“) yra 8 bitų duomenys su vienu stop bitu ir be pariteto, taigi tai bus numatytasis nustatymas. Jei reikia, galite jį pakeisti.
Sveiko skaičiaus spausdinimas į nuoseklųjį monitorių
Dažniausiai, jei derinimui ar stebėjimui naudojame serijinį monitorių, galbūt norėsime atspausdinti serijos monitoriuje int tipo kintamąjį. Ši funkcija atlieka būtent tai
void Serial_print_int (int number) // Funkcija spausdinti int reikšmę serijiniam monitoriui {char count = 0; char char = ""; while (skaičius! = 0) // padalykite int į char masyvą {skaitmuo = skaičius% 10; skaičius ++; skaičius = skaičius / 10; } while (count! = 0) // išspausdinti char masyvą teisinga kryptimi {UART1_SendData8 (skaitmuo + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATMETTI); // laukti siuntimo skaičiuoti--; }}
Tai įgauna sveiko skaičiaus vertę ir paverčia ją simbolių masyvu pirmoje ciklo cikle, tada antroje ciklo linijoje išsiųsime kiekvieną simbolį, panašų į mūsų spausdinimo char funkciją.
Naujos eilutės spausdinimas
Tai paprasta funkcija atspausdinti naują eilutę. Šiam tikslui atlikti naudojama „0x0a“ reikšmė, mes tiesiog siunčiame ją per 8 bitų perdavimo komandą.
negaliojantis „Serial_newline“ (negaliojantis) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATMETTI); // laukti siuntimo}
Eilutės spausdinimas serijiniame monitoriuje
Kita naudinga funkcija yra faktiškai spausdinti eilutes serijiniame monitoriuje.
negalioja Serial_print_string (char string) {. char i = 0; while (eilutė! = 0x00) {UART1_SendData8 (eilutė); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATMETTI); i ++; }}
Vėlgi, ši funkcija taip pat paverčia eilutę char char ir išsiunčia kiekvieną simbolį. Kaip žinome, visos eilutės baigsis. Taigi mes tiesiog turime judėti ir perduoti simbolius, kol pasieksime nulį 0x00.
Tikrinama, ar yra nuoseklių duomenų, kuriuos galima perskaityti
Ši funkcija patikrina, ar buferyje yra serijinių duomenų, paruoštų skaityti.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) grąžina TRUE; dar grįžti FALSE; }
Jis tikrina, ar nėra žymos UART1_FLAG_RXNE , jei tai tiesa, ji grąžina tiesą, o jei ne, grąžina klaidingą.