- Grunnleggende om UART-kommunikasjon
- Maskinvarekrav og oppsett
- Kretsdiagram for Nuvoton N76E003 UART-kommunikasjon
- UART Pins på Nuvoton N76E003 Microcontroller
- UART registrerer seg i Nuvoton N76E003 mikrokontroller
- UART-driftsmodi i N76E003
- Programmering av Nuvoton N76E003 for UART-kommunikasjon
UART står for Universal Asynchronous Receiver / Transmitter, og det er en nyttig maskinvarefunksjon i en hvilken som helst mikrokontrollerenhet. En mikrokontroller må motta data, behandle den og sende den til de andre enhetene. Det er forskjellige typer kommunikasjonsprotokoller tilgjengelig i mikrokontrolleren, men UART er den mest brukte blant de andre kommunikasjonsprotokollene som SPI og I2C. Hvis noen trenger å motta eller overføre data serielt, er UART alltid det enkleste og vanligste alternativet. Fordelen med UART er at det bare krever to ledninger for å overføre data mellom enheter. Fortsetter med vår Nuvoton Microcontroller Tutorial, i denne artikkelen, vil vi lære hvordan du utfører seriell kommunikasjon ved hjelp av N76E003 mikrokontroller.
Grunnleggende om UART-kommunikasjon
Nå som vi vet hva UART er, er det viktig å kjenne de tilknyttede parametrene til UART.
To UART-enheter mottar og overfører data med samme frekvens. Når den mottakende UART-enheten oppdager en startbit, begynner den å lese de innkommende bitene med en bestemt frekvens kjent som baudrate. Baudrate er en viktig ting for UART-kommunikasjon, og den brukes til å måle hastigheten på dataoverføring i bits per sekund (bps). Denne overføringshastigheten, for overføring og mottak, må være på samme overføringshastighet. Overføringshastighetsforskjellen mellom sendende og mottakende UART-er kan bare være omtrent 10% før timingen av biter blir for langt unna. De mest populære overføringshastighetene er 4800, 9600, 115200 bps, etc. Tidligere har vi brukt UART-kommunikasjon i mange andre mikrokontrollere også som er oppført nedenfor.
- UART-kommunikasjon mellom ATmega8 og Arduino Uno
- UART-kommunikasjon mellom to ATmega8 mikrokontrollere
- UART-kommunikasjon ved bruk av PIC Microcontrollers
- UART-kommunikasjon på STM8S mikrokontroller
N76E003 har to UART-er - UART0 og UART1. I denne opplæringen vil vi bruke UART-periferienheten på N76E003 mikrokontrollerenhet. Uten å kaste bort mye tid, la oss evaluere hva slags maskinvareoppsett vi trenger for dette programmet.
Maskinvarekrav og oppsett
Hovedkomponenten som kreves for dette prosjektet er USB til UART- eller TTL-omformermodulen som gjør grensesnittet som kreves mellom PCen og den bærbare datamaskinen og mikrokontrollermodulen. For dette prosjektet vil vi bruke CP2102- basert USB til UART-modul som er vist nedenfor.
For ikke å nevne, bortsett fra ovennevnte komponent, trenger vi N76E003 mikrokontrollerbasert utviklingskort samt Nu-Link programmerer. En ekstra 5V strømforsyningsenhet kan være nødvendig hvis programmereren ikke brukes som strømkilde.
Kretsdiagram for Nuvoton N76E003 UART-kommunikasjon
Som vi kan se i skjematisk utviklingskort, brukes den andre og tredje pinnen til mikrokontrollerenheten som henholdsvis UART0 Tx og Rx. Ytterst til venstre vises programmeringsgrensesnittforbindelsen.
UART Pins på Nuvoton N76E003 Microcontroller
N76E003 har 20 pinner, hvorav 4 pinner kan brukes til UART-kommunikasjon. Bildet nedenfor viser UART-pinnene uthevet i en rød firkantet boks (Rx) og Blå firkantet boks (Tx).
For UART0 brukes pin 2 og 3 til UART-kommunikasjon, og for UART1 brukes pin 8 og pin 18 til kommunikasjon.
UART registrerer seg i Nuvoton N76E003 mikrokontroller
N76E003 har to forbedrede full-dupleks UART-er med automatisk adressegjenkjenning og innramming av feilregistrering - UART0 og UART1. Disse to UART-ene styres ved hjelp av registre kategorisert i to forskjellige UART-er. Det er to par RX- og TX-pinner tilgjengelig i N76E003 for UART-operasjoner. Dermed er det første trinnet å velge ønsket UART-port for operasjoner.
I denne opplæringen vil vi bruke UART0, og konfigurasjonen vil derfor bare vises for UART0. UART1 vil ha samme konfigurasjon, men registrene vil være forskjellige.
Etter at du har valgt en UART (UART0 i dette tilfellet), må I / O-pinnene som skal brukes til RX- og TX-kommunikasjon konfigureres som inngang og utgang. RX-pinnen til UART0 er pinne 3 til mikrokontrolleren som er port 0.7. Ettersom dette er en seriell portmottakepinne, må Port 0.7 settes som inngang. På den annen side er Port 0.6, som er den andre pinnen til mikrokontrolleren, en sendepinne eller utgangspinne. Det må settes som en kvasi toveis modus. Disse kan velges ved hjelp av PxM1 og PxM2-registeret. Disse to registerene setter I / O-modusene der x står for portnummeret (for eksempel port P1.0 vil registeret være P1M1 og P1M2, for P3.0 vil det være P3M1 og P3M2 osv.) Konfigurasjonen kan ses i bildet nedenfor-
UART-driftsmodi i N76E003
Deretter er neste trinn å bestemme modusen for UART-operasjoner. De to UART-ene kunne fungere i fire moduser. Modusene er-
Som vi kan se, velger SM0 og SM1 (7. og 6. bit av SCON-register) modusen for UART-operasjoner. Modus 0 er den synkrone operasjonen, og de andre tre modusene er asynkrone operasjoner. Imidlertid baudhastighet generatoren og de Ramme bitene er forskjellig for hver seriell port modus. Alle modusene kan velges i henhold til applikasjonskravet, og dette er det samme for UART1 også. I denne opplæringen brukes 10 bits operasjon med overløpshastighet for tidtaker 3 delt på 32 eller 16.
Nå er det på tide å få informasjon og konfigurere SCON-registeret (SCON_1 for UART1) for UART0.
Den 6. og 7. bit vil sette UART-modus som diskutert tidligere. Bit 5 brukes til å angi kommunikasjonsmodus for flere prosessorer for å aktivere alternativer. Prosessen er imidlertid avhengig av hvilken UART-modus som er valgt. Annet enn disse, vil REN-biten settes til 1 for å muliggjøre mottak, og TI-flagget vil bli satt til 1 for at printf- funksjonen skal brukes i stedet for den tilpassede UART0-sendefunksjonen.
Det neste viktige registeret er Power Control Register (PCON) (Timer 3 bit 7 and 6 for UART1) register. Hvis du er nybegynner for timere, kan du sjekke ut Nuvoton N76E003 Timer-opplæringen for å forstå hvordan du bruker timere på N76E003 Microcontroller.
SMOD-biten er viktig for å velge dobbel baudrate i UART0-modus 1. Nå som vi bruker timeren 3, må Timer 3-kontrollregistret T3CON konfigureres. Imidlertid er bit 7. og 6. reservert for innstilling av dobbel datahastighet for UART1.
Og Timer 3 pre-scaler-verdien -
Den femte biten BRCK vil sette Timer 3 som kildekilde for overføringshastighet for UART1. Nå får databladet til N76E003 formelen for beregning av ønsket baudhastighet, samt prøvesettverdi for Timer 3 (16-bits) høye og lave register.
Eksempelverdi for 16 MHz klokkekilde-
Dermed må overføringshastigheten konfigureres i Timer 3-registeret ved hjelp av formelen ovenfor. For vårt tilfelle vil det være formelen 4. Etter det starter Timer 3 ved å sette TR3-registeret til 1 UART0 Initialisering Timer 3. For å motta og sende UART0-dataene for å bruke registret nedenfor-
Den SBUF registeret blir automatisk konfigurert for å motta og sende. For å motta data fra UART, vent til RI-flagget setter 1 og les SBUF-registeret og send dataene til UART0, send dataene til SBUF og vent til TI-flagget får 1 for å bekrefte vellykket dataoverføring.
Programmering av Nuvoton N76E003 for UART-kommunikasjon
Kodingsdelen er enkel, og den komplette koden som brukes i denne veiledningen, finner du nederst på denne siden. Forklaringen på koden er som følger, UART0 initialiseres til 9600 baudhastigheter ved å bruke setningen i hovedfunksjonen-
InitialUART0_Timer3 (9600);
Ovennevnte funksjon er definert i common.c- filen, og den konfigurerer UART0 med Timer 3 som baudrate-kilde, i modus 1, og med en baud rate på 9600. Funksjonsdefinisjonen er som følger-
ugyldig InitialUART0_Timer3 (UINT32 u32Baudrate) // bruk timer3 som Baudrate generator { P06_Quasi_Mode; // Angi UART-pin som kvasi-modus for overføring av P07_Input_Mode; // Angi UART-stift som inngangsmodus for mottak 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; // For printf-funksjonen må innstillingen TI = 1 }
Erklæringen utføres trinnvis som diskutert tidligere, og registrene konfigureres deretter. I BSP-biblioteket til N76E003 er det imidlertid en feil som er i stedet for P07_Input_Mode; det er P07_Quasi_Mode . På grunn av dette fungerer ikke UART-mottaksfunksjonen.
Baudrate er også konfigurert i henhold til baud rate input og ved hjelp av formelen gitt av databladet. Nå, i hovedfunksjonen eller mens løkken brukes printf-funksjonen. For å bruke printf- funksjonen, må TI stilles til 1. Annet enn dette, i mens sløyfen , brukes et bryterveske, og i henhold til mottatt UART-data blir verdien skrevet ut.
mens (1) { printf ("\ r \ nTrykk 1 eller trykk 2 eller trykk 3 eller trykk 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 er trykket"); gå i stykker; tilfelle '2': printf ("\ r \ n2 trykkes"); gå i stykker; tilfelle '3': printf ("\ r \ n3 trykkes"); gå i stykker; tilfelle '4': printf ("\ r \ n4 trykkes"); gå i stykker; standard: printf ("\ r \ n Feil tast trykket"); } Timer0_Delay1ms (300); } }
Vel, for UART0 motta Receive_Data_From_UART0 (); funksjonen brukes. Det er også definert i common.c- biblioteket.
UINT8 Receive_Data_From_UART0 (ugyldig) { UINT8 c; mens (! RI); c = SBUF; RI = 0; retur (c); }
Det vil vente på at RI-flagget får 1 og returnerer mottaksdataene ved hjelp av variabelen c.
Blinker koden og utdataene
Koden returnerte 0 advarsler og 0 feil og blinket ved hjelp av standard blinkemetode av Keil. Hvis du ikke er sikker på hvordan du skal kompilere og laste opp kode, kan du sjekke artikkelen om å komme i gang med nuvoton. Linjene nedenfor bekrefter at koden vår er lastet opp.
Ombygging startet: Prosjekt: printf_UART0 Gjenopprett mål 'GPIO' som kompilerer PUTCHAR.C… kompilerer Print_UART0.C… kompilerer Delay.c… kompilerer Common.c… montering STARTUP.A51… lenker… Programstørrelse: data = 54,2 xdata = 0 kode = 2341 og oppretter heksefil fra ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Feil (er), 0 Advarsel (er). Bygget tid forløpt: 00:00:02 Last "G: \\ n76E003 \\ programvare \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Flash Erase Done. Flash Skriv ut: 2341 byte programmert. Flash-bekreftelse utført: 2341 byte bekreftet. Flash Load avsluttet klokken 15:48:08
Utviklingskortet er koblet til strømkilden gjennom programmereren og den bærbare datamaskinen ved hjelp av USB til UART-modulen. For å vise eller sende UART-data kreves det en programvare for seriell skjerm. Jeg bruker terabegrepet for denne prosessen.
Som du kan se på bildet nedenfor, var jeg i stand til å vise strengene som ble sendt fra vår nuvoton-kontroller og vise den på den serielle skjermprogramvaren. Kunne også lese verdier fra seriell skjerm.
Du kan sjekke ut videoen som er lenket nedenfor for å få en fullstendig demonstrasjon av denne veiledningen. Håper du likte artikkelen og lærte noe nyttig. Hvis du har spørsmål, kan du legge dem igjen i kommentarfeltet nedenfor eller bruke forumene våre til å legge ut andre tekniske spørsmål.