- Sériová komunikace na STM8S103F3P6
- Piny sériové komunikace na STM8S103F3P6
- Schéma zapojení pro sériovou komunikaci STM8S
- Nastavení STVD pro sériovou komunikaci
- Programování STM8S pro sériovou komunikaci
- Kontrolka LED ze sériového monitoru
- STM8S Serial Library Hlubší pohled
Programování nového mikrokontroléru často trvá déle kvůli novým metodám zpracování registrů a neví, co dělá přesně co. Totéž platí i pro ladění. To je důvod, proč programátoři poměrně často používají v kódu zarážky a procházejí je pomocí debuggeru. Ale použití debuggeru může vyžadovat další hardware (většinou drahý) a také další čas. Protože jsme fanouškem Arduina, můžeme se všichni shodnout, že používání příkazů sériového tisku k ladění a porozumění našemu kódu usnadňuje život. Co můžeme replikovat totéž na STM8s s kosmickým kompilátorem C a knihovnami SPL? No, je to velmi možné, a to je přesně to, co uděláme v tomto třetím tutoriálu naší série tutoriálů.Pokud jste zde zcela noví, zkontrolujete také začátek s ovládáním STM8S (kurz 1) a ovládáním STM8S GPIO (kurz 2). Rovněž jsme prozkoumali možnost programování STM8S s Arduino pro rychlé spuštění. Vše, co bylo řečeno, pojďme do tutoriálu.
Sériová komunikace na STM8S103F3P6
Z datového listu STM8S103F3P6 vidíme, že náš 8bitový řadič podporuje komunikaci UART v mnoha různých režimech. Řadič má také hodinový výstupní kolík pro synchronní komunikaci UART a může také podporovat SmarCard, IrDA a LIN. Nic z toho ale v tomto tutoriálu nebudeme zkoumat, abychom se vyhnuli složitosti. Naučíme se, jak dělat jednoduché UART čtení a psaní.
Výukový program také poskytuje soubor záhlaví s názvem stm8s103 serial.h, pomocí kterého můžete provádět jednoduché příkazy UART, jako je Sériové zahájení, Sériové čtení, Sériový tisk atd. V zásadě budete moci tisknout znaky, int a řetězce na sériový monitor a také číst znak ze sériového monitoru. Na konci tohoto tutoriálu budete moci ovládat LED ze sériového monitoru a získat zpětnou vazbu o stavu LED. Výše uvedený soubor záhlaví závisí na knihovnách SPL, takže se ujistěte, že jste postupovali podle úvodního kurzu.
Piny sériové komunikace na STM8S103F3P6
Začněme z hardwarové stránky. Při krátkém pohledu na níže uvedené vývody na mikrokontroléru STM8S103F3P6, vidíme, že pro komunikaci UART budou použity piny 1, 2 a 3.
Mezi těmito třemi je pin 1 hodinový UART pin, který bude použit pouze během synchronní komunikace UART, takže ho zde nebudeme potřebovat. Kolík 2 je kolík vysílače UART a kolík 3 je kolík přijímače UART. Nezapomeňte, že tyto piny se mohou také zdvojnásobit jako analogový pin nebo normální pin GPIO.
Schéma zapojení pro sériovou komunikaci STM8S
Schéma zapojení je zde velmi jednoduché, musíme připojit náš ST-LINK 2 pro programování a převodník USB na TTL pro čtení sériových dat. Mějte na paměti, že náš řadič STM8S pracuje na logické úrovni 3,3 V, takže se ujistěte, že váš převodník USB na TTL také podporuje logiku 3,3 V. Kompletní schéma zapojení je uvedeno níže.
Musíte připojit svůj ST-link do jednoho USB portu a převodník USB na TTL do jiného USB portu vašeho notebooku, abyste mohli současně programovat a monitorovat data. Připojení UART je jednoduché, stačí připojit uzemnění a Rx / Tx pin vašeho mikrokontroléru STM8S k pinům Tx / Rx převaděče USB na TTL. Zde jsem napájel ovladač pinem Vcc ST-Link a nechal jsem otevřený pin vss převaděče TTL, můžete to udělat i opačně. Na trhu existuje mnoho typů převaděčů USB na TTL, stačí se ujistit, že může pracovat na logických signálech 3,3 V a jednoduše hledat piny Tx, Rx a GND a provést připojení uvedené výše. Moje nastavení hardwaru je uvedeno níže.
Abychom mohli provést sériovou komunikaci, poskytli jsme záhlaví souboru STM8S_Serial.h . Pomocí tohoto souboru záhlaví můžete provádět jednoduché funkce podobné Arduinu pro sériovou komunikaci.
Všechny požadované soubory pro tento projekt najdete na naší stránce Github STM8S103F3_SPL. Pokud potřebujete pouze tento konkrétní soubor záhlaví, můžete si jej stáhnout z níže uvedeného odkazu.
Stáhněte si STM8S_Serial.h
Nastavení STVD pro sériovou komunikaci
Abychom mohli pracovat se sériovou komunikací, budeme používat mnoho pomocí funkce souboru záhlaví STM8S_Serial.h, o které jsme hovořili dříve. Ale knihovna má jiné závislosti, mnoho SPL UART a Clock souvisejících hlaviček a C souborů. Takže od tohoto okamžiku je lepší zahrnout všechny soubory záhlaví a C do našeho projektu, abychom se vyhnuli chybě kompilace. Moje pracovní prostředí STVD vypadá takto.
Ujistěte se, že jste zahrnuli všechny zdrojové soubory SPL a Zahrnout soubor, jako jsme to udělali v našem prvním kurzu. A také se ujistěte, že jste přidali soubor záhlaví stm8s103_serial.h . Pro tuto hlavičku neexistuje žádný soubor C.
Programování STM8S pro sériovou komunikaci
Jakmile je instalace STVD projekt připraven, můžeme začít psát náš kód v main.c souboru. Kompletní kód tohoto tutoriálu najdete ve spodní části této stránky. Vysvětlení je následující.
Prvním krokem je zahrnout požadované soubory záhlaví, zde jsem přidal hlavní soubor záhlaví (stm8s) a soubor záhlaví stm8s_103_serial, který jsme právě stáhli.
// Povinné hlavičky #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Dále používáme návrhová makra k určení vstupních a výstupních pinů. Zde bude pouze ovládání palubní LED, která je připojena k pin5 portu B, takže mu dáme název test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // testovací LED je připojena k PB5
Pohybem uvnitř hlavní funkce definujeme pin jako výstup. Pokud nejste obeznámeni se základními funkcemi GPIO, přejděte zpět na výukový program GPIO STM8S.
// Defanice pinů // Deklarujte PB5 jako push pull Výstupní pin GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Poté inicializujeme naše sériové komunikační porty na 9600 baudech. Pro ty, kteří jsou noví, je 9600 rychlost, s jakou budou během komunikace přenášeny datové bity. Pokud zde nastavíte 9600, musíte to samé nastavit také na monitorovacím softwaru. Potom také vytiskneme řetězec „Enter command“ a přejdeme na další řádek.
Serial_begin (9600); // Inicializace sériové komunikace při 9600 baudech Serial_print_string ("Enter command"); // tisk řetězce Serial_newline (); // přejít na další řádek
Když se přesuneme do nekonečné smyčky while, použijeme funkci Serial_available ke kontrole, zda existují nějaká příchozí sériová data. Pokud ano, načteme ji a uložíme do proměnné zvané ch a také ji vytiskneme pomocí Serial_print . Pokud je pak přijatá hodnota 0, LED zhasneme a pokud je 1, rozsvítíme LED
if (Serial_available ()) {Serial_print_string ("Stiskli jste:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED nesvítí, pokud (ch == '1') GPIO_WriteLow (test_LED); // LED svítí}
Tím je programování pro tento tutoriál dokončeno, stačí nahrát kód uvedený v dolní části této stránky a měli byste být schopni ovládat LED ze sériového monitoru.
Kontrolka LED ze sériového monitoru
Jakmile nahrajete kód, můžete otevřít jakýkoli sériový monitor s rychlostí 9600 baudů. Pro snadné použití jsem použil samotný sériový monitor Arduino. Stiskněte resetovací tlačítko a měla by se zobrazit zpráva „Zadejte příkaz“. Pokud tedy zadáte 1 a stisknete klávesu Enter, palubní LED by se měla rozsvítit, podobně jako pro 0, by se měla vypnout.
Kompletní práci najdete ve videu, na které odkazujete ve spodní části této stránky. Máte-li jakékoli dotazy, nechte je v sekci komentářů. Můžete také použít naše fóra k odeslání dalších technických otázek.
STM8S Serial Library Hlubší pohled
Pro ty zvědavé mysli, kteří chtějí vědět, co se vlastně děje uvnitř hlavičkového souboru STM8S103F3_Serial, číst….
Tento soubor záhlaví funguje dobře pro programování na úrovni začátečníků, ale pokud používáte jinou verzi řadiče STM8S nebo hledáte nějaké pokročilé možnosti, možná budete chtít tuto záhlaví trochu vyladit nebo přímo pracovat s knihovnami SPL. Tento soubor záhlaví jsem napsal stejně jako odříznutý od souboru záhlaví UART1, vysvětlení mého souboru záhlaví je následující.
Čtení znaku ze Serial Monitoru
Tato funkce pomáhá číst jeden znak, který byl odeslán do mikrokontroléru ze sériového monitoru.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); návrat (UART1_ReceiveData8 ()); }
Čekáme, až bude příznak RXE nastaven na dokončení příjmu, a poté příznak zrušíme, abychom příjem potvrdili. Nakonec pošleme přijatá 8bitová data jako výsledek této funkce.
Tisk znaku na Serial Monitor
Tato funkce přenáší jeden znak z mikrokontroléru na sériový monitor.
void Serial_print_char (char hodnota) {UART1_SendData8 (hodnota); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // čekat na odeslání}
Funkce jednoduše zapíše 8bitovou hodnotu a čeká na dokončení přenosu kontrolou UART1_FLAG_TXE na SET
Inicializace sériové komunikace
Tato funkce inicializuje sériovou komunikaci s požadovanou přenosovou rychlostí.
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 (); // Odinicializace periferních zařízení 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 (POVOLIT); }
Kromě přenosové rychlosti je třeba pro sériovou komunikaci nastavit další parametry, jako je počet datových bitů, počet stop bitů, parita atd. Nejběžnějším (podobně jako Arduino) jsou 8bitová data s jedním stop bitem a bez parity, a proto to bude výchozí nastavení. V případě potřeby jej můžete změnit.
Tisk celého čísla na sériový monitor
Většinu času, pokud pro ladění nebo monitorování používáme sériový monitor, můžeme chtít do sériového monitoru vytisknout proměnnou typu int. Tato funkce přesně to dělá
void Serial_print_int (int number) // Funkce pro tisk int hodnoty na sériový monitor {počet znaků = 0; char digit = ""; while (number! = 0) // rozdělit int na char pole {číslice = číslo% 10; count ++; number = number / 10; } while (count! = 0) // vytisknout char pole správným směrem {UART1_SendData8 (číslice + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // počkat na počet odeslání--; }}
Vezme celočíselnou hodnotu a převede ji na pole znaků v první smyčce while, potom ve druhé smyčce while pošleme každý ze znaků podobný naší funkci char char.
Tisk nového řádku
Toto je jednoduchá funkce pro tisk nového řádku. Hexvalue k tomu je „0x0a“, pouze ji posíláme pomocí 8bitového vysílacího příkazu.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // čekat na odeslání}
Tisk řetězce na sériový monitor
Další užitečnou funkcí je skutečně tisknout řetězce na sériovém monitoru.
void Serial_print_string (char řetězec) {. char i = 0; while (řetězec! = 0x00) {UART1_SendData8 (řetězec); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Tato funkce opět převede řetězec na pole char a odešle každý znak. Jak víme, všechny řetězce budou nulové. Musíme tedy jen procházet a přenášet postavy, dokud nedosáhneme nulové hodnoty 0x00.
Kontrola, zda jsou k dispozici sériová data ke čtení
Tato funkce kontroluje, zda jsou ve vyrovnávací paměti připravena ke čtení sériová data.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == PRAVDA) vrátit PRAVDA; jinak vrátit FALSE; }
Zkontroluje příznak UART1_FLAG_RXNE , pokud je pravdivý, vrátí true a pokud není, vrátí false.