- Serijska komunikacija na STM8S103F3P6
- Pribadače za serijsku komunikaciju na STM8S103F3P6
- Kružni dijagram za serijsku komunikaciju STM8S
- Postavljanje STVD-a za serijsku komunikaciju
- Programiranje STM8S za serijsku komunikaciju
- Kontrolna LED dioda sa serijskog monitora
- STM8S Serijska knjižnica dublji izgled
Programiranje novog mikrokontrolera često traje duže zbog novih metoda rukovanja registrom i neznanja koji bit točno čini što. Isto vrijedi i za otklanjanje pogrešaka bez govora. Zbog toga programeri često koriste točke prekida u svom kodu i prolaze kroz njih pomoću programa za otklanjanje pogrešaka. Ali upotreba programa za otklanjanje pogrešaka možda će trebati dodatni hardver (najčešće skupi) i također dodatno vrijeme. Budući da smo fan Arduina, jedna stvar u kojoj se svi možemo složiti jest korištenje izjava za serijski ispis za ispravljanje pogrešaka, a razumijevanje našeg koda puno olakšava život. Što možemo isto replicirati na STM8 s kozmičkim C kompajlerom i SPL knjižnicama? Pa, to je itekako moguće, a to je upravo ono što ćemo učiniti u ovom trećem vodiču naše serije tutorijala.Također provjeravate početak rada sa STM8S (tutorial 1) i STM8S GPIO control (tutorial 2) ako ste ovdje potpuno novi. Također, istražili smo i mogućnost programiranja STM8S s Arduinom za brze početnike. Sve to je rečeno, krenimo u tutorial.
Serijska komunikacija na STM8S103F3P6
Iz tehničkog lista STM8S103F3P6 možemo vidjeti da naš 8-bitni kontroler podržava UART komunikaciju u mnogo različitih načina. Kontroler također ima izlazni pin sata za sinkronu UART komunikaciju i također može podržavati SmarCard, IrDA i LIN. Ali u ovom uputstvu nećemo istraživati ništa od toga samo kako bismo se klonili složenosti. Naučit ćemo kako se jednostavno čita i piše UART.
Vodič također nudi zaglavnu datoteku pod nazivom stm8s103 serial.h pomoću koje možete izvoditi jednostavne UART naredbe poput Serial start, Serial read, serial print itd. U osnovi, moći ćete ispisati char, int i string na serijski monitor a također čitati char sa serijskog monitora. Na kraju ovog vodiča moći ćete upravljati LED-om sa serijskog monitora i dobiti povratne informacije o statusu LED-a. Gore spomenuta datoteka zaglavlja ovisi o SPL knjižnicama, stoga budite sigurni da ste slijedili početni vodič.
Pribadače za serijsku komunikaciju na STM8S103F3P6
Krenimo od hardverske strane. Uzimajući brzi pogled na pinouts na STM8S103F3P6 mikrokontrolera dane u nastavku, možemo vidjeti da igle 1, 2 i 3 će se koristiti za UART komunikaciju.

Među ta tri, pin 1 je UART pin za sat koji će se koristiti samo tijekom sinkrone UART komunikacije, tako da ga ovdje neće trebati. Pin 2 je pin UART odašiljača, a Pin 3 je pin UART prijemnika. Imajte na umu da se ovi pinovi također mogu udvostručiti kao analogni ili uobičajeni GPIO pin.
Kružni dijagram za serijsku komunikaciju STM8S
Shema sklopa ovdje je vrlo jednostavna, moramo povezati naš ST-LINK 2 za programiranje i USB u TTL pretvarač za čitanje serijskih podataka. Imajte na umu da naš STM8S kontroler radi na 3.3V logičkoj razini, zato provjerite podržava li vaš USB u TTL pretvarač i 3.3V logiku. Kompletna shema sklopa prikazana je u nastavku.

Morate povezati ST-link u jedan USB priključak, a USB u TTL pretvarač u drugi USB priključak vašeg prijenosnog računala, tako da možete istovremeno programirati i nadzirati podatke. UART veza je jednostavna, samo spojite uzemljenje i Rx / Tx pin vašeg STM8S mikrokontrolera na Tx / Rx pinove pretvarača USB u TTL. Ovdje sam napajao kontroler Vcc pinom ST-Link i ostavio otvoren vss pin TTL pretvarača, možete to učiniti i obrnuto. Na tržištu postoji mnogo vrsta pretvarača USB u TTL, samo pripazite da može raditi na 3.3V logičkim signalima i jednostavno potražite Tx, Rx i GND pinove i uspostavite gore prikazanu vezu. Moja postavka hardvera prikazana je u nastavku.

Da bismo uspostavili serijsku komunikaciju, osigurali smo datoteku zaglavlja STM8S_Serial.h . Pomoću ove datoteke zaglavlja možete izvoditi jednostavne funkcije poput serijske komunikacije poput Arduina.

Sve potrebne datoteke za ovaj projekt možete pronaći na našoj stranici STM8S103F3_SPL Github. Ako vam je potrebna samo ova određena datoteka zaglavlja, možete je preuzeti s donje veze.
Preuzmite STM8S_Serial.h
Postavljanje STVD-a za serijsku komunikaciju
Za rad sa serijskom komunikacijom koristit ćemo mnoge koji koriste funkciju datoteke zaglavlja STM8S_Serial.h o kojoj smo ranije razgovarali. Ali knjižnica ima i druge ovisnosti, mnoge SPL UART i Clock povezane zaglavlje i C datoteke. Stoga je od ove točke bolje uključiti sve datoteke zaglavlja i C u naš projekt kako bismo izbjegli pogrešku u kompilaciji. Moje radno okruženje za STVD izgleda ovako.

Provjerite jeste li uključili sve izvorne datoteke SPL-a i datoteku Include kao što smo to učinili u našem prvom vodiču. Također osigurajte da ste dodali datoteku zaglavlja stm8s103_serial.h . Ne postoji C datoteka za ovo zaglavlje.
Programiranje STM8S za serijsku komunikaciju
Jednom kada je postavljanje STVD projekta spremno, možemo započeti s pisanjem našeg koda u datoteku main.c. Kompletni kôd ovog vodiča nalazi se na dnu ove stranice. Objašnjenje je sljedeće.
Prvi korak je uključivanje potrebnih datoteka zaglavlja, ovdje sam dodao glavnu datoteku zaglavlja (stm8s) i datoteku zaglavlja stm8s_103_serial koje smo upravo preuzeli.
// Obavezna zaglavlja #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Dalje, pomoću makronaredbi za dizajn određujemo ulazne i izlazne igle. Ovdje će se kontrolirati samo ugrađena LED dioda koja je spojena na pin5 priključka B, pa joj zato dajemo naziv test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // test LED je spojen na PB5
Krećući se unutar glavne funkcije, definirat ćemo pin kao izlaz. Ako niste upoznati s osnovnim GPIO funkcijama, vratite se na STM8S GPIO vodič.
// Definiranja pin-a // Deklarirajte PB5 kao push pull izlazni pin GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Zatim inicijaliziramo svoje serijske komunikacijske portove brzinom od 9600 baud-podataka. Za one koji su novi, 9600 je brzina kojom će se podatkovni bitovi prenositi tijekom komunikacije. Ako ovdje postavite 9600, isto to morate postaviti i na softveru za nadzor. Zatim također ispisujemo niz "Enter command" i prelazimo na sljedeći redak.
Serijski_početak (9600); // Inicijalizirajte serijsku komunikaciju brzinom prijenosa 9600 boda Serial_print_string ("Unesi naredbu"); // ispis niza Serial_newline (); // prelazak na sljedeći redak
Prelazeći na beskonačnu while petlju, koristimo funkciju Serial_available da provjerimo postoje li dolazni serijski podaci. Ako je odgovor da, čitamo i spremamo u varijablu koja se naziva ch i također je ispisujemo pomoću Serial_print . Tada ako je primljena vrijednost 0, isključit ćemo LED, a ako je 1, uključit ćemo LED
if (Serial_available ()) {Serial_print_string ("Pritisnuli ste:"); ch = Serial_read_char (); Serijski_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED ISKLJUČEN ako (ch == '1') GPIO_WriteLow (test_LED); // LED UKLJUČEN}
Ovim je programiranje ovog vodiča završeno, samo prenesite kôd naveden na dnu ove stranice i trebali biste moći kontrolirati LED diodu sa serijskog monitora.
Kontrolna LED dioda sa serijskog monitora
Nakon što prenesete kôd, možete otvoriti bilo koji serijski monitor brzinom od 9600 baud-podataka. Koristio sam sam serijski monitor Arduino radi lakšeg korištenja. Pritisnite gumb za resetiranje i trebali biste vidjeti poruku "Unesite naredbu". Tada ako unesete 1 i pritisnete enter, ugrađena led dioda trebala bi se uključiti, slično za 0, trebala bi se isključiti.


Kompletni rad možete pronaći u videozapisu na dnu ove stranice. Ako imate pitanja, ostavite ih u odjeljku za komentare. Naše forume možete koristiti i za postavljanje drugih tehničkih pitanja.
STM8S Serijska knjižnica dublji izgled
Za one znatiželjnike koji žele znati što se zapravo događa u zaglavnoj datoteci STM8S103F3_Serial pročitajte dalje…
Ova datoteka zaglavlja dobro funkcionira za programiranje na početnoj razini, ali ako koristite drugu verziju STM8S kontrolera ili tražite neke napredne opcije, možda ćete htjeti malo prilagoditi ovo zaglavlje ili izravno raditi sa SPL knjižnicama. Ovu sam datoteku zaglavlja napisao baš kao da je sazrela iz datoteke zaglavlja UART1, objašnjenje moje datoteke zaglavlja je sljedeće.
Čitanje znaka iz serijskog monitora
Ova funkcija pomaže u čitanju jednog znaka koji je mikrokontroleru poslan sa serijskog monitora.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); return (UART1_ReceiveData8 ()); }
Čekamo da se RXE zastavica postavi da dovršimo prijam, a zatim očistimo zastavicu da potvrdimo prijem. Konačno, šaljemo primljene 8-bitne podatke kao rezultat ove funkcije.
Ispis znaka na Serial Monitor
Ova funkcija prenosi jedan znak s mikrokontrolera na serijski monitor.
void Serial_print_char (vrijednost znaka) {UART1_SendData8 (vrijednost); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // pričekaj slanje}
Funkcija jednostavno upisuje 8-bitnu vrijednost i čeka da prijenos završi provjerom UART1_FLAG_TXE u SET
Inicijalizacija serijske komunikacije
Ova funkcija inicijalizira serijsku komunikaciju potrebnom brzinom prijenosa.
void 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 (); // Deinicijalizirati UART periferne uređaje 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); }
Osim brzine prijenosa, postoje i drugi parametri koji se moraju postaviti za serijsku komunikaciju, poput broja podatkovnih bitova, broja zaustavnih bitova, pariteta itd. Najčešći (slično Arduinu) su 8-bitni podaci s jednim zaustavnim bitom i bez pariteta, pa će to biti zadana postavka. Možete ga promijeniti ako je potrebno.
Ispis cijelog broja na serijski monitor
Većinu vremena, ako koristimo serijski monitor za ispravljanje pogrešaka ili nadzor, možda bismo željeli ispisati varijablu tipa int na serijski monitor. Ova funkcija radi upravo to
void Serial_print_int (int broj) // Funkcija za ispis int vrijednosti na serijski monitor {char count = 0; znamenka = ""; while (broj! = 0) // podijelimo int na char niz {znamenka = broj% 10; brojati ++; broj = broj / 10; } while (count! = 0) // ispisati niz char u ispravnom smjeru {UART1_SendData8 (znamenka + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // pričekajte slanje count--; }}
Uzima cjelobrojnu vrijednost i pretvara je u niz znakova u prvoj while petlji, a zatim u drugoj while petlji, poslat ćemo svakog od znakova sličnih našoj funkciji print char.
Ispis nove linije
Ovo je jednostavna funkcija za ispis novog retka. Heksvalue za to je "0x0a", mi ga samo šaljemo pomoću 8-bitne naredbe za prijenos.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // pričekaj slanje}
Ispis niza na serijski monitor
Druga korisna funkcija je zapravo ispis nizova na serijskom monitoru.
void Serial_print_string (char char) {. char i = 0; while (niz! = 0x00) {UART1_SendData8 (niz); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Opet, ova funkcija također pretvara niz u niz znakova i šalje svaki znak. Kao što znamo, svi nizovi na kraju će biti nuli. Dakle, samo moramo nastaviti obilaziti i prenositi znakove dok ne dosegnemo nulu 0x00.
Provjera jesu li serijski podaci dostupni za čitanje
Ova funkcija provjerava postoje li serijski podaci u međuspremniku spremni za čitanje.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) return TRUE; else return FALSE; }
Provjerava zastavicu UART1_FLAG_RXNE , ako je istina, vraća true, a ako nije, vraća false.

