- Comunicació en sèrie a STM8S103F3P6
- Pins de comunicació sèrie a STM8S103F3P6
- Diagrama de circuits per a la comunicació en sèrie STM8S
- Configuració de STVD per a la comunicació en sèrie
- Programació STM8S per a comunicacions en sèrie
- LED de control des del monitor sèrie
- Biblioteca serial STM8S Aparença més profunda
Programar un nou microcontrolador sol trigar més temps a causa dels nous mètodes de gestió de registres i no saber quin bit fa exactament què. El mateix passa amb la depuració sense dir-ho. És per això que els programadors sovint utilitzen punts d'interrupció al seu codi i el passen mitjançant un depurador. Però l’ús d’un depurador pot necessitar maquinari addicional (la majoria de vegades costós) i també temps addicional. Com que som un fanàtic d’Arduino, entre tots podem estar d’acord que utilitzar declaracions d’impressió en sèrie per depurar i entendre el nostre codi facilita la vida. Què podem reproduir igual a STM8 amb compilador de C cosmic i biblioteques SPL? Bé, és molt possible, i això és exactament el que farem en aquest tercer tutorial de la nostra sèrie de tutorials.També comproveu els primers passos amb STM8S (tutorial 1) i STM8S GPIO control (tutorial 2) si sou completament nou aquí. També hem explorat la possibilitat de programar STM8S amb Arduino per iniciar ràpidament. Tot això es diu entrem al tutorial.
Comunicació en sèrie a STM8S103F3P6
Des del full de dades de STM8S103F3P6, podem veure que el nostre controlador de 8 bits admet la comunicació UART en molts modes diferents. El controlador també té un pin de sortida de rellotge per a la comunicació UART síncrona i també pot suportar SmarCard, IrDA i LIN. Però no explorarem res d'això en aquest tutorial només per mantenir-nos allunyats de la complexitat. Aprendrem a fer una lectura i escriptura UART senzilles.
El tutorial també proporciona un fitxer de capçalera anomenat stm8s103 serial.h mitjançant el qual podeu realitzar ordres UART senzilles com ara Serial begin, Serial read, serial print, etc. Bàsicament, podreu imprimir caràcters, int i cadena al monitor sèrie. i també llegeix caràcters des del monitor sèrie. Al final d'aquest tutorial, podreu controlar un LED des del monitor sèrie i obtenir informació sobre l'estat del LED. El fitxer de capçalera esmentat anteriorment depèn de les biblioteques SPL, així que assegureu-vos que heu seguit el tutorial inicial.
Pins de comunicació sèrie a STM8S103F3P6
Comencem pel costat del maquinari. Fent un cop d'ull als pinouts del microcontrolador STM8S103F3P6 que es mostra a continuació, podem veure que els pins 1, 2 i 3 s'utilitzaran per a la comunicació UART.

Entre els tres, el pin 1 és el pin de rellotge UART que només s’utilitzarà durant la comunicació UART síncrona, de manera que no el necessitarem aquí. El pin 2 és el pin del transmissor UART i el pin 3 és el pin del receptor UART. Tingueu en compte que aquests pins també es poden duplicar com a pin analògic o pin GPIO normal.
Diagrama de circuits per a la comunicació en sèrie STM8S
El diagrama del circuit és molt senzill aquí, hem de connectar el nostre ST-LINK 2 per a la programació i un convertidor USB a TTL per llegir dades en sèrie. Tingueu en compte que el nostre controlador STM8S funciona en un nivell lògic de 3,3 V, així que assegureu-vos que el convertidor d’USB a TTL també admeti la lògica de 3,3 V. El diagrama complet del circuit es mostra a continuació.

Heu de connectar el vostre enllaç ST en un port USB i el convertidor USB a TTL en un altre port USB del vostre portàtil, de manera que pugueu programar i controlar les dades alhora. La connexió UART és senzilla, només cal que connecteu la terra i el pin Rx / Tx del vostre microcontrolador STM8S als pins Tx / Rx del convertidor USB a TTL. Aquí he alimentat el controlador amb el pin Vcc de ST-Link i he deixat obert el pin vss del convertidor TTL, també podeu fer-ho al revés. Hi ha molts tipus de convertidors d’USB a TTL al mercat, només cal que us assegureu que pot funcionar amb senyals lògics de 3,3 V i que busqueu els pins Tx, Rx i GND de manera senzilla i que faci la connexió que es mostra més amunt. La configuració del maquinari es mostra a continuació.

Per fer una forma de comunicació en sèrie, hem proporcionat el fitxer de capçalera STM8S_Serial.h . Mitjançant aquest fitxer de capçalera, podeu realitzar funcions senzilles com Arduino per a la comunicació en sèrie.

Podeu trobar tots els fitxers necessaris per a aquest projecte a la nostra pàgina Github STM8S103F3_SPL. Si només necessiteu aquest fitxer de capçalera en concret, el podeu descarregar des de l'enllaç següent.
Descarregueu STM8S_Serial.h
Configuració de STVD per a la comunicació en sèrie
Per treballar amb la comunicació en sèrie, en farem servir molts mitjançant la funció de fitxer de capçalera STM8S_Serial.h que hem comentat anteriorment. Però la biblioteca té altres dependències, moltes de les capçaleres i fitxers relacionats amb SPL UART i Clock. Així doncs, a partir d’aquest moment, és millor incloure tots els fitxers de capçalera i C al nostre projecte per evitar un error de compilació. El meu entorn de treball STVD té aquest aspecte.

Assegureu-vos que heu inclòs tots els fitxers font SPL i incloeu el fitxer com hem fet al nostre primer tutorial. I també assegureu-vos que heu afegit el fitxer de capçalera stm8s103_serial.h . No hi ha cap fitxer C per a aquesta capçalera.
Programació STM8S per a comunicacions en sèrie
Un cop preparada la configuració del projecte STVD, podem començar a escriure el nostre codi al fitxer main.c. El codi complet d’aquest tutorial es troba a la part inferior d’aquesta pàgina. L’explicació és la següent.
El primer pas és incloure els fitxers de capçalera necessaris, aquí he afegit el fitxer de capçalera principal (stm8s) i el fitxer de capçalera stm8s_103_serial que acabem de descarregar.
// Capçaleres obligatòries #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
A continuació, estem utilitzant les macros de disseny per especificar els pins d'entrada i sortida. Aquí només es controlarà el LED integrat que està connectat al pin5 del port B, de manera que li donem el nom de test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // el test LED està connectat a PB5
Seguint dins de la funció principal, definirem el pin com a sortida. Si no esteu familiaritzat amb les funcions bàsiques GPIO, torneu al tutorial GPIO STM8S.
// Defanicions de pin // Declareu PB5 com push pull Pin de sortida GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
A continuació, inicialitzem els nostres ports de comunicació sèrie a una velocitat de 9600 baud. Per als que són nous, 9600 és la velocitat a la qual es transferiran els bits de dades durant la comunicació. Si configureu 9600 aquí, també haureu d’establir el mateix al programari de monitorització. Després també imprimim una cadena "Enter command" i passem a la següent línia.
Serial_begin (9600); // Inicialitzar la comunicació sèrie a una velocitat de 9600 baud Serial_print_string ("Introduïu l'ordre"); // imprimeix una cadena Serial_newline (); // passa a la línia següent
Passant al bucle while infinit, utilitzem la funció Serial_available per comprovar si hi ha dades de sèrie entrants. Si és així, el llegim i el desem en una variable anomenada ch i també imprimim el mateix mitjançant Serial_print . Aleshores, si el valor rebut és 0, apagarem el LED i, si és 1, l’encendrem
if (Serial_available ()) {Serial_print_string ("Heu premut:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED apagat si (ch == '1') GPIO_WriteLow (test_LED); // LED ENCENDUT}
Amb això, la programació d’aquest tutorial s’ha completat, només cal que pengeu el codi que es dóna a la part inferior d’aquesta pàgina i hauríeu de poder controlar el LED des del monitor sèrie.
LED de control des del monitor sèrie
Un cop hàgiu carregat el codi, podeu obrir qualsevol monitor sèrie a una velocitat de 9600 baud. He utilitzat el monitor sèrie Arduino per facilitar-ne l’ús. Premeu el botó de restabliment i hauríeu de veure el missatge "Introduïu una ordre". A continuació, si introduïu 1 i premeu Retorn, el led integrat s'ha d'encendre, de manera similar a 0, s'hauria d'apagar.


El treball complet es pot trobar al vídeo enllaçat a la part inferior d’aquesta pàgina. Si teniu cap pregunta, deixeu-les a la secció de comentaris. També podeu utilitzar els nostres fòrums per publicar altres preguntes tècniques.
Biblioteca serial STM8S Aparença més profunda
Per a aquelles ments curioses que vulguin saber què passa realment dins del fitxer de capçalera STM8S103F3_Serial llegit a…
Aquest fitxer de capçalera funciona bé per a la programació de principiants, però si utilitzeu una versió diferent del controlador STM8S o busqueu algunes opcions avançades, és possible que vulgueu modificar una mica aquesta capçalera o treballar directament amb biblioteques SPL. Vaig escriure aquest fitxer de capçalera de la mateixa manera que es va treure del fitxer de capçalera UART1; l'explicació del meu fitxer de capçalera és la següent.
Lectura d’un personatge de Serial Monitor
Aquesta funció ajuda a llegir un sol caràcter que s’ha enviat al microcontrolador des del monitor sèrie.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); return (UART1_ReceiveData8 ()); }
Esperem fins que la bandera RXE estigui SET per completar la recepció i, a continuació, esborreu la bandera per reconèixer la recepció. Finalment, enviem les dades rebudes de 8 bits com a resultat d’aquesta funció.
Impressió d'un caràcter a Serial Monitor
Aquesta funció transmet un sol caràcter des d’un microcontrolador al monitor sèrie.
void Serial_print_char (valor de caràcter) {UART1_SendData8 (valor); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // esperar a enviar}
La funció simplement escriu el valor de 8 bits i espera fins que la transmissió es completi comprovant UART1_FLAG_TXE a SET
Inicialització de la comunicació en sèrie
Aquesta funció inicialitza la comunicació en sèrie a la velocitat de transmissió requerida.
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 (); // Desinicialitzar els perifèrics 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); }
A part de la velocitat de transmissió, hi ha altres paràmetres que s’han d’establir per a la comunicació en sèrie, com el nombre de bits de dades, el nombre de bits d’aturada, la paritat, etc. El més comú (similar a Arduino) són les dades de 8 bits amb un bit de parada i sense paritat i, per tant, aquest serà el valor predeterminat. Podeu canviar-lo si cal.
Impressió d’un enter al monitor sèrie
La majoria de les vegades, si fem servir un monitor sèrie per depurar o supervisar, potser voldríem imprimir una variable de tipus int al monitor sèrie. Aquesta funció fa exactament això
void Serial_print_int (int number) // Funció per imprimir el valor int al monitor sèrie {count count = 0; char digit = ""; mentre que (número! = 0) // divideix la matriu int a char {dígit = número% 10; comptar ++; número = número / 10; } while (count! = 0) // imprimeix la matriu de caràcters en la direcció correcta {UART1_SendData8 (dígit + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // esperar l'enviament del recompte--; }}
Pren un valor enter i el converteix en matriu de caràcters al primer bucle while, i després al segon bucle while, enviarem cadascun dels caràcters similars a la nostra funció de caràcters d'impressió.
S'està imprimint una nova línia
Aquesta és una funció senzilla per imprimir una nova línia. El valor hexadecimal per fer-ho és "0x0a", només ho estem enviant mitjançant l'ordre de transmissió de 8 bits.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // esperar a enviar}
Impressió d'una cadena al monitor sèrie
Una altra funció útil és imprimir cadenes al monitor sèrie.
void Serial_print_string (cadena de caràcters) {. char i = 0; while (cadena! = 0x00) {UART1_SendData8 (cadena); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Una vegada més, aquesta funció també converteix la cadena en matriu de caràcters i envia cada caràcter. Com sabem, totes les cadenes finals seran nul·les. Així doncs, només hem de seguir recorrent i transmetent els personatges fins arribar al zero 0x00.
Comprovació de si hi ha dades de sèrie disponibles per llegir
Aquesta funció comprova si hi ha dades de sèrie al buffer a punt per llegir.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) retorna TRUE; en cas contrari, torneu FALS; }
Comprova la marca UART1_FLAG_RXNE , si és cert, torna cert i, si no, torna fals.
