- Comunicare în serie pe STM8S103F3P6
- Pinii de comunicare în serie pe STM8S103F3P6
- Diagrama circuitului pentru comunicarea în serie STM8S
- Configurarea STVD pentru comunicarea în serie
- Programarea STM8S pentru comunicare în serie
- LED de control de pe monitorul serial
- Biblioteca serială STM8S Aspect mai profund
Programarea unui nou microcontroler durează adesea mai mult timp datorită noilor metode de manipulare a registrelor și a necunoașterii ce bit face exact ce. Același lucru este valabil și pentru depanare fără să spună. Acesta este motivul pentru care programatorii folosesc destul de des puncte de întrerupere în codul lor și trec prin el folosind un depanator. Dar utilizarea unui depanator poate necesita hardware suplimentar (de cele mai multe ori scump) și, de asemenea, timp suplimentar. Fiind un fan fan Arduino, un lucru pe care cu toții îl putem înțelege este utilizarea instrucțiunilor de tipărire în serie pentru depanare și înțelegerea codului nostru face viața mult mai ușoară. Ce putem replica la fel pe STM8 cu compilatorul cosmic C și bibliotecile SPL? Ei bine, este foarte posibil și tocmai asta vom face în acest al treilea tutorial din seria noastră de tutoriale.De asemenea, verificați începutul cu STM8S (tutorial 1) și STM8S GPIO control (tutorial 2) dacă sunteți complet nou aici. De asemenea, am explorat și posibilitatea programării STM8S cu Arduino pentru porniri rapide. Toate acestea fiind spuse, să intrăm în tutorial.
Comunicare în serie pe STM8S103F3P6
Din foaia tehnică a STM8S103F3P6, putem vedea că controlerul nostru pe 8 biți acceptă comunicarea UART în mai multe moduri diferite. Controlerul are, de asemenea, un pin de ieșire pentru ceas pentru comunicarea UART sincronă și poate suporta, de asemenea, SmarCard, IrDA și LIN. Dar nu vom explora nimic din toate acestea în acest tutorial doar pentru a ne feri de complexitate. Vom învăța cum să citim și să scriem UART simplu.
Tutorialul oferă, de asemenea, un fișier de antet numit stm8s103 serial.h cu ajutorul căruia puteți efectua comenzi UART simple, cum ar fi Serial begin, Serial read, serial print, etc. și, de asemenea, citiți caractere de pe monitorul serial. La sfârșitul acestui tutorial, veți putea controla un LED de pe monitorul serial și puteți primi feedback despre starea LED-ului. Fișierul antet menționat mai sus depinde de bibliotecile SPL, deci asigurați-vă că ați urmat tutorialul de început.
Pinii de comunicare în serie pe STM8S103F3P6
Să începem de la partea hardware. Aruncând o privire rapidă asupra pinouturilor de pe microcontrolerul STM8S103F3P6 date mai jos, putem vedea că pinii 1, 2 și 3 vor fi utilizați pentru comunicarea UART.
Printre cele trei, pinul 1 este pinul de ceas UART, care va fi utilizat numai în timpul comunicării UART sincrone, deci nu vom avea nevoie de el aici. Pinul 2 este pinul transmițătorului UART, iar pinul 3 este pinul receptorului UART. Rețineți că acești pini se pot dubla și ca pin analogic sau pin GPIO normal.
Diagrama circuitului pentru comunicarea în serie STM8S
Schema circuitului este foarte simplă aici, trebuie să ne conectăm ST-LINK 2 pentru programare și un convertor USB la TTL pentru citirea datelor seriale. Rețineți că controlerul nostru STM8S funcționează la nivel de logică de 3,3V, deci asigurați-vă că convertorul USB la TTL acceptă și logica de 3,3V. Schema completă a circuitului este prezentată mai jos.
Trebuie să vă conectați ST-link-ul într-un port USB și convertorul USB la TTL într-un alt port USB al laptopului, astfel încât să puteți programa și monitoriza datele în același timp. Conexiunea UART este simplă, trebuie doar să conectați solul și pinul Rx / Tx al microcontrolerului STM8S la pinii Tx / Rx ai convertorului USB la TTL. Aici am alimentat controlerul cu pinul Vcc al ST-Link și am lăsat pinul vss al convertorului TTL deschis, puteți face acest lucru și invers. Există multe tipuri de convertor USB la TTL pe piață, asigurați-vă că poate funcționa pe semnale logice de 3,3V și căutați simplu pinii Tx, Rx și GND și face conexiunea prezentată mai sus. Configurarea hardware-ului meu este prezentată mai jos.
Pentru a realiza o modalitate de comunicare în serie, am furnizat fișierul antet STM8S_Serial.h . Folosind acest fișier de antet, puteți efectua funcții simple precum Arduino pentru comunicarea în serie.
Puteți găsi toate fișierele necesare pentru acest proiect pe pagina noastră Github STM8S103F3_SPL. Dacă aveți nevoie doar de acest fișier antet, îl puteți descărca de pe linkul de mai jos.
Descărcați STM8S_Serial.h
Configurarea STVD pentru comunicarea în serie
Pentru a lucra cu comunicații seriale, vom folosi multe folosind funcția de fișier de antet STM8S_Serial.h despre care am discutat anterior. Dar biblioteca are alte dependențe, multe dintre antetul SPL UART și Clock și fișiere C. Deci, din acest punct, este mai bine să includem toate anteturile și fișierele C în proiectul nostru pentru a evita o eroare de compilare. Mediul meu de lucru STVD arată astfel.
Asigurați-vă că ați inclus toate fișierele sursă SPL și Includeți fișierul așa cum am făcut în primul nostru tutorial. Și, de asemenea, asigurați-vă că ați adăugat fișierul antet stm8s103_serial.h . Nu există fișier C pentru acest antet.
Programarea STM8S pentru comunicare în serie
Odată ce configurarea proiectului STVD este gata, putem începe să ne scriem codul în fișierul main.c. Codul complet pentru acest tutorial poate fi găsit în partea de jos a acestei pagini. Explicația este următoarea.
Primul pas este de a include fișierele antet necesare, aici am adăugat fișierul antet principal (stm8s) și fișierul antet stm8s_103_serial pe care tocmai l-am descărcat.
// Anteturi obligatorii #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Apoi, folosim macrocomenzile de proiectare pentru a specifica pinii de intrare și de ieșire. Aici se va controla doar LED-ul integrat care este conectat la pinul 5 al portului B, așa că îi dăm un nume ca test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // testul LED este conectat la PB5
Mergând în interiorul funcției principale, vom defini pinul ca o ieșire. Dacă nu sunteți familiarizați cu funcțiile de bază GPIO reveniți la tutorialul STM8S GPIO.
// Definiții pin // Declarați PB5 ca push pull Pin de ieșire GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Apoi ne inițializăm porturile de comunicații seriale la 9600 baud rate. Pentru cei care sunt noi, 9600 este rata de viteză la care biții de date vor fi transferați în timpul comunicării. Dacă setați 9600 aici, trebuie să setați același lucru și pe software-ul de monitorizare. Apoi imprimăm și un șir „Enter command” și trecem la următoarea linie.
Serial_begin (9600); // Inițializați comunicarea Serial la 9600 baud rate Serial_print_string („Introduceți comanda”); // imprimați un șir Serial_newline (); // treceți la linia următoare
Trecând la bucla infinită while, folosim funcția Serial_available pentru a verifica dacă există date de intrare. Dacă da, îl citim și îl salvăm într-o variabilă numită ch și, de asemenea, imprimăm același lucru folosind Serial_print . Apoi, dacă valoarea primită este 0, vom opri LED-ul și dacă este 1, vom aprinde LED-ul
if (Serial_available ()) {Serial_print_string ("Ați apăsat:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED OFF dacă (ch == '1') GPIO_WriteLow (test_LED); //A CONDUS LA }
Cu aceasta, programarea acestui tutorial este completă, trebuie doar să încărcați codul dat în partea de jos a acestei pagini și ar trebui să puteți controla LED-ul de pe monitorul serial.
LED de control de pe monitorul serial
După ce ați încărcat codul, puteți deschide orice monitor serial la 9600 baud rate. Am folosit însuși monitorul serial Arduino pentru ușurința utilizării acestuia. Apăsați butonul de reset și ar trebui să vedeți mesajul „Introduceți o comandă”. Apoi, dacă introduceți 1 și apăsați Enter, ledul de la bord ar trebui să se aprindă, în mod similar pentru 0, ar trebui să se oprească.
Lucrarea completă poate fi găsită în videoclipul legat în partea de jos a acestei pagini. Dacă aveți întrebări, vă rugăm să le lăsați în secțiunea de comentarii. De asemenea, puteți utiliza forumurile noastre pentru a posta alte întrebări tehnice.
Biblioteca serială STM8S Aspect mai profund
Pentru acele minți curioase care doresc să știe ce se întâmplă de fapt în fișierul antet STM8S103F3_Serial citit pe….
Acest fișier antet funcționează bine pentru programarea la începători, dar dacă utilizați o versiune diferită a controlerului STM8S sau căutați câteva opțiuni avansate, vă recomandăm să modificați puțin acest antet sau să lucrați direct cu bibliotecile SPL Am scris acest fișier de antet la fel ca o copie de pe fișierul de antet UART1, explicația fișierului meu de antet este după cum urmează.
Citirea unui personaj din Serial Monitor
Această funcție ajută la citirea unui singur caracter care a fost trimis la microcontroler de pe monitorul serial.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); return (UART1_ReceiveData8 ()); }
Așteptăm până când pavilionul RXE este SET pentru a finaliza recepția și apoi ștergeți pavilionul pentru a confirma recepția. În cele din urmă, trimitem datele primite pe 8 biți ca rezultat al acestei funcții.
Imprimarea unui caracter pe Serial Monitor
Această funcție transmite un singur caracter de la un microcontroler la monitorul serial.
void Serial_print_char (valoare char) {UART1_SendData8 (valoare); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // așteptați trimiterea}
Funcția scrie pur și simplu valoarea pe 8 biți și așteaptă până când transmisia se finalizează verificând UART1_FLAG_TXE la SET
Inițializarea comunicării seriale
Această funcție inițializează comunicarea serială la viteza de transmisie necesară.
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 (); // Dezinitializați perifericele UART 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); }
În afară de rata de transmisie, există și alți parametri care trebuie setați pentru comunicațiile seriale, cum ar fi numărul de biți de date, numărul de biți de oprire, paritate etc. cu un bit de oprire și fără paritate și, prin urmare, aceasta va fi setarea implicită. Puteți să-l modificați dacă este necesar.
Imprimarea unui număr întreg pe monitorul serial
De cele mai multe ori, dacă folosim un monitor serial pentru depanare sau monitorizare, s-ar putea să dorim să imprimăm o variabilă de tip int pe monitorul serial. Această funcție face exact asta
void Serial_print_int (int number) // Funtion to print int value to serial monitor {char count = 0; cifra char = ""; while (număr! = 0) // împărțiți matricea int to char {cifră = număr% 10; conta ++; număr = număr / 10; } while (count! = 0) // tipăriți matricea de caractere în direcția corectă {UART1_SendData8 (cifră + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // așteptați trimiterea numărului--; }}
Acesta ia o valoare întreagă și o convertește în matrice de caractere în prima buclă while, apoi în a doua buclă while, vom trimite fiecare dintre caracterele similare funcției noastre de tipărire.
Tipărirea unei noi linii
Aceasta este o funcție simplă pentru a imprima o nouă linie. Valoarea hexagonală pentru a face acest lucru este „0x0a”, doar o trimitem folosind comanda de transmisie pe 8 biți.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // așteptați trimiterea}
Imprimarea unui șir pe monitorul serial
O altă funcție utilă este imprimarea efectivă a șirurilor pe monitorul serial.
void Serial_print_string (șir de caractere) {. char i = 0; while (șir! = 0x00) {UART1_SendData8 (șir); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Din nou, această funcție convertește, de asemenea, șirul în matrice de caractere și trimite fiecare caracter. După cum știm, toate șirurile de sfârșit vor fi nule. Deci, trebuie doar să continuăm să traversăm și să transmitem caracterele până când ajungem la 0x00 nul.
Verificarea dacă datele seriale sunt disponibile pentru citire
Această funcție verifică dacă există date seriale în buffer gata de citire.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) returnează TRUE; altfel returnează FALS; }
Verifică steagul UART1_FLAG_RXNE , dacă este adevărat, returnează adevărat și, dacă nu, returnează fals.