- Podstawy komunikacji UART
- Wymagania sprzętowe i konfiguracja
- Schemat obwodu komunikacji Nuvoton N76E003 UART
- Piny UART na mikrokontrolerze Nuvoton N76E003
- Rejestry UART w mikrokontrolerze Nuvoton N76E003
- Tryby pracy UART w N76E003
- Programowanie Nuvoton N76E003 do komunikacji UART
UART to skrót od Universal Asynchronous Receiver / Transmitter i jest to przydatna funkcja sprzętowa w każdym mikrokontrolerze. Mikrokontroler musi odbierać dane, przetwarzać je i wysyłać do innych urządzeń. W mikrokontrolerze dostępne są różne typy protokołów komunikacyjnych, jednak najczęściej używanym spośród innych protokołów komunikacyjnych, takich jak SPI i I2C, jest UART. Jeśli ktoś potrzebuje odbierać lub przesyłać dane szeregowo, UART jest zawsze najprostszą i powszechną opcją. Zaletą UART jest to, że wymaga tylko dwóch przewodów do przesyłania danych między urządzeniami. Kontynuując nasz samouczek dotyczący mikrokontrolera Nuvoton, w tym artykule dowiemy się, jak wykonać komunikację szeregową za pomocą mikrokontrolera N76E003.
Podstawy komunikacji UART
Teraz, kiedy wiemy, czym jest UART, ważne jest, aby znać powiązane parametry UART.
Dwa urządzenia UART odbierają i przesyłają dane na tej samej częstotliwości. Gdy urządzenie odbierające UART wykryje bit startowy, zaczyna odczytywać przychodzące bity z określoną częstotliwością, znaną jako szybkość transmisji. Szybkość transmisji jest ważną rzeczą dla komunikacji UART i służy do pomiaru szybkości przesyłania danych w bitach na sekundę (bps). Ta prędkość transmisji dla nadawania i odbioru musi być taka sama. Różnica szybkości transmisji między nadawczym i odbiorczym UART może wynosić tylko około 10%, zanim taktowanie bitów stanie się zbyt odległe. Najpopularniejsze prędkości transmisji to 4800, 9600, 115200 bps, itd. Wcześniej używaliśmy komunikacji UART w wielu innych mikrokontrolerach, które są wymienione poniżej.
- Komunikacja UART pomiędzy ATmega8 i Arduino Uno
- Komunikacja UART między dwoma mikrokontrolerami ATmega8
- Komunikacja UART za pomocą mikrokontrolerów PIC
- Komunikacja UART na mikrokontrolerze STM8S
N76E003 ma dwa UART - UART0 i UART1. W tym samouczku użyjemy urządzenia peryferyjnego UART na jednostce mikrokontrolera N76E003. Nie tracąc dużo czasu, oceńmy, jakiego rodzaju konfiguracji sprzętowej potrzebujemy dla tej aplikacji.
Wymagania sprzętowe i konfiguracja
Głównym komponentem wymaganym w tym projekcie jest moduł konwertera USB na UART lub TTL, który zapewni interfejs wymagany między komputerem PC lub laptopem a modułem mikrokontrolera. W tym projekcie użyjemy modułu USB do UART opartego na CP2102, który pokazano poniżej.
Nie wspominając o tym, że oprócz powyższego komponentu potrzebujemy płyty rozwojowej opartej na mikrokontrolerze N76E003, a także programatora Nu-Link. Dodatkowy zasilacz 5 V może być wymagany, jeśli programator nie jest używany jako źródło zasilania.
Schemat obwodu komunikacji Nuvoton N76E003 UART
Jak widać na poniższym schemacie płytki rozwojowej, drugi i trzeci pin mikrokontrolera jest używany odpowiednio jako UART0 Tx i Rx. Po lewej stronie pokazane jest połączenie interfejsu programowania.
Piny UART na mikrokontrolerze Nuvoton N76E003
N76E003 ma 20 pinów, z których 4 można wykorzystać do komunikacji UART. Poniższy obraz pokazuje piny UART podświetlone w czerwonym kwadratowym pudełku (Rx) i niebieskim kwadratowym polu (Tx).
W przypadku UART0 styki 2 i 3 służą do komunikacji UART, a w przypadku UART1 styki 8 i 18 służą do komunikacji.
Rejestry UART w mikrokontrolerze Nuvoton N76E003
N76E003 ma dwa ulepszone UART z pełnym dupleksem z automatycznym rozpoznawaniem adresu i wykrywaniem błędów ramkowania - UART0 i UART1. Te dwa UART są sterowane za pomocą rejestrów podzielonych na dwa różne UART. W N76E003 dostępne są dwie pary pinów RX i TX do operacji UART. Dlatego pierwszym krokiem jest wybranie odpowiedniego portu UART do operacji.
W tym samouczku użyjemy UART0, więc konfiguracja zostanie pokazana tylko dla UART0. UART1 będzie miał taką samą konfigurację, ale rejestry będą inne.
Po wybraniu jednego UART (w tym przypadku UART0), piny I / O, które są potrzebne do komunikacji RX i TX, należy skonfigurować jako wejście i wyjście. Pin RX UART0 to pin 3 mikrokontrolera, czyli Port 0.7. Ponieważ jest to pin odbiorczy portu szeregowego, port 0.7 musi być ustawiony jako wejście. Z drugiej strony, Port 0.6, który jest drugim pinem mikrokontrolera, jest pinem nadawczym lub pinem wyjściowym. Musi być ustawiony jako tryb quasi dwukierunkowy. Można je wybrać za pomocą rejestru PxM1 i PxM2. Te dwa rejestry ustawiają tryby I / O, gdzie x oznacza numer portu (na przykład Port P1.0 rejestr będzie miał P1M1 i P1M2, dla P3.0 będzie to P3M1 i P3M2 itd.). widać na poniższym obrazku-
Tryby pracy UART w N76E003
Następnie kolejnym krokiem jest ustalenie trybu pracy UART. Dwa układy UART mogą działać w 4 trybach. Tryby to-
Jak widać, SM0 i SM1 (7 i 6 bit rejestru SCON) wybierają tryb pracy UART. Tryb 0 to operacja synchroniczna, a pozostałe trzy tryby to operacje asynchroniczne. Jednak generator szybkości transmisji i bity ramki są różne dla każdego trybu portu szeregowego. Każdy z trybów może zostać wybrany zgodnie z wymaganiami aplikacji i to samo dotyczy również UART1. W tym samouczku zastosowano operację na 10 bitach z szybkością przepełnienia timera 3 podzieloną przez 32 lub 16.
Teraz nadszedł czas, aby uzyskać informacje i skonfigurować rejestr SCON (SCON_1 dla UART1) dla UART0.
Szósty i siódmy bit ustawią tryb UART, jak omówiono wcześniej. Bit 5 służy do ustawiania trybu komunikacji wieloprocesorowej w celu włączenia opcji. Jednak proces zależy od wybranego trybu UART. Poza tym bit REN zostanie ustawiony na 1, aby umożliwić odbiór, a flaga TI zostanie ustawiona na 1, aby funkcja printf była używana zamiast niestandardowej funkcji nadawania UART0.
Kolejnym ważnym rejestrem jest rejestr kontroli mocy (PCON) (zegar 3, bity 7 i 6 dla UART1). Jeśli nie znasz timerów, zapoznaj się z samouczkiem Nuvoton N76E003 Timer, aby zrozumieć, jak używać timerów w mikrokontrolerze N76E003.
Bit SMOD jest ważny dla wybrania podwójnej szybkości transmisji w trybie UART0 1. Teraz, ponieważ używamy timera 3, należy skonfigurować rejestr sterujący timera 3 T3CON. Jednak bity 7 i 6 są zarezerwowane dla ustawienia podwójnej szybkości transmisji danych dla UART1.
Wartość wstępnego skalowania Timera 3
Piąty bit BRCK ustawi Timer 3 jako źródło zegara szybkości transmisji dla UART1. Teraz arkusz danych N76E003 zawiera wzór do obliczania żądanej szybkości transmisji, a także ustawionej wartości próbki dla rejestrów High i Low Timera 3 (16-bitowe).
Przykładowa wartość dla źródła zegara 16 MHz
Zatem szybkość transmisji musi być skonfigurowana w rejestrze Timera 3 przy użyciu powyższego wzoru. W naszym przypadku będzie to wzór 4. Następnie uruchomienie Timera 3 poprzez ustawienie rejestru TR3 na 1 zakończy działanie Timera inicjalizacji UART0 3. Aby odebrać i wysłać dane UART0 do wykorzystania poniższego rejestru:
Rejestr SBUF automatycznie zostanie skonfigurowany do odbioru i nadawania. Aby odebrać dane z UART, należy poczekać, aż flaga RI ustawi 1, odczytać rejestr SBUF i wysłać dane do UART0, wysłać dane do SBUF i poczekać, aż flaga TI otrzyma 1, aby potwierdzić udaną transmisję danych.
Programowanie Nuvoton N76E003 do komunikacji UART
Część dotycząca kodowania jest prosta, a pełny kod użyty w tym samouczku można znaleźć na dole tej strony. Objaśnienie kodu jest następujące: UART0 jest inicjowany z szybkością 9600 bodów za pomocą instrukcji w funkcji głównej -
InitialUART0_Timer3 (9600);
Powyższa funkcja jest zdefiniowana w pliku common.c i konfiguruje UART0 z Timerem 3 jako źródłem szybkości transmisji, w trybie 1 i z szybkością transmisji 9600. Definicja funkcji jest następująca:
void InitialUART0_Timer3 (UINT32 u32Baudrate) // użyj timera3 jako generatora szybkości transmisji { P06_Quasi_Mode; // Ustawienie pinu UART jako trybu quasi dla transmisji P07_Input_Mode; // Ustawienie pinu UART jako trybu wejściowego dla odbioru SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate Enable T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // źródło zegara szybkości transmisji UART0 = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); /* 16,6 MHz * / #endif set_TR3; // Wyzwalacz Timer3 set_TI; // Dla funkcji printf należy ustawić TI = 1 }
Deklaracja jest wykonywana krok po kroku, jak omówiono wcześniej, a rejestry są odpowiednio konfigurowane. Jednak w bibliotece BSP N76E003 występuje błąd, który występuje zamiast P07_Input_Mode; jest P07_Quasi_Mode . Z tego powodu funkcja odbioru UART nie będzie działać.
Szybkość transmisji jest również konfigurowana zgodnie z wprowadzoną szybkością transmisji i przy użyciu wzoru podanego w arkuszu danych. Teraz w funkcji main lub pętli while używana jest funkcja printf. Aby użyć funkcji printf , TI należy ustawić na 1. Poza tym w pętli while używana jest obudowa przełącznika i zgodnie z odebranymi danymi UART wartość jest drukowana.
while (1) { printf ("\ r \ nNaciśnij 1 lub Naciśnij 2 lub Naciśnij 3 lub Naciśnij 4"); oper = Receive_Data_From_UART0 (); przełącznik (oper) { przypadek '1': printf ("\ r \ n1 jest wciśnięty"); przerwa; przypadek '2': printf ("naciśnięto \ r \ n2"); przerwa; przypadek '3': printf ("naciśnięto \ r \ n3"); przerwa; przypadek '4': printf ("naciśnięto \ r \ n4"); przerwa; domyślnie: printf ("\ r \ nWciśnięto zły klawisz"); } Timer0_Delay1ms (300); } }
Cóż, dla UART0 otrzymaj Receive_Data_From_UART0 (); funkcja jest używana. Jest również zdefiniowany w bibliotece common.c .
UINT8 Receive_Data_From_UART0 (nieważne) { UINT8 c; podczas gdy (! RI); c = SBUF; RI = 0; return (c); }
Będzie czekać, aż flaga RI otrzyma 1 i zwróci odebrane dane za pomocą zmiennej c.
Miga kod i wyjście
Kod zwrócił 0 ostrzeżeń i 0 błędów i błysnął przy użyciu domyślnej metody flashowania przez Keil. Jeśli nie masz pewności, jak skompilować i przesłać kod, zapoznaj się z artykułem nuvoton rozpoczynającym pracę. Poniższe wiersze potwierdzają, że nasz kod został pomyślnie przesłany.
Przebudowa rozpoczęta: Projekt: printf_UART0 Przebuduj cel 'GPIO' kompilowanie PUTCHAR.C… kompilowanie Print_UART0.C… kompilowanie Delay.c… kompilowanie Common.c… asemblowanie STARTUP.A51… łączenie… Rozmiar programu: data = 54,2 xdata = 0 code = 2341 tworzenie pliku hex z ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 błędów, 0 ostrzeżeń. Czas kompilacji, który upłynął: 00:00:02 Załaduj „G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Przykładowy_kod \\ UART0_Printf \\ Wyjście \\ Printf_UART1” Kasowanie pamięci flash zakończone . Wykonano zapis flashowy: zaprogramowano 2341 bajtów. Flash Verify Gotowe: zweryfikowano 2341 bajtów. Ładowanie Flash zakończyło się o godzinie 15:48:08
Płytka rozwojowa jest podłączona do źródła zasilania przez programator i laptop za pomocą modułu USB do UART. Aby wyświetlić lub wysłać dane UART, wymagane jest oprogramowanie monitora szeregowego. Używam terminu tera dla tego procesu.
Jak widać na poniższym obrazku, udało mi się wyświetlić napisy wysłane z naszego kontrolera nuvoton i wyświetlić je w oprogramowaniu monitora szeregowego. Był również w stanie odczytać wartości z monitora szeregowego.
Możesz obejrzeć film, do którego link znajduje się poniżej, aby uzyskać pełną demonstrację tego samouczka. Mam nadzieję, że podobał Ci się artykuł i dowiedziałeś się czegoś przydatnego. Jeśli masz jakieś pytania, możesz je zostawić w sekcji komentarzy poniżej lub skorzystać z naszych forów, aby zadać inne pytania techniczne.