- Sériová komunikácia na STM8S103F3P6
- Piny sériovej komunikácie na STM8S103F3P6
- Schéma zapojenia pre sériovú komunikáciu STM8S
- Nastavenie STVD pre sériovú komunikáciu
- Programovanie STM8S pre sériovú komunikáciu
- Kontrolka LED zo sériového monitora
- STM8S Serial Library Hlbší pohľad
Programovanie nového mikrokontroléra často trvá dlhší čas kvôli novým metódam spracovania registrov a nevedeniu, ktorý bit robí presne čo. To isté platí aj pre ladenie. To je dôvod, prečo programátori pomerne často používajú vo svojom kóde medzné hodnoty a postupujú nimi pomocou debuggeru. Používanie debuggeru však môže vyžadovať ďalší hardvér (väčšinou drahý) a tiež ďalší čas. Ako fanúšik Arduina, s ktorým sa všetci môžeme dohodnúť, je použitie príkazov sériového tlače na ladenie a pochopenie nášho kódu, ktorý uľahčuje život. Čo môžeme replikovať to isté na STM8 s kozmickým kompilátorom C a knižnicami SPL? Je to veľmi možné a to je presne to, čo urobíme v tomto treťom tutoriáli našej série tutoriálov.Tiež ste skontrolovali úvodné informácie o ovládaní STM8S (tutorial 1) a STM8S GPIO (tutorial 2), ak ste tu úplne nový. Preskúmali sme tiež možnosť programovania STM8S s Arduino pre rýchle spustenie. Všetko, čo bolo povedané, poďme do tutoriálu.
Sériová komunikácia na STM8S103F3P6
Z údajového listu STM8S103F3P6 vidíme, že náš 8-bitový radič podporuje komunikáciu UART v mnohých rôznych režimoch. Kontrolér má tiež výstupný pin hodín pre synchrónnu komunikáciu UART a môže podporovať aj SmarCard, IrDA a LIN. Nič z toho však nebudeme skúmať v tomto tutoriále, len aby sme sa vyhli zložitosti. Naučíme sa, ako sa dá robiť jednoduché UART čítanie a písanie.
Tutoriál poskytuje aj hlavičkový súbor s názvom stm8s103 serial.h, pomocou ktorého môžete vykonávať jednoduché príkazy UART ako Serial begin, Serial read, sériová tlač atď. V zásade budete môcť tlačiť znaky, int a reťazce na sériový monitor a tiež čítať znak zo sériového monitora. Na konci tohto tutoriálu budete môcť ovládať LED zo sériového monitora a získavať spätnú väzbu o stave LED. Vyššie uvedený súbor záhlavia závisí od knižníc SPL, takže sa uistite, že ste postupovali podľa príručky Začíname.
Piny sériovej komunikácie na STM8S103F3P6
Začnime z hardvérovej stránky. Pri rýchlom pohľade na nižšie uvedené konektory mikrokontroléra STM8S103F3P6 vidíme, že kolíky 1, 2 a 3 sa použijú na komunikáciu UART.
Medzi týmito tromi je pin 1 hodinový pin UART, ktorý sa bude používať iba počas synchrónnej komunikácie UART, takže ho tu nebudeme potrebovať. Pin 2 je pin UART vysielača a Pin 3 je pin UART prijímača. Upozorňujeme, že tieto piny sa môžu zdvojnásobiť aj ako analógový alebo normálny pin GPIO.
Schéma zapojenia pre sériovú komunikáciu STM8S
Schéma zapojenia je tu veľmi jednoduchá, musíme pripojiť náš ST-LINK 2 na programovanie a prevodník USB na TTL na čítanie sériových údajov. Pamätajte, že náš radič STM8S pracuje na logickej úrovni 3,3 V, preto sa uistite, či váš prevodník USB na TTL podporuje aj logiku 3,3 V. Kompletná schéma zapojenia je uvedená nižšie.
Musíte pripojiť svoj ST-link do jedného USB portu a prevodník USB na TTL do iného USB portu vášho notebooku, aby ste mohli programovať aj monitorovať dáta súčasne. Pripojenie UART je jednoduché, stačí pripojiť uzemnenie a kolík Rx / Tx vášho mikrokontroléra STM8S k pinom Tx / Rx prevodníka USB na TTL. Tu som napájal ovládač pinom Vcc ST-Link a nechal som otvorený pin vss prevodníka TTL, môžete to urobiť aj opačne. Na trhu existuje veľa typov prevodníkov USB na TTL, len sa uistite, že dokáže pracovať na logických signáloch 3,3 V, jednoducho vyhľadajte kolíky Tx, Rx a GND a vytvorte pripojenie uvedené vyššie. Moje nastavenie hardvéru je zobrazené nižšie.
Na zabezpečenie sériovej komunikácie sme poskytli hlavičkový súbor STM8S_Serial.h . Pomocou tohto hlavičkového súboru môžete vykonávať jednoduché funkcie podobné sériovej komunikácii ako Arduino.
Všetky požadované súbory pre tento projekt nájdete na našej stránke STM8S103F3_SPL Github. Ak potrebujete iba tento konkrétny hlavičkový súbor, môžete si ho stiahnuť z nasledujúceho odkazu.
Stiahnite si STM8S_Serial.h
Nastavenie STVD pre sériovú komunikáciu
Na prácu so sériovou komunikáciou budeme veľa používať funkciu súboru hlavičkového súboru STM8S_Serial.h, o ktorej sme už hovorili. Knižnica má ale aj iné závislosti, veľa SPL UART a hodín súvisiacich s hlavičkami a súbormi C. Od tohto okamihu je teda lepšie zahrnúť všetky súbory hlavičiek a C do nášho projektu, aby ste sa vyhli chybe kompilácie. Moje pracovné prostredie STVD vyzerá takto.
Uistite sa, že ste zahrnuli všetky zdrojové súbory SPL a Zahrnúť súbor, ako sme to urobili v našom prvom návode. A tiež sa uistite, že ste pridali hlavičkový súbor stm8s103_serial.h . Pre túto hlavičku neexistuje žiadny súbor C.
Programovanie STM8S pre sériovú komunikáciu
Keď je pripravené nastavenie projektu STVD, môžeme začať písať náš kód do súboru main.c. Celý kód tohto tutoriálu nájdete v spodnej časti tejto stránky. Vysvetlenie je nasledovné.
Prvým krokom je zahrnutie požadovaných hlavičkových súborov, sem som pridal hlavný hlavičkový súbor (stm8s) a stm8s_103_serial hlavičkový súbor, ktorý sme si práve stiahli.
// Povinné hlavičky #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Ďalej používame návrhové makrá na určenie vstupných a výstupných pinov. Tu bude iba ovládanie palubnej LED diódy, ktorá je pripojená k pinu 5 portu B, takže jej dáme názov test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // testovacia LED je pripojená k PB5
Vo vnútri hlavnej funkcie budeme definovať pin ako výstup. Ak nie ste oboznámení so základnými funkciami GPIO, vráťte sa k tutoriálu GPIO STM8S.
// Defanácie pinov // Deklarujte PB5 ako push pull Výstupný pin GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Potom inicializujeme naše sériové komunikačné porty na 9600 baudov. Pre tých, ktorí sú noví, je 9600 rýchlosť, akou sa budú dátové bity prenášať počas komunikácie. Ak tu nastavíte 9600, musíte to isté nastaviť aj na monitorovacom softvéri. Potom tiež vytlačíme reťazec „Enter command“ a prejdeme na ďalší riadok.
Serial_begin (9600); // Inicializujte sériovú komunikáciu pri 9600 prenosovej rýchlosti Serial_print_string ("príkaz Enter"); // vytlačiť reťazec Serial_newline (); // presun na ďalší riadok
Ak sa presunieme do nekonečnej slučky while, pomocou funkcie Serial_available skontrolujeme, či existujú nejaké prichádzajúce sériové údaje. Ak áno, prečítame ich a uložíme do premennej s názvom ch a tiež ich vytlačíme pomocou Serial_print . Potom, ak je prijatá hodnota 0, LED zhasneme a ak je 1, rozsvietime LED
if (Serial_available ()) {Serial_print_string ("Stlačili ste:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED nesvieti, ak (ch == '1') GPIO_WriteLow (test_LED); // LED svieti}
Týmto je programovanie tohto tutoriálu dokončené, stačí nahrať kód uvedený v dolnej časti tejto stránky a mali by ste byť schopní ovládať LED zo sériového monitora.
Kontrolka LED zo sériového monitora
Po načítaní kódu môžete otvoriť ľubovoľný sériový monitor s rýchlosťou 9600 baudov. Pre ľahké použitie som použil samotný sériový monitor Arduino. Stlačte tlačidlo reset a mala by sa zobraziť správa „Zadajte príkaz“. Potom, ak zadáte 1 a stlačte kláves Enter, mala by sa rozsvietiť palubná LED dióda, podobne ako na 0, by sa mala vypnúť.
Celú prácu nájdete vo videu, na ktoré odkazujete v dolnej časti tejto stránky. Ak máte akékoľvek otázky, nechajte ich prosím v sekcii komentárov. Môžete tiež použiť naše fóra na zverejnenie ďalších technických otázok.
STM8S Serial Library Hlbší pohľad
Pre tých zvedavcov, ktorí chcú vedieť, čo sa vlastne deje v hlavičkovom súbore STM8S103F3_Serial, čítajte ďalej….
Tento súbor hlavičky funguje dobre pre programovanie na úrovni začiatočníkov, ale ak používate inú verziu radiča STM8S alebo hľadáte nejaké pokročilé možnosti, možno budete chcieť túto hlavičku trochu doladiť alebo priamo pracovať s knižnicami SPL. Tento hlavičkový súbor som napísal rovnako ako dozretie od hlavičkového súboru UART1, vysvetlenie môjho hlavičkového súboru je nasledujúce.
Čítanie znaku z programu Serial Monitor
Táto funkcia pomáha načítať jeden znak, ktorý bol odoslaný do mikrokontroléra zo sériového monitora.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); návrat (UART1_ReceiveData8 ()); }
Počkáme, kým nebude nastavený príznak RXE, aby sme dokončili príjem, a potom príznak zrušte, aby ste príjem potvrdili. Nakoniec pošleme prijaté 8-bitové dáta ako výsledok tejto funkcie.
Tlač znaku na Serial Monitor
Táto funkcia prenáša jeden znak z mikrokontroléra na sériový monitor.
void Serial_print_char (char hodnota) {UART1_SendData8 (hodnota); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // čakať na odoslanie}
Funkcia jednoducho napíše 8-bitovú hodnotu a počká, kým sa prenos nedokončí, skontrolovaním UART1_FLAG_TXE na SET
Inicializuje sa sériová komunikácia
Táto funkcia inicializuje sériovú komunikáciu s požadovanou prenosovou rýchlosťou.
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 (); // Deinicializácia periférií 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 (POVOLIŤ); }
Okrem prenosovej rýchlosti je potrebné pre sériovú komunikáciu nastaviť aj ďalšie parametre, napríklad počet dátových bitov, počet stop bitov, paritu atď. Najbežnejším parametrom (podobne ako Arduino) sú 8-bitové dáta s jedným stop bitom a bez parity, a teda to bude predvolené nastavenie. V prípade potreby to môžete zmeniť.
Tlač celého čísla na sériový monitor
Väčšinou, ak používame sériový monitor na ladenie alebo monitorovanie, možno budeme chcieť do sériového monitora vytlačiť premennú typu int. Táto funkcia robí presne to
void Serial_print_int (int number) // Funkcia tlače int hodnoty na sériový monitor {počet znakov = 0; char digit = ""; while (number! = 0) // rozdeliť int na char pole {číslice = číslo% 10; počet ++; číslo = číslo / 10; } while (count! = 0) // vypísať char pole správnym smerom {UART1_SendData8 (číslica + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // čakať na počet odoslaní--; }}
Načíta celočíselnú hodnotu a prevedie ju na znakové pole v prvej cykle while, potom v druhej smyčke while pošleme každý zo znakov podobný našej funkcii print char.
Tlač nového riadku
Toto je jednoduchá funkcia na vytlačenie nového riadku. Hexvalue, ktorá to robí, je „0x0a“, iba ju posielame pomocou 8-bitového príkazu na prenos.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // čakať na odoslanie}
Tlač reťazca na sériový monitor
Ďalšou užitočnou funkciou je skutočná tlač reťazcov na sériovom monitore.
void Serial_print_string (char reťazec) {. char i = 0; while (string! = 0x00) {UART1_SendData8 (string); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Táto funkcia opäť prevádza reťazec na char pole a odosiela každý znak. Ako vieme, všetky reťazce budú nulové. Musíme teda len prechádzať a vysielať znaky, kým sa nedostaneme k nulovej hodnote 0x00.
Kontrola, či sú k dispozícii na čítanie sériové údaje
Táto funkcia kontroluje, či sú vo vyrovnávacej pamäti pripravené na čítanie nejaké sériové údaje.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == PRAVDA) návrat PRAVDA; inak vrátiť FALSE; }
Skontroluje príznak UART1_FLAG_RXNE , ak je pravdivý, vráti true a ak nie, vráti false.