- Bazele comunicării UART
- Cerințe și configurare hardware
- Diagrama circuitului pentru comunicația Nuvoton N76E003 UART
- Pinii UART pe microcontrolerul Nuvoton N76E003
- Înregistrări UART în microcontroler Nuvoton N76E003
- Moduri de operare UART în N76E003
- Programarea Nuvoton N76E003 pentru comunicarea UART
UART reprezintă receptorul / transmițătorul asincron universal și este o caracteristică hardware utilă în orice unitate de microcontroler. Un microcontroler trebuie să primească date, să le proceseze și să le trimită către celelalte dispozitive. Există diferite tipuri de protocoale de comunicații disponibile în microcontroler, cu toate acestea, UART este cel mai utilizat printre celelalte protocoale de comunicații precum SPI și I2C. Dacă cineva trebuie să primească sau să transmită date în serie, UART este întotdeauna cea mai simplă și comună opțiune. Avantajul UART este că necesită doar două fire pentru a transmite date între dispozitive. Continuând cu Tutorialul nostru pentru microcontroler Nuvoton, în acest articol, vom învăța cum să realizăm comunicații seriale utilizând microcontrolerul N76E003.
Bazele comunicării UART
Acum, așa cum știm ce este UART, este important să cunoaștem parametrii asociați ai UART.
Două dispozitive UART primesc și transmit date la aceeași frecvență. Când dispozitivul UART de recepție detectează un bit de pornire, acesta începe să citească biții de intrare la o frecvență specifică cunoscută sub numele de rata de transmisie. Rata de transmisie este un lucru important pentru comunicarea UART și este utilizată pentru a măsura viteza de transfer de date în biți pe secundă (bps). Această viteză de transmisie și recepție trebuie să fie la aceeași viteză de transmisie. Diferența de viteză a vitezei de transmisie între UART-ul de transmisie și cea de recepție poate fi de aproximativ 10% înainte ca timpul de biți să fie prea departe. Cele mai populare viteze de viteză în baud sunt 4800, 9600, 115200 bps, etc. Anterior am folosit comunicarea UART și în multe alte microcontrolere, care sunt enumerate mai jos.
- Comunicare UART între ATmega8 și Arduino Uno
- Comunicare UART între două microcontrolere ATmega8
- Comunicare UART utilizând microcontrolere PIC
- Comunicare UART pe microcontroler STM8S
N76E003 are două UART - UART0 și UART1. În acest tutorial, vom utiliza perifericul UART pe unitatea de microcontroler N76E003. Fără a pierde mult timp, să evaluăm ce fel de configurare hardware avem nevoie pentru această aplicație.
Cerințe și configurare hardware
Componenta majoră care este necesară pentru acest proiect este modulul convertor USB în UART sau TTL care va face interfața necesară între PC sau laptop cu modulul de microcontroler. Pentru acest proiect, vom folosi modulul USB to UART bazat pe CP2102, care este prezentat mai jos.
Ca să nu mai vorbim, în afară de componenta de mai sus, avem nevoie de placa de dezvoltare bazată pe microcontroler N76E003, precum și de programatorul Nu-Link. O unitate de alimentare suplimentară de 5V poate fi necesară dacă programatorul nu este utilizat ca sursă de alimentare.
Diagrama circuitului pentru comunicația Nuvoton N76E003 UART
Așa cum putem vedea în schema de mai jos a plăcii de dezvoltare, al doilea și al treilea pin al unității de microcontroler sunt utilizate ca UART0 Tx și respectiv Rx. În extrema stângă, este afișată conexiunea interfeței de programare.
Pinii UART pe microcontrolerul Nuvoton N76E003
N76E003 are 20 de pini, dintre care 4 pini pot fi utilizați pentru comunicarea UART. Imaginea de mai jos prezintă pinii UART evidențiați într-o casetă pătrată roșie (Rx) și casetă pătrată albastră (Tx).
Pentru UART0, pinii 2 și 3 sunt utilizați pentru comunicarea UART, iar pentru UART1, pinul 8 și pinul 18 sunt folosiți pentru comunicare.
Înregistrări UART în microcontroler Nuvoton N76E003
N76E003 are două UART full-duplex îmbunătățite cu recunoaștere automată a adreselor și detectarea erorilor de încadrare - UART0 și UART1. Aceste două UART-uri sunt controlate folosind registre clasificate în două UART-uri diferite. Există două perechi de pini RX și TX disponibile în N76E003 pentru operațiuni UART. Astfel, primul pas este să selectați portul UART dorit pentru operațiuni.
În acest tutorial, vom utiliza UART0, astfel configurația va fi afișată numai pentru UART0. UART1 va avea aceeași configurație, dar registrele vor fi diferite.
După selectarea unui UART (UART0 în acest caz), pinii I / O necesari pentru comunicarea RX și TX trebuie să fie configurați ca intrare și ieșire. Pinul RX al UART0 este pinul 3 al microcontrolerului care este portul 0.7. Deoarece acesta este un pin serial de recepție a portului, este necesar ca portul 0.7 să fie setat ca intrare. Pe de altă parte, portul 0.6, care este al doilea pin al microcontrolerului, este un pin de transmisie sau pin de ieșire. Trebuie setat ca un mod aproape bidirecțional. Acestea pot fi selectate folosind registrul PxM1 și PxM2. Aceste două registre stabilesc modurile I / O unde x reprezintă numărul portului (de exemplu, portul P1.0, registrul va fi P1M1 și P1M2, pentru P3.0 va fi P3M1 și P3M2 etc.) să fie văzut în imaginea de mai jos-
Moduri de operare UART în N76E003
Apoi, următorul pas este de a determina modul de operații UART. Cele două UART-uri ar putea funcționa în 4 moduri. Modurile sunt-
După cum putem vedea, SM0 și SM1 (al 7-lea și al 6-lea bit de registru SCON) selectează modul operațiunilor UART. Modul 0 este operația sincronă, iar celelalte trei moduri sunt operații asincrone. Cu toate acestea, generatorul Baud Rate și biții Frame sunt diferiți pentru fiecare mod de port serial. Oricare dintre moduri poate fi selectat conform cerințelor aplicației și acesta este același și pentru UART1. Pentru acest tutorial, se utilizează o operațiune de 10 biți cu rata de depășire a timerului 3 împărțită la 32 sau 16.
Acum, este timpul să obțineți informații și să configurați registrul SCON (SCON_1 pentru UART1) pentru UART0.
Al șaselea și al șaptelea bit vor seta modul UART așa cum am discutat anterior. Bitul 5 este utilizat pentru a seta modul de comunicare multiprocesor pentru a activa opțiunile. Cu toate acestea, procesul depinde de modul selectat UART. În afară de acestea, bitul REN va fi setat la 1 pentru a permite recepția, iar semnalizatorul TI va fi setat la 1 pentru funcția printf care va fi utilizată în locul funcției de transmisie UART0 personalizate.
Următorul registru important este registrul de control al puterii (PCON) (Timer 3 bit 7 și 6 pentru UART1). Dacă nu sunteți începători cu temporizatoarele, consultați tutorialul Nuvoton N76E003 Timer pentru a înțelege cum să utilizați temporizatoarele pe microcontrolerul N76E003.
Bitul SMOD este important pentru a selecta rata dublă baud în modul UART0 1. Acum, deoarece folosim temporizatorul 3, trebuie configurat registrul de control Timer 3 T3CON. Cu toate acestea, bitul 7 și 6 sunt rezervate pentru setarea dublă a ratei de date pentru UART1.
Și valoarea pre-scaler Timer 3-
Cel de-al 5-lea bit BRCK va seta temporizatorul 3 ca sursă de ceas de viteză baud pentru UART1. Acum, fișei tehnice a N76E003 primește formula pentru calcularea ratei Baud dorite, precum și valoarea setată a eșantionului pentru registrele Timer 3 (16 biți) High și Low.
Valoarea eșantionului pentru sursa de ceas de 16 Mhz-
Astfel, rata de transmisie trebuie să fie configurată în registrul Timer 3 folosind formula de mai sus. Pentru cazul nostru, va fi Formula 4. După aceea, pornirea Temporizatorului 3 prin setarea registrului TR3 la 1 va termina Temporizatorul de inițializare UART0 3. Pentru a primi și a trimite datele UART0 pentru a utiliza registrul de mai jos-
Registrul SBUF este configurat automat pentru Primire și Transmitere. Pentru a primi date de la UART, așteptați ca semnalizatorul RI să fie setat 1 și citiți registrul SBUF și să trimiteți datele către UART0, trimiteți datele către SBUF și așteptați ca semnalizatorul TI să obțină 1 pentru a confirma transmiterea cu succes a datelor.
Programarea Nuvoton N76E003 pentru comunicarea UART
Partea de codare este simplă, iar codul complet utilizat în acest tutorial poate fi găsit în partea de jos a acestei pagini. Explicația codului este după cum urmează, UART0 este inițializat la 9600 baud rate folosind declarația din funcția principală-
InitialUART0_Timer3 (9600);
Funcția de mai sus este definită în fișierul common.c și configurează UART0 cu Timer 3 ca sursă de viteză în baud, în modul 1 și cu o rată de baud de 9600. Definiția funcției este următoarea-
void InitialUART0_Timer3 (UINT32 u32Baudrate) // utilizați timer3 ca generator Baudrate { P06_Quasi_Mode; // Setarea pinului UART ca mod Quasi pentru transmiterea P07_Input_Mode; // Setarea pinului UART ca mod de intrare pentru primirea 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; // UART0 baud rate clock source = 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; // Trigger Timer3 set_TI; // Pentru funcția printf trebuie să setați TI = 1 }
Declarația se face pas cu pas, așa cum am discutat anterior, iar registrele sunt configurate în consecință. Cu toate acestea, în biblioteca BSP a N76E003, există un bug care este în loc de P07_Input_Mode; există P07_Quasi_Mode . Din acest motiv, funcția UART Receive nu va funcționa.
Rata Baud este, de asemenea, configurată conform intrării ratei Baud și utilizând formula dată de fișa tehnică. Acum, în funcția principală sau în bucla while , se folosește funcția printf. Pentru a utiliza funcția printf , TI trebuie setat ca 1. În afară de aceasta, în bucla while , se utilizează o carcasă de comutare și, conform datelor UART primite, valoarea este tipărită.
while (1) { printf ("\ r \ nApăsați 1 sau apăsați 2 sau apăsați 3 sau apăsați 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("se apasă \ r \ n1"); pauză; caz '2': printf ("se apasă \ r \ n2"); pauză; caz '3': printf ("se apasă \ r \ n3"); pauză; cazul '4': printf ("se apasă \ r \ n4"); pauză; implicit: printf ("\ r \ nTastă greșită apăsată"); } Timer0_Delay1ms (300); } }
Ei bine, pentru UART0 primiți Receive_Data_From_UART0 (); este utilizată funcția. De asemenea, este definit în biblioteca common.c .
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; while (! RI); c = SBUF; RI = 0; return (c); }
Va aștepta ca steagul RI să obțină 1 și să returneze datele de primire folosind variabila c.
Clipește codul și ieșirea
Codul a returnat 0 avertisment și 0 erori și a clipit folosind metoda intermitentă implicită de Keil. Dacă nu sunteți sigur cum să compilați și să încărcați codul, consultați articolul introductiv cu nuvoton. Rândurile de mai jos confirmă faptul că codul nostru a fost încărcat cu succes.
Reconstruirea a început: Proiect: printf_UART0 Reconstruirea țintei „GPIO” compilând PUTCHAR.C… compilând Print_UART0.C… compilând Delay.c… compilând Common.c… asamblând STARTUP.A51… conectând… Dimensiune program: date = 54,2 xdata = 0 cod = 2341 crearea fișierului hex din ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Eroare, 0 Avertisment (e). Timp de construire scurs: 00:00:02 Încărcați "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Flash Erase Done. Scriere flash realizată: 2341 de octeți programați. Bliț verificat finalizat: 2341 octeți verificați. Flash Load s-a terminat la 15:48:08
Placa de dezvoltare este conectată la sursa de alimentare prin programator și laptop folosind modulul USB la UART. Pentru a afișa sau a trimite datele UART, este necesar un software de monitorizare serial. Folosesc termenul tera pentru acest proces.
După cum puteți vedea în imaginea de mai jos, am reușit să afișez șirurile trimise de controlerul nostru nuvoton și să le afișez pe software-ul monitorului serial. De asemenea, a fost capabil să citească valorile de pe monitorul serial.
Puteți consulta videoclipul legat mai jos pentru demonstrația completă a acestui tutorial. Sper că ți-a plăcut articolul și ai învățat ceva util. Dacă aveți întrebări, le puteți lăsa în secțiunea de comentarii de mai jos sau puteți folosi forumurile noastre pentru a posta alte întrebări tehnice.