- Grunderna i UART-kommunikation
- Hårdvarukrav och installation
- Kretsschema för Nuvoton N76E003 UART-kommunikation
- UART-stift på Nuvoton N76E003 mikrokontroller
- UART registrerar sig i Nuvoton N76E003 Microcontroller
- UART-driftlägen i N76E003
- Programmering av Nuvoton N76E003 för UART-kommunikation
UART står för Universal Asynchronous Receiver / Transmitter och det är en användbar hårdvarufunktion i alla mikrokontroller. En mikrokontroller måste ta emot data, bearbeta den och skicka den till de andra enheterna. Det finns olika typer av kommunikationsprotokoll tillgängliga i mikrokontrollern, men UART är den mest använda bland de andra kommunikationsprotokollen som SPI och I2C. Om någon behöver ta emot eller överföra data seriellt är UART alltid det enklaste och vanligaste alternativet. Fördelen med UART är att det bara kräver två ledningar för att överföra data mellan enheter. Fortsätt med vår Nuvoton Microcontroller-handledning i den här artikeln kommer vi att lära oss hur man utför seriekommunikation med N76E003-mikrokontrollern.
Grunderna i UART-kommunikation
Nu, som vi vet vad UART är, är det viktigt att känna till de tillhörande parametrarna för UART.
Två UART-enheter tar emot och överför data med samma frekvens. När den mottagande UART-enheten detekterar en startbit börjar den läsa de inkommande bitarna med en specifik frekvens som kallas baudhastigheten. Baudhastighet är en viktig sak för UART-kommunikation och används för att mäta hastigheten för dataöverföring i bitar per sekund (bps). Denna överföringshastighet, för sändning och mottagning, måste ha samma överföringshastighet. Överföringshastighetsskillnaden mellan sändande och mottagande UART kan bara vara cirka 10% innan tidpunkten för bitar blir för långt borta. De mest populära överföringshastigheterna är 4800, 9600, 115200 bps, etc. Tidigare har vi använt UART-kommunikation i många andra mikrokontroller också som listas nedan.
- UART-kommunikation mellan ATmega8 och Arduino Uno
- UART-kommunikation mellan två ATmega8-mikrokontroller
- UART-kommunikation med PIC-mikrokontroller
- UART-kommunikation på STM8S mikrokontroller
N76E003 har två UARTs - UART0 och UART1. I denna handledning använder vi UART-kringutrustningen på N76E003-mikrokontroller. Utan att slösa bort mycket tid, låt oss utvärdera vilken typ av hårdvaruinstallation vi behöver för den här applikationen.
Hårdvarukrav och installation
Huvudkomponenten som krävs för detta projekt är USB till UART- eller TTL-omvandlarmodulen som gör gränssnittet som krävs mellan PC eller bärbar dator med mikrokontrollmodulen. För detta projekt använder vi CP2102- baserad USB till UART-modul som visas nedan.
För att inte nämna, förutom ovanstående komponent, behöver vi det N76E003 mikrokontrollerbaserade utvecklingskortet samt Nu-Link-programmeraren. Ytterligare en 5V strömförsörjningsenhet kan behövas om programmeraren inte används som strömkälla.
Kretsschema för Nuvoton N76E003 UART-kommunikation
Som vi kan se i nedanstående schema för utvecklingskort används den andra och tredje stiftet i mikrokontrollenheten som UART0 Tx respektive Rx. Längst till vänster visas programmeringsgränssnittsanslutningen.
UART-stift på Nuvoton N76E003 mikrokontroller
N76E003 har 20 stift varav 4 stift kan användas för UART-kommunikation. Bilden nedan visar UART-stiften markerade i en röd fyrkantig ruta (Rx) och Blå fyrkantig ruta (Tx).
För UART0 används stift 2 och 3 för UART-kommunikation, och för UART1 används stift 8 och stift 18 för kommunikation.
UART registrerar sig i Nuvoton N76E003 Microcontroller
N76E003 har två förbättrade full-duplex UART med automatisk adressigenkänning och inramningsfelsdetektering - UART0 och UART1. Dessa två UARTs styrs med hjälp av register som kategoriserats i två olika UARTs. Det finns två par RX- och TX-stift tillgängliga i N76E003 för UART-operationer. Således är det första steget att välja önskad UART-port för operationer.
I den här handledningen använder vi UART0, så konfigurationen visas endast för UART0. UART1 kommer att ha samma konfiguration men registren kommer att vara olika.
Efter att ha valt en UART (UART0 i det här fallet) måste de I / O-stift som behövs för RX- och TX-kommunikation konfigureras som in- och utgång. RX-stiftet på UART0 är stift 3 i mikrokontrollern som är Port 0.7. Eftersom detta är en seriell portmottagningsstift måste port 0.7 ställas in som ingång. Å andra sidan är Port 0.6, som är den andra stiftet på mikrokontrollern, en sändstift eller utgångsstift. Det måste ställas in som ett kvasi dubbelriktat läge. Dessa kan väljas med hjälp av PxM1 och PxM2-registret. Dessa två register ställer in I / O-lägen där x står för portnumret (till exempel Port P1.0 blir registret P1M1 och P1M2, för P3.0 blir det P3M1 och P3M2, etc.) Konfigurationen kan ses i bilden nedan-
UART-driftlägen i N76E003
Därefter är nästa steg att bestämma läget för UART-operationer. De två UART-enheterna kunde fungera i fyra lägen. Lägena är-
Som vi kan se väljer SM0 och SM1 (7: e och 6: e biten i SCON-registret) läget för UART-operationer. Läge 0 är den synkrona operationen och de andra tre lägena är asynkrona operationer. Emellertid den baudhastighet generatorn och Frame bitarna är olika för varje seriell port-läge. Vilket som helst av lägena kan väljas enligt applikationskrav och detta är detsamma för UART1 också. För denna handledning används 10 bitars operation med timer 3-överflödeshastighet dividerat med 32 eller 16.
Nu är det dags att få information och konfigurera SCON-registret (SCON_1 för UART1) för UART0.
Den sjätte och sjunde biten ställer in UART-läget som diskuterats tidigare. Bit 5 används för att ställa in kommunikationsläget för flera processorer för att aktivera alternativ. Processen är dock beroende av vilket UART-läge som väljs. Annat än dessa kommer REN-biten att ställas in på 1 för att möjliggöra mottagning och TI-flaggan kommer att ställas in på 1 för att printf- funktionen ska användas istället för en anpassad UART0-sändningsfunktion.
Nästa viktiga register är Power Control Register (PCON) (Timer 3 bit 7 och 6 för UART1) -registret. Om du är nybörjare i timers, kolla in Nuvoton N76E003 Timer-självstudien för att förstå hur man använder timers på N76E003 Microcontroller.
SMOD-biten är viktig för att välja dubbel baudhastighet i UART0-läge 1. Nu när vi använder timern 3 måste Timer 3-kontrollregistret T3CON konfigureras. Bit 7: e och 6: e är dock reserverade för inställningen för dubbel datahastighet för UART1.
Och Timer 3 förskalningsvärde-
Den femte biten BRCK ställer in Timer 3 som klockkälla för överföringshastighet för UART1. Nu får databladet för N76E003 formeln för beräkning av önskad Baud-hastighet samt provuppsättningsvärde för Timer 3 (16-bitars) höga och låga register.
Provvärde för 16 MHz klockkälla-
Således måste överföringshastigheten konfigureras i Timer 3-registret med ovanstående formel. För vårt fall blir det formeln 4. Efter det, startar du Timer 3 genom att ställa in TR3-registret till 1, avslutar UART0 Initialiseringstimern 3. För att ta emot och skicka UART0-data för att använda nedanstående register-
Den SBUF registret automatiskt blir konfigurerad för mottagning och sändning. För att ta emot data från UART väntar du på att RI-flaggan ska ställas in 1 och läser SBUF-registret och skickar data till UART0, skickar data till SBUF och väntar på att TI-flaggan får 1 för att bekräfta framgångsrik dataöverföring.
Programmering av Nuvoton N76E003 för UART-kommunikation
Kodningsdelen är enkel och den fullständiga koden som används i denna handledning finns längst ner på denna sida. Förklaringen av koden är som följer, UART0 initialiseras till 9600 baudhastigheter med hjälp av uttalandet i huvudfunktionen-
InitialUART0_Timer3 (9600);
Ovanstående funktion definieras i filen common.c och den konfigurerar UART0 med Timer 3 som överföringshastighetskälla, i läge 1 och med en överföringshastighet på 9600. Funktionsdefinitionen är som följer-
ogiltigt InitialUART0_Timer3 (UINT32 u32Baudrate) // använd timer3 som Baudrate generator { P06_Quasi_Mode; // Ställa in UART-stift som kvasi-läge för sändning av P07_Input_Mode; // Ställa in UART-stift som ingångsläge för mottagning 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 klockkälla för överföringshastighet = 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; // För printf-funktionen måste inställningen TI = 1 }
Deklarationen görs steg för steg som diskuterats tidigare och registren konfigureras därefter. Men i BSP-biblioteket i N76E003 finns det ett fel som är i stället för P07_Input_Mode; det finns P07_Quasi_Mode . På grund av detta fungerar inte UART-mottagningsfunktionen.
Överföringshastigheten konfigureras också enligt ingången för överföringshastighet och med hjälp av formeln i databladet. Nu, i huvudfunktionen eller medan loop används printf-funktionen. För att använda printf- funktionen, måste TI ställas in som 1. Förutom detta används i en slinga ett omkopplingsfodral och enligt den mottagna UART-informationen skrivs värdet ut.
medan (1) { printf ("\ r \ nTryck på 1 eller tryck på 2 eller tryck på 3 eller tryck på 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 trycks in"); ha sönder; fall '2': printf ("\ r \ n2 trycks in"); ha sönder; fall '3': printf ("\ r \ n3 trycks in"); ha sönder; fall '4': printf ("\ r \ n4 trycks in"); ha sönder; standard: printf ("\ r \ n Fel tangent tryckt"); } Timer0_Delay1ms (300); } }
Tja, för UART0 ta emot Receive_Data_From_UART0 (); funktionen används. Det definieras också i biblioteket common.c .
UINT8 Receive_Data_From_UART0 (ogiltigt) { UINT8 c; medan (! RI); c = SBUF; RI = 0; retur (c); }
Det väntar på att RI-flaggan får 1 och returnerar mottagningsdata med variabeln c.
Blinkar koden och utmatningen
Koden returnerade 0 varning och 0 fel och blinkade med standardblinkningsmetoden av Keil. Om du inte är säker på hur du kompilerar och laddar upp kod, kolla in artikeln om att komma igång med nuvoton. Nedanstående rader bekräftar att vår kod har laddats upp.
Ombyggnad startade: Projekt: printf_UART0 Bygg om mål 'GPIO' som kompilerar PUTCHAR.C… sammanställer Print_UART0.C… sammanställer Delay.c… sammanställer Common.c… monterar STARTUP.A51… länkar… Programstorlek: data = 54,2 xdata = 0 kod = 2341 skapar hexfil från ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Fel, 0 Varning (ar). Byggtid förfluten: 00:00:02 Ladda "G: \\ n76E003 \\ programvara \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Provkod \\ UART0_Printf \\ Output \\ Printf_UART1" Flash Radera klar. Flash Skriv Klar: 2341 byte programmerad. Flashverifiering klar: 2341 byte verifierad. Flash Load slutade klockan 15:48:08
Utvecklingskortet är anslutet till strömkällan via programmeraren och den bärbara datorn med USB till UART-modulen. För att visa eller skicka UART-data krävs en seriell bildskärmsprogramvara. Jag använder teraterm för denna process.
Som du kan se på bilden nedan kunde jag visa strängarna som skickades från vår nuvoton-kontroller och visa den på den seriella bildskärmsprogrammet. Kunde också läsa värden från den seriella bildskärmen.
Du kan kolla in videon som länkas nedan för en fullständig demonstration av denna handledning. Hoppas du gillade artikeln och lärde dig något användbart. Om du har några frågor kan du lämna dem i kommentarfältet nedan eller använda våra forum för att skicka andra tekniska frågor.