- Σειριακή επικοινωνία στο STM8S103F3P6
- Σειριακές καρφίτσες επικοινωνίας στο STM8S103F3P6
- Διάγραμμα κυκλώματος για σειριακή επικοινωνία STM8S
- Ρύθμιση STVD για σειριακή επικοινωνία
- Προγραμματισμός STM8S για σειριακή επικοινωνία
- Έλεγχος LED από σειριακή οθόνη
- Στεριακή βιβλιοθήκη STM8S Βαθύτερη εμφάνιση
Ο προγραμματισμός ενός νέου μικροελεγκτή διαρκεί συχνά περισσότερο χρόνο λόγω των νέων μεθόδων χειρισμού του μητρώου και του μη γνωρίζοντας τι ακριβώς κάνει ακριβώς τι. Το ίδιο ισχύει και για τον εντοπισμό σφαλμάτων χωρίς να πούμε. Αυτός είναι ο λόγος για τον οποίο οι προγραμματιστές χρησιμοποιούν συχνά breakpoints στον κώδικά τους και περνούν από αυτό χρησιμοποιώντας ένα πρόγραμμα εντοπισμού σφαλμάτων. Αλλά η χρήση ενός προγράμματος εντοπισμού σφαλμάτων ενδέχεται να χρειαστεί πρόσθετο υλικό (τις περισσότερες φορές ακριβό) και επίσης επιπλέον χρόνο. Όντας ένας θαυμαστής του Arduino, ένα πράγμα που όλοι μπορούμε να συμφωνήσουμε είναι να χρησιμοποιούμε σειριακές δηλώσεις εκτύπωσης για εντοπισμό σφαλμάτων και η κατανόηση του κώδικα μας καθιστά τη ζωή πολύ πιο εύκολη. Τι μπορούμε να αναπαραγάγουμε το ίδιο σε STM8s με κοσμικές μεταγλωττιστές C και βιβλιοθήκες SPL; Λοιπόν, είναι πολύ δυνατό, και αυτό ακριβώς θα κάνουμε σε αυτό το τρίτο σεμινάριο της σειράς φροντιστηρίων μας.Ελέγξτε επίσης το ξεκίνημα με το STM8S (φροντιστήριο 1) και το STM8S GPIO στοιχείο ελέγχου (σεμινάριο 2) εάν είστε εντελώς νέος εδώ. Επίσης, διερευνήσαμε επίσης τη δυνατότητα προγραμματισμού STM8S με το Arduino για γρήγορους εκκινητές. Όλα αυτά που λέμε ας πάρουμε το σεμινάριο.
Σειριακή επικοινωνία στο STM8S103F3P6
Από το δελτίο δεδομένων του STM8S103F3P6, μπορούμε να δούμε ότι ο ελεγκτής 8-bit μας υποστηρίζει επικοινωνία UART σε πολλούς διαφορετικούς τρόπους. Ο ελεγκτής διαθέτει επίσης έναν ακροδέκτη εξόδου ρολογιού για σύγχρονη επικοινωνία UART και μπορεί επίσης να υποστηρίξει SmarCard, IrDA και LIN. Αλλά δεν θα εξερευνήσουμε κανένα από αυτά σε αυτό το σεμινάριο για να μείνουμε μακριά από την πολυπλοκότητα. Θα μάθουμε πώς να κάνουμε απλό UART να διαβάζει και να γράφει.
Το σεμινάριο παρέχει επίσης ένα αρχείο κεφαλίδας που ονομάζεται stm8s103 serial.h χρησιμοποιώντας το οποίο μπορείτε να εκτελέσετε απλές εντολές UART όπως Serial begin, Serial read, serial print κ.λπ. Βασικά, θα μπορείτε να εκτυπώσετε char, int και string στη σειριακή οθόνη και επίσης να διαβάσετε char από τη σειριακή οθόνη. Στο τέλος αυτού του σεμιναρίου, θα μπορείτε να ελέγχετε ένα LED από τη σειριακή οθόνη και να λαμβάνετε σχόλια σχετικά με την κατάσταση του LED. Το αρχείο κεφαλίδας που αναφέρεται παραπάνω εξαρτάται από τις βιβλιοθήκες SPL, οπότε βεβαιωθείτε ότι έχετε ακολουθήσει το αρχικό σεμινάριο.
Σειριακές καρφίτσες επικοινωνίας στο STM8S103F3P6
Ας ξεκινήσουμε από την πλευρά του υλικού. Ρίξτε μια γρήγορη ματιά στα pinouts στον μικροελεγκτή STM8S103F3P6 που δίνεται παρακάτω, μπορούμε να δούμε ότι οι ακίδες 1, 2 και 3 θα χρησιμοποιηθούν για επικοινωνία UART.
Μεταξύ των τριών, ο ακροδέκτης 1 είναι ο ακροδέκτης UART που θα χρησιμοποιείται μόνο κατά τη σύγχρονη επικοινωνία UART, οπότε δεν θα το χρειαζόμαστε εδώ. Ο πείρος 2 είναι ο πείρος πομπού UART και ο πείρος 3 είναι ο πείρος δέκτη UART. Λάβετε υπόψη ότι αυτές οι ακίδες μπορούν επίσης να διπλασιαστούν ως αναλογικός πείρος ή κανονικός πείρος GPIO.
Διάγραμμα κυκλώματος για σειριακή επικοινωνία STM8S
Το διάγραμμα κυκλώματος είναι πολύ απλό εδώ, πρέπει να συνδέσουμε το ST-LINK 2 για προγραμματισμό και έναν μετατροπέα USB σε TTL για την ανάγνωση σειριακών δεδομένων. Λάβετε υπόψη ότι ο ελεγκτής STM8S λειτουργεί σε επίπεδο λογικής 3.3V, οπότε βεβαιωθείτε ότι ο μετατροπέας USB σε TTL υποστηρίζει επίσης λογική 3.3V. Το πλήρες διάγραμμα κυκλώματος φαίνεται παρακάτω.
Πρέπει να συνδέσετε τον σύνδεσμο ST σε μια θύρα USB και έναν μετατροπέα USB σε TTL σε μια άλλη θύρα USB του φορητού σας υπολογιστή, ώστε να μπορείτε να προγραμματίσετε και να παρακολουθήσετε δεδομένα ταυτόχρονα. Η σύνδεση UART είναι απλή, απλώς συνδέστε τη γείωση και τον πείρο Rx / Tx του μικροελεγκτή STM8S σας στις ακίδες Tx / Rx του μετατροπέα USB σε TTL. Εδώ έχω ενεργοποιήσει τον ελεγκτή με τον ακροδέκτη Vcc του ST-Link και άφησα ανοιχτό τον ακροδέκτη vss του μετατροπέα TTL, μπορείτε επίσης να το κάνετε το αντίστροφο. Υπάρχουν πολλοί τύποι μετατροπέα USB σε TTL στην αγορά, απλώς βεβαιωθείτε ότι μπορεί να λειτουργεί σε σήματα Logic 3.3V και απλή εμφάνιση για καρφίτσες Tx, Rx και GND και κάνει τη σύνδεση που φαίνεται παραπάνω. Η ρύθμιση του υλικού μου φαίνεται παρακάτω.
Για να κάνουμε έναν τρόπο σειριακής επικοινωνίας, παρέχουμε το αρχείο κεφαλίδας STM8S_Serial.h . Χρησιμοποιώντας αυτό το αρχείο κεφαλίδας, μπορείτε να εκτελέσετε απλές λειτουργίες τύπου Arduino για σειριακή επικοινωνία.
Μπορείτε να βρείτε όλα τα απαιτούμενα αρχεία για αυτό το έργο στη σελίδα STM8S103F3_SPL Github. Εάν χρειάζεστε μόνο αυτό το συγκεκριμένο αρχείο κεφαλίδας, μπορείτε να το κατεβάσετε από τον παρακάτω σύνδεσμο.
Λήψη STM8S_Serial.h
Ρύθμιση STVD για σειριακή επικοινωνία
Για να δουλέψουμε με σειριακή επικοινωνία, θα χρησιμοποιήσουμε πολλούς χρησιμοποιώντας τη λειτουργία αρχείου κεφαλίδας STM8S_Serial.h που συζητήσαμε νωρίτερα. Όμως, η βιβλιοθήκη έχει άλλες εξαρτήσεις, πολλά από τα αρχεία κεφαλίδας και C που σχετίζονται με το SPL UART και το Ρολόι. Επομένως, από αυτό το σημείο, είναι καλύτερο να συμπεριλάβετε όλα τα αρχεία κεφαλίδας και C στο έργο μας για να αποφύγετε ένα σφάλμα συλλογής. Το περιβάλλον εργασίας STVD μου μοιάζει με αυτό.
Βεβαιωθείτε ότι έχετε συμπεριλάβει όλα τα αρχεία προέλευσης SPL και Συμπερίληψη αρχείου όπως κάναμε στο πρώτο μας σεμινάριο. Επίσης, βεβαιωθείτε ότι έχετε προσθέσει το αρχείο κεφαλίδας stm8s103_serial.h . Δεν υπάρχει αρχείο C για αυτήν την κεφαλίδα.
Προγραμματισμός STM8S για σειριακή επικοινωνία
Μόλις η εγκατάσταση του έργου STVD είναι έτοιμη, μπορούμε να αρχίσουμε να γράφουμε τον κωδικό μας στο αρχείο main.c. Ο πλήρης κωδικός για αυτό το σεμινάριο βρίσκεται στο κάτω μέρος αυτής της σελίδας. Η εξήγηση έχει ως εξής.
Το πρώτο βήμα είναι να συμπεριλάβετε τα απαιτούμενα αρχεία κεφαλίδας, εδώ έχω προσθέσει το κύριο αρχείο κεφαλίδας (stm8s) και το αρχείο κεφαλίδας stm8s_103_serial που μόλις κατεβάσαμε.
// Απαιτούμενες κεφαλίδες #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Στη συνέχεια, χρησιμοποιούμε τις μακροεντολές σχεδιασμού για να καθορίσουμε τις καρφίτσες εισόδου και εξόδου. Εδώ θα πρέπει να ελέγχει μόνο το LED επί του σκάφους το οποίο συνδέεται με ακροδέκτη 5 της θύρας Β, έτσι ώστε να του δώσει ένα όνομα όπως test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // το LED δοκιμής είναι συνδεδεμένο στο PB5
Προχωρώντας μέσα στην κύρια λειτουργία, θα ορίσουμε τον πείρο ως έξοδο. Εάν δεν είστε εξοικειωμένοι με τις βασικές λειτουργίες GPIO, επιστρέψτε στον οδηγό STM8S GPIO.
// Ορισμοί καρφιτσών // Δηλώστε το PB5 ως push pull Pin pin GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Στη συνέχεια, αρχικοποιούμε τις σειριακές θύρες επικοινωνίας με ρυθμούς 9600 baud. Για όσους είναι νέοι, το 9600 είναι ο ρυθμός ταχύτητας με τον οποίο τα bit δεδομένων θα μεταφερθούν κατά την επικοινωνία. Εάν ορίσετε 9600 εδώ, πρέπει επίσης να ορίσετε το ίδιο στο λογισμικό παρακολούθησης. Στη συνέχεια, εκτυπώνουμε επίσης μια συμβολοσειρά "Enter command" και προχωράμε στην επόμενη γραμμή.
Serial_begin (9600); // Αρχικοποιήστε τη σειριακή επικοινωνία με ρυθμό baud 9600 Serial_print_string ("Enter command"). // εκτυπώστε μια συμβολοσειρά Serial_newline (); // μεταβείτε στην επόμενη γραμμή
Προχωρώντας στον άπειρο loop, χρησιμοποιούμε τη λειτουργία Serial_available για να ελέγξουμε εάν υπάρχουν εισερχόμενα σειριακά δεδομένα. Εάν ναι, το διαβάζουμε και το αποθηκεύουμε σε μια μεταβλητή που ονομάζεται ch και επίσης εκτυπώνουμε το ίδιο χρησιμοποιώντας το Serial_print . Στη συνέχεια, εάν η ληφθείσα τιμή είναι 0, θα σβήσουμε το LED και αν είναι 1, θα ανάψουμε το LED
if (Serial_available ()) {Serial_print_string ("Έχετε πατήσει:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); εάν (ch == '0') GPIO_WriteHigh (test_LED); // LED OFF αν (ch == '1') GPIO_WriteLow (test_LED); // ΛΕΙΤΟΥΡΓΙΑ LED}
Με αυτό, ο προγραμματισμός για αυτό το σεμινάριο είναι πλήρης, απλώς ανεβάστε τον κωδικό που δίνεται στο κάτω μέρος αυτής της σελίδας και θα πρέπει να μπορείτε να ελέγχετε το LED από τη σειριακή οθόνη.
Έλεγχος LED από σειριακή οθόνη
Αφού ανεβάσετε τον κωδικό, μπορείτε να ανοίξετε οποιαδήποτε σειριακή οθόνη με ρυθμούς 9600 baud. Έχω χρησιμοποιήσει την ίδια την σειριακή οθόνη Arduino για ευκολία στη χρήση της. Πατήστε το κουμπί επαναφοράς και θα δείτε το μήνυμα "Enter a command". Στη συνέχεια, εάν εισάγετε 1 και πατήσετε enter, το ενσωματωμένο led θα πρέπει να ανάψει, όπως και για το 0, θα πρέπει να σβήσει.
Η πλήρης εργασία βρίσκεται στο βίντεο που συνδέεται στο κάτω μέρος αυτής της σελίδας. Αν έχετε απορίες, αφήστε τις στην ενότητα σχολίων. Μπορείτε επίσης να χρησιμοποιήσετε τα φόρουμ μας για να δημοσιεύσετε άλλες τεχνικές ερωτήσεις.
Στεριακή βιβλιοθήκη STM8S Βαθύτερη εμφάνιση
Για τα περίεργα μυαλά που θέλουν να μάθουν τι πραγματικά συμβαίνει μέσα στο αρχείο κεφαλίδας STM8S103F3_Serial , διαβάστε….
Αυτό το αρχείο κεφαλίδας λειτουργεί καλά για προγραμματισμό επιπέδου για αρχάριους, αλλά εάν χρησιμοποιείτε διαφορετική έκδοση του ελεγκτή STM8S ή ψάχνετε για κάποιες σύνθετες επιλογές, ίσως θελήσετε να τροποποιήσετε αυτήν την κεφαλίδα λίγο ή να εργαστείτε απευθείας με βιβλιοθήκες SPL. Έγραψα αυτό το αρχείο κεφαλίδας ως ένα ώριμο από το αρχείο κεφαλίδας UART1, η εξήγηση του αρχείου κεφαλίδας μου έχει ως εξής.
Διαβάζοντας έναν χαρακτήρα από το Serial Monitor
Αυτή η λειτουργία βοηθά στην ανάγνωση ενός μόνο χαρακτήρα που έχει σταλεί στον μικροελεγκτή από τη σειριακή οθόνη.
char Serial_read_char (void) {ενώ (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); επιστροφή (UART1_ReceiveData8 ()); }
Περιμένουμε μέχρι να οριστεί η σημαία RXE για να ολοκληρωθεί η λήψη και στη συνέχεια να εκκαθαρίσουμε τη σημαία για να αναγνωρίσουμε τη λήψη. Τέλος, στέλνουμε τα ληφθέντα δεδομένα 8-bit ως αποτέλεσμα αυτής της λειτουργίας.
Εκτύπωση χαρακτήρα σε Serial Monitor
Αυτή η λειτουργία μεταδίδει έναν μόνο χαρακτήρα από έναν μικροελεγκτή στη σειριακή οθόνη.
void Serial_print_char (τιμή char) {UART1_SendData8 (τιμή); ενώ (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // περιμένετε να στείλετε}
Η συνάρτηση απλώς γράφει την τιμή 8-bit και περιμένει μέχρι να ολοκληρωθεί η μετάδοση ελέγχοντας το UART1_FLAG_TXE στο SET
Αρχικοποίηση σειριακής επικοινωνίας
Αυτή η λειτουργία αρχικοποιεί σειριακή επικοινωνία με τον απαιτούμενο ρυθμό baud.
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 (); // Απενεργοποίηση περιφερειακών 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 (ΕΝΕΡΓΟΠΟΙΗΣΗ); }
Εκτός από τον ρυθμό baud, υπάρχουν και άλλες παράμετροι που πρέπει να οριστούν για σειριακή επικοινωνία, όπως ο αριθμός των bit δεδομένων, ο αριθμός των bit διακοπής, η ισοτιμία κ.λπ. Το πιο συνηθισμένο (παρόμοιο με το Arduino) είναι τα δεδομένα 8-bit με ένα bit διακοπής και χωρίς ισοτιμία και ως εκ τούτου αυτό θα είναι η προεπιλεγμένη ρύθμιση. Μπορείτε να το αλλάξετε εάν απαιτείται.
Εκτύπωση ενός ακέραιου σε σειριακή οθόνη
Τις περισσότερες φορές, εάν χρησιμοποιούμε μια σειριακή οθόνη για εντοπισμό σφαλμάτων ή παρακολούθηση, ίσως θέλουμε να εκτυπώσουμε μια μεταβλητή τύπου int στη σειριακή οθόνη. Αυτή η λειτουργία κάνει ακριβώς αυτό
void Serial_print_int (int number) // Λειτουργία εκτύπωσης int value σε σειριακή οθόνη {char count = 0; char digit = ""; while (number! = 0) // διαχωρίστε τον πίνακα int σε char {digit = number% 10; μέτρηση ++; αριθμός = αριθμός / 10; } ενώ (count! = 0) // εκτυπώστε τη συστοιχία char στη σωστή κατεύθυνση {UART1_SendData8 (ψηφίο + 0x30); ενώ (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // περιμένετε να στείλετε το πλήθος--; }}
Παίρνει μια ακέραια τιμή και τη μετατρέπει σε πίνακα χαρακτήρων στο πρώτο while loop, στη συνέχεια στο δεύτερο while loop, θα στείλουμε καθέναν από τους χαρακτήρες παρόμοιοι με τη λειτουργία εκτύπωσης char.
Εκτύπωση νέας γραμμής
Αυτή είναι μια απλή λειτουργία για να εκτυπώσετε μια νέα γραμμή. Το hexvalue που πρέπει να κάνουμε είναι "0x0a", το στέλνουμε απλώς χρησιμοποιώντας την εντολή μετάδοσης 8-bit.
void Serial_newline (void) {UART1_SendData8 (0x0a); ενώ (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // περιμένετε να στείλετε}
Εκτύπωση συμβολοσειράς σε σειριακή οθόνη
Μια άλλη χρήσιμη λειτουργία είναι η εκτύπωση συμβολοσειρών στην σειριακή οθόνη.
void Serial_print_string (συμβολοσειρά char) {. char i = 0; ενώ (string! = 0x00) {UART1_SendData8 (string); ενώ (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Και πάλι, αυτή η λειτουργία μετατρέπει επίσης τη συμβολοσειρά σε πίνακα char και στέλνει κάθε χαρακτήρα. Όπως γνωρίζουμε, όλες οι χορδές τελειώνουν. Πρέπει λοιπόν να συνεχίσουμε να διασχίζουμε και να μεταδίδουμε τους χαρακτήρες μέχρι να φτάσουμε στο μηδέν 0x00.
Έλεγχος εάν τα σειριακά δεδομένα είναι διαθέσιμα για ανάγνωση
Αυτή η λειτουργία ελέγχει εάν υπάρχουν σειριακά δεδομένα στο buffer έτοιμο για ανάγνωση.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) επιστροφή TRUE; αλλιώς επιστρέψτε FALSE; }
Ελέγχει για τη σημαία UART1_FLAG_RXNE , εάν είναι αλήθεια, επιστρέφει true και αν δεν είναι, επιστρέφει false.