- Sērijas komunikācija par STM8S103F3P6
- STM8S103F3P6 sērijas sakaru tapas
- STM8S sērijas sakaru shēmas shēma
- STVD iestatīšana sērijveida sakariem
- STM8S programmēšana sērijveida sakariem
- LED vadīšana no sērijveida monitora
- STM8S sērijas bibliotēkas dziļāks izskats
Jauna mikrokontrollera ieprogrammēšana bieži prasa ilgāku laiku, pateicoties jaunajām reģistru apstrādes metodēm un nezināšanai, kas tieši to dara. Tas pats attiecas uz atkļūdošanu, arī nepasakot. Tāpēc programmētāji diezgan bieži savā kodā izmanto pārtraukumpunktus un iziet cauri tam, izmantojot atkļūdotāju. Bet atkļūdotāja izmantošanai var būt nepieciešama papildu aparatūra (visbiežāk dārga) un arī papildu laiks. Būdams Arduino fanu zēns, viena lieta, par kuru mēs visi varam vienoties, ir sērijveida izdruku izmantošana atkļūdošanai un mūsu koda izpratne padara dzīvi daudz vieglāku. Ko mēs varam atkārtot to pašu STM8 ar kosmisko C kompilatoru un SPL bibliotēkām? Nu, tas ir ļoti iespējams, un tieši to mēs darīsim šajā mūsu apmācību sērijas trešajā apmācībā.Jūs arī pārbaudāt darba sākšanu ar STM8S (1. apmācība) un STM8S GPIO vadību (2. apmācība), ja šeit esat pilnīgi jauns. Mēs arī esam izpētījuši iespēju STM8S programmēt ar Arduino ātrai iesācējiem. Viss, kas tiek teikts, iesim apmācībā.
Sērijas komunikācija par STM8S103F3P6
No STM8S103F3P6 datu lapas mēs varam redzēt, ka mūsu 8 bitu kontrolieris atbalsta UART saziņu daudzos dažādos režīmos. Kontrolierim ir arī pulksteņa izvades tapa sinhronai UART saziņai, un tas var atbalstīt arī SmarCard, IrDA un LIN. Bet šajā pamācībā mēs to neizpētīsim tikai tāpēc, lai izvairītos no sarežģītības. Mēs uzzināsim, kā veikt vienkāršu UART lasīšanu un rakstīšanu.
Apmācība nodrošina arī galvenes failu ar nosaukumu stm8s103 serial.h, izmantojot kuru jūs varat izpildīt vienkāršas UART komandas, piemēram, sērijas sākums, sērijas lasīšana, sērijveida drukāšana utt. un arī lasīt char no seriālā monitora. Šīs apmācības beigās jūs varēsiet vadīt LED no sērijas monitora un saņemt atsauksmes par gaismas diodes statusu. Iepriekš minētais galvenes fails ir atkarīgs no SPL bibliotēkām, tāpēc pārliecinieties, vai esat ievērojis darba sākšanas apmācību.
STM8S103F3P6 sērijas sakaru tapas
Sāksim no aparatūras puses. Ātri apskatot zemāk norādītā mikrokontrollera STM8S103F3P6 kontaktligzdas, mēs varam redzēt, ka 1., 2. un 3. tapas tiks izmantotas UART saziņai.
Starp trim, 1. tapa ir UART pulksteņa tapa, kas tiks izmantota tikai sinhronā UART sakaru laikā, tāpēc mums tā šeit nebūs vajadzīga. 2. tapa ir UART raidītāja tapa un 3. tapa ir UART uztvērēja tapa. Ņemiet vērā, ka šīs tapas var arī dubultot kā analogo tapu vai parasto GPIO tapu.
STM8S sērijas sakaru shēmas shēma
Ķēdes shēma šeit ir ļoti vienkārša, mums jāpievieno mūsu ST-LINK 2 programmēšanai un USB uz TTL pārveidotāju sērijas datu nolasīšanai. Ņemiet vērā, ka mūsu STM8S kontrolieris darbojas 3.3V loģikas līmenī, tāpēc pārliecinieties, ka arī jūsu USB uz TTL pārveidotājs atbalsta 3.3V loģiku. Pilna shēma ir parādīta zemāk.
Jums ir jāpievieno ST-link vienā USB portā un USB uz TTL pārveidotāju citā klēpjdatora USB portā, lai vienlaikus varētu gan programmēt, gan uzraudzīt datus. UART savienojums ir vienkāršs, vienkārši pievienojiet STM8S mikrokontrollera zemi un Rx / Tx tapu ar USB uz TTL pārveidotāja Tx / Rx tapām. Šeit es esmu darbinājis kontrolieri ar ST-Link Vcc tapu un atstājis atvērtu TTL pārveidotāja tapu vss, jūs varat to izdarīt arī otrādi. Tirgū ir daudz veidu USB uz TTL pārveidotāju, tikai pārliecinieties, ka tas var darboties ar 3,3 V loģiskiem signāliem un vienkārši meklēt Tx, Rx un GND tapas un izveidot iepriekš parādīto savienojumu. Mana aparatūras iestatīšana ir parādīta zemāk.
Lai izveidotu sērijveida saziņas veidu, mēs esam nodrošinājuši galvenes failu STM8S_Serial.h . Izmantojot šo galvenes failu, jūs varat veikt vienkāršas Arduino līdzīgas funkcijas sērijveida saziņai.
Visus nepieciešamos failus šim projektam varat atrast mūsu STM8S103F3_SPL Github lapā. Ja jums nepieciešams tikai šis konkrētais galvenes fails, varat to lejupielādēt no šīs saites.
Lejupielādēt STM8S_Serial.h
STVD iestatīšana sērijveida sakariem
Lai strādātu ar seriālo komunikāciju, mēs daudzus izmantosim, izmantojot galvenes faila funkciju STM8S_Serial.h, kuru mēs iepriekš apspriedām. Bet bibliotēkai ir citas atkarības, daudzas ar SPL UART un pulksteni saistītas galvenes un C faili. Tāpēc no šī brīža labāk ir iekļaut visus galvenes un C failus mūsu projektā, lai izvairītos no kompilācijas kļūdas. Mana STVD darba vide izskatās šādi.
Pārliecinieties, ka esat iekļāvis visus SPL avota failus un Iekļaujiet failu tāpat kā mēs to izdarījām mūsu pirmajā apmācībā. Un arī pārliecinieties, vai esat pievienojis galvenes failu stm8s103_serial.h . Šai galvenei nav C faila.
STM8S programmēšana sērijveida sakariem
Kad STVD projekta iestatīšana ir gatava, mēs varam sākt ierakstīt kodu failā main.c. Pilns šīs apmācības kods ir atrodams šīs lapas apakšdaļā. Paskaidrojums ir šāds.
Pirmais solis ir iekļaut nepieciešamos galvenes failus, šeit es esmu pievienojis galveno galvenes failu (stm8s) un stm8s_103_serial galvenes failu, kuru tikko lejupielādējām.
// Obligātās galvenes # ietver "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Tālāk mēs izmantojam dizaina makro, lai norādītu ievades un izvades tapas. Šeit tiks kontrolēta tikai borta LED, kas ir savienota ar B porta pin5, tāpēc mēs piešķiram tam nosaukumu kā test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // testa LED ir pievienots PB5
Pārvietojoties galvenās funkcijas iekšpusē, mēs definēsim tapu kā izvadi. Ja nezināt GPIO pamatfunkcijas, skatiet STM8S GPIO apmācību.
// Pin defanitions // Paziņot PB5 par push pull Output pin GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Tad mēs inicializējam sērijveida sakaru portus ar 9600 bitu pārraides ātrumu. Tiem, kas ir jauni, 9600 ir ātrums, ar kādu datu biti tiks pārsūtīti komunikācijas laikā. Ja šeit iestatāt 9600, tas pats jāiestata arī uzraudzības programmatūrā. Tad mēs arī izdrukājam virkni “Enter command” un pārejam uz nākamo rindu.
Sērijas_sākums (9600); // Inicializēt sērijveida sakarus ar 9600 bitu pārraides ātrumu Serial_print_string ("Enter komanda"); // izdrukāt virkni Serial_newline (); // pāriet uz nākamo rindu
Pārejot uz bezgalīgo ciklu, mēs izmantojam funkciju Serial_available, lai pārbaudītu, vai ir ienākošie sērijas dati. Ja jā, mēs to nolasām un saglabājam mainīgajā ar nosaukumu ch, kā arī izdrukājam to pašu, izmantojot Serial_print . Tad, ja saņemtā vērtība ir 0, mēs izslēgsim LED un, ja tas ir 1, mēs ieslēgsim LED
if (Serial_available ()) {Serial_print_string ("Jūs esat nospiedis:"); ch = sērijas_lasīšanas_zīme (); Sērijas_drukas_harijs (ch); Sērijas_newline (); if (ch == '0') GPIO_WriteHigh (testa_LED); // LED izslēgts, ja (ch == '1') GPIO_WriteLow (test_LED); // LED ieslēgts}
Tādējādi šīs apmācības programmēšana ir pabeigta, vienkārši augšupielādējiet kodu, kas norādīts šīs lapas apakšdaļā, un jums vajadzētu būt iespējai vadīt LED no seriālā monitora.
LED vadīšana no sērijveida monitora
Kad esat augšupielādējis kodu, varat atvērt jebkuru sērijveida monitoru ar 9600 bitu pārraides ātrumu. Esmu izmantojis pašu Arduino sērijveida monitoru, lai to ērti lietotu. Nospiediet atiestatīšanas pogu, un jums vajadzētu redzēt ziņojumu “Ievadīt komandu”. Tad, ja jūs ievadāt 1 un nospiežat enter, iebūvētajam LED vajadzētu ieslēgties, līdzīgi kā 0, tam vajadzētu izslēgties.
Pilnīgu darbu var atrast videoklipā, kas ir saistīts ar šīs lapas apakšdaļu. Ja jums ir kādi jautājumi, lūdzu, atstājiet tos komentāru sadaļā. Varat arī izmantot mūsu forumus, lai izliktu citus tehniskus jautājumus.
STM8S sērijas bibliotēkas dziļāks izskats
Tiem ziņkārīgajiem prātiem, kuri vēlas uzzināt, kas patiesībā notiek galvenes failā STM8S103F3_Serial, lasiet tālāk.
Šis galvenes fails labi darbojas iesācēju līmeņa programmēšanai, taču, ja izmantojat citu STM8S kontroliera versiju vai meklējat dažas papildu opcijas, iespējams, vēlēsities mazliet uzlabot šo galveni vai tieši strādāt ar SPL bibliotēkām. Es uzrakstīju šo galvenes failu tāpat kā nobriedis no UART1 galvenes faila, mana galvenes faila skaidrojums ir šāds.
Rakstzīmes lasīšana no sērijas monitora
Šī funkcija palīdz nolasīt vienu rakstzīmi, kas no sērijveida monitora ir nosūtīta mikrokontrollerim.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == ATIESTATĪT); UART1_ClearFlag (UART1_FLAG_RXNE); atgriešanās (UART1_ReceiveData8 ()); }
Mēs gaidām, līdz RXE karogs ir iestatīts, lai pabeigtu saņemšanu, un pēc tam notīriet karodziņu, lai apstiprinātu saņemšanu. Visbeidzot, šīs funkcijas rezultātā mēs nosūtām saņemtos 8 bitu datus.
Rakstzīmes drukāšana sērijas monitorā
Šī funkcija pārsūta vienu rakstzīmi no mikrokontrollera uz sērijveida monitoru.
void Serial_print_char (char vērtība) {UART1_SendData8 (vērtība); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATIESTATĪT); // gaidiet nosūtīšanu}
Funkcija vienkārši uzraksta 8 bitu vērtību un gaida, līdz pārsūtīšana ir pabeigta, pārbaudot UART1_FLAG_TXE uz SET
Inicializē sērijas komunikāciju
Šī funkcija inicializē seriālo komunikāciju ar nepieciešamo datu pārraides ātrumu.
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 (); // Deinitialize UART perifērijas ierīces 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); }
Papildus datu pārraides ātrumam ir jāiestata arī citi parametri, piemēram, datu bitu skaits, apstāšanās bitu skaits, paritāte utt. Visizplatītākais (līdzīgi kā Arduino) ir 8 bitu dati ar vienu pieturas bitu un bez paritātes, tāpēc tas būs noklusējuma iestatījums. Ja nepieciešams, varat to mainīt.
Vesela skaitļa drukāšana uz sērijveida monitoru
Lielākoties, ja atkļūdošanai vai uzraudzībai izmantojam sērijveida monitoru, iespējams, vēlēsimies sērijveida monitorā izdrukāt int tipa mainīgo. Šī funkcija veic tieši to
void Serial_print_int (int numurs) // Funkcija int vērtības drukāšanai seriālajā monitorā {char count = 0; char cipars = ""; while (skaitlis! = 0) // sadaliet int ar char masīvu {cipars = skaitlis% 10; skaits ++; skaitlis = skaitlis / 10; } while (skaits! = 0) // izdrukā char masīvu pareizajā virzienā {UART1_SendData8 (cipars + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATIESTATĪT); // gaidiet nosūtīšanas skaitu--; }}
Tas uzņem veselu skaitli un pārvērš to rakstzīmju masīvā pirmajā while ciklā, pēc tam otrajā while ciklā mēs nosūtīsim katru no rakstzīmēm, kas līdzīgas mūsu drukas char funkcijai.
Jaunas līnijas drukāšana
Šī ir vienkārša funkcija, lai izdrukātu jaunu līniju. Sešvērtība, lai to izdarītu, ir “0x0a”, mēs to vienkārši nosūtām, izmantojot 8 bitu pārsūtīšanas komandu.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATIESTATĪT); // gaidiet nosūtīšanu}
Virknes drukāšana seriālajā monitorā
Vēl viena noderīga funkcija ir virkņu faktiskā drukāšana uz sērijveida monitora.
void Serial_print_string (char string) {. char i = 0; while (virkne! = 0x00) {UART1_SendData8 (virkne); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == ATIESTATĪT); i ++; }}
Atkal šī funkcija arī pārveido virkni par char masīvu un nosūta katru rakstzīmi. Kā mēs zinām, visas virknes beigsies. Tāpēc mums vienkārši jāturpina šķērsot un pārsūtīt rakstzīmes, līdz mēs sasniedzam nulli 0x00.
Pārbauda, vai sērijas dati ir pieejami lasīšanai
Šī funkcija pārbauda, vai buferī ir kādi sērijas dati, kas ir gatavi lasīšanai.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) atgriež TRUE; cits atgriež FALSE; }
Tas pārbauda karodziņu UART1_FLAG_RXNE , ja tas ir patiess, tas atgriež patiesu un, ja nav, atgriež nepatiesu.