- Basisprincipes van UART-communicatie
- Hardwarevereisten en instellingen
- Schakelschema voor Nuvoton N76E003 UART-communicatie
- UART-pinnen op Nuvoton N76E003-microcontroller
- UART registreert in Nuvoton N76E003 Microcontroller
- UART-bedrijfsmodi in N76E003
- Nuvoton N76E003 programmeren voor UART-communicatie
UART staat voor Universal Asynchronous Receiver / Transmitter en is een handige hardwarefunctie in elke microcontrollereenheid. Een microcontroller moet gegevens ontvangen, verwerken en naar de andere apparaten sturen. Er zijn verschillende soorten communicatieprotocollen beschikbaar in de microcontroller, maar UART is de meest gebruikte van de andere communicatieprotocollen zoals SPI en I2C. Als iemand gegevens serieel moet ontvangen of verzenden, is UART altijd de eenvoudigste en meest gebruikelijke optie. Het voordeel van UART is dat er slechts twee draden nodig zijn om gegevens tussen apparaten te verzenden. We gaan verder met onze Nuvoton Microcontroller Tutorial, in dit artikel zullen we leren hoe we seriële communicatie kunnen uitvoeren met behulp van de N76E003 microcontroller.
Basisprincipes van UART-communicatie
Nu we weten wat UART is, is het belangrijk om de bijbehorende parameters van de UART te kennen.
Twee UART-apparaten ontvangen en verzenden gegevens met dezelfde frequentie. Wanneer het ontvangende UART-apparaat een startbit detecteert, begint het de inkomende bits te lezen op een specifieke frequentie die bekend staat als de baudrate. De baudrate is een belangrijk ding voor UART-communicatie en wordt gebruikt om de snelheid van gegevensoverdracht in bits per seconde (bps) te meten. Deze baudsnelheid, voor het verzenden en ontvangen, moet dezelfde baudsnelheid hebben. Het baudrate-snelheidsverschil tussen de verzendende en ontvangende UART's kan slechts ongeveer 10% zijn voordat de timing van bits te ver weg komt. De meest populaire baudrate-snelheden zijn 4800, 9600, 115200 bps, enz. Eerder hebben we UART-communicatie ook gebruikt in veel andere microcontrollers die hieronder worden vermeld.
- UART Communicatie tussen ATmega8 en Arduino Uno
- UART-communicatie tussen twee ATmega8-microcontrollers
- UART-communicatie met behulp van PIC-microcontrollers
- UART-communicatie op STM8S-microcontroller
De N76E003 heeft twee UART's - UART0 en UART1. In deze zelfstudie gebruiken we het UART-randapparaat op de N76E003-microcontrollereenheid. Laten we, zonder veel tijd te verspillen, eens kijken wat voor soort hardware-instellingen we nodig hebben voor deze toepassing.
Hardwarevereisten en instellingen
Het belangrijkste onderdeel dat voor dit project nodig is, is de USB naar UART- of TTL-convertormodule die de interface tussen de pc of laptop met de microcontrollermodule vereist. Voor dit project zullen we een CP2102- gebaseerde USB naar UART-module gebruiken die hieronder wordt weergegeven.
Om nog maar te zwijgen, behalve het bovenstaande onderdeel, hebben we het N76E003-microcontroller- gebaseerde ontwikkelbord nodig, evenals de Nu-Link Programmer. Een extra 5V-voedingseenheid kan nodig zijn als de programmer niet als stroombron wordt gebruikt.
Schakelschema voor Nuvoton N76E003 UART-communicatie
Zoals we kunnen zien in het onderstaande ontwikkelingsbordschema, worden de 2e en 3e pin van de microcontroller-eenheid gebruikt als respectievelijk een UART0 Tx en Rx. Helemaal links wordt de aansluiting van de programmeerinterface weergegeven.
UART-pinnen op Nuvoton N76E003-microcontroller
De N76E003 heeft 20 pinnen waarvan 4 pinnen kunnen worden gebruikt voor UART-communicatie. De onderstaande afbeelding toont de UART-pinnen gemarkeerd in een rood vierkant vak (Rx) en een blauw vierkant vak (Tx).
Voor de UART0 worden pin 2 en 3 gebruikt voor UART-communicatie en voor de UART1 worden pin 8 en pin 18 gebruikt voor communicatie.
UART registreert in Nuvoton N76E003 Microcontroller
N76E003 heeft twee verbeterde full-duplex UART's met automatische adresherkenning en framing-foutdetectie - UART0 en UART1. Deze twee UART's worden bestuurd met behulp van registers die zijn onderverdeeld in twee verschillende UART's. Er zijn twee paar RX- en TX-pinnen beschikbaar in N76E003 voor UART-bewerkingen. De eerste stap is dus het selecteren van de gewenste UART-poort voor bewerkingen.
In deze tutorial zullen we de UART0 gebruiken, dus de configuratie wordt alleen voor de UART0 getoond. UART1 heeft dezelfde configuratie, maar de registers zijn anders.
Na het selecteren van één UART (in dit geval UART0), moeten de I / O-pinnen die nodig zijn voor RX- en TX-communicatie worden geconfigureerd als invoer en uitvoer. De RX-pin van UART0 is pin 3 van de microcontroller die poort 0.7 is. Omdat dit een ontvangstpin voor een seriële poort is, moet poort 0.7 als invoer worden ingesteld. Aan de andere kant is poort 0.6, die de 2e pin van de microcontroller is, een verzendpin of outputpin. Het moet worden ingesteld als een quasi bidirectionele modus. Deze kunnen worden geselecteerd met behulp van het PxM1- en PxM2-register. Deze twee registers stellen de I / O-modi in waarbij de x staat voor het poortnummer (bijvoorbeeld poort P1.0 is het register P1M1 en P1M2, voor P3.0 is dit P3M1 en P3M2, enz.) De configuratie kan te zien in de onderstaande afbeelding-
UART-bedrijfsmodi in N76E003
Vervolgens is de volgende stap het bepalen van de modus van UART-bewerkingen. De twee UART's kunnen in 4 modi werken. De modi zijn-
Zoals we kunnen zien, selecteren de SM0 en SM1 (7e en 6e bit van SCON-register) de modus van UART-bewerkingen. Modus 0 is de synchrone werking en de andere drie modi zijn asynchrone bewerkingen. De baudrate-generator en de framebits zijn echter verschillend voor elke seriële poortmodus. Elk van de modi kan worden geselecteerd volgens de toepassingsvereisten en dit is ook hetzelfde voor de UART1. Voor deze zelfstudie wordt een 10-bits bewerking met timer 3 overflow-rate gedeeld door 32 of 16 gebruikt.
Nu is het tijd om informatie op te halen en het SCON-register (SCON_1 voor UART1) voor UART0 te configureren.
Het 6e en 7e bit stellen de UART-modus in zoals eerder besproken. Bit 5 wordt gebruikt om de Multiprocessor-communicatiemodus in te stellen om opties in te schakelen. Het proces is echter afhankelijk van welke UART-modus is geselecteerd. Anders dan deze, wordt de REN-bit ingesteld op 1 om ontvangst mogelijk te maken en wordt de TI-vlag ingesteld op 1 om de printf- functie te gebruiken in plaats van de aangepaste UART0-verzendfunctie.
Het volgende belangrijke register is het Power control register (PCON) (Timer 3 bit 7 en 6 voor UART1) register. Als u nieuw bent met timers, bekijk dan de Nuvoton N76E003 Timer-zelfstudie om te begrijpen hoe u timers op de N76E003 Microcontroller kunt gebruiken.
De SMOD-bit is belangrijk om de dubbele baudrate in UART0-modus 1 te selecteren. Nu we de timer 3 gebruiken, moet het timer 3-controleregister T3CON worden geconfigureerd. De bit 7e en 6e zijn echter gereserveerd voor de instelling voor dubbele gegevenssnelheid voor UART1.
En de waarde van Timer 3 pre-scaler-
De 5e bit BRCK stelt Timer 3 in als de baudrate-klokbron voor UART1. Nu krijgt de datasheet van N76E003 de formule voor het berekenen van de gewenste baudrate en de sample set-waarde voor de Timer 3 (16-bits) hoge en lage registers.
Voorbeeldwaarde voor een klokbron van 16 MHz
De baudrate moet dus worden geconfigureerd in het Timer 3-register met behulp van de bovenstaande formule. In ons geval zal dit de Formule 4 zijn. Daarna zal het starten van Timer 3 door het TR3-register in te stellen op 1 de UART0 Initialization Timer 3 beëindigen. Om de UART0-data te ontvangen en te verzenden om het onderstaande register te gebruiken,
Het SBUF-register wordt automatisch geconfigureerd voor ontvangen en verzenden. Om gegevens van de UART te ontvangen, wacht u tot de RI-vlag is ingesteld op 1 en leest u het SBUF-register en verzendt u de gegevens naar UART0, verzendt u de gegevens naar SBUF en wacht u tot de TI-vlag 1 krijgt om de succesvolle gegevensoverdracht te bevestigen.
Nuvoton N76E003 programmeren voor UART-communicatie
Het coderingsgedeelte is eenvoudig en de volledige code die in deze tutorial wordt gebruikt, vindt u onderaan deze pagina. De uitleg van de code is als volgt, de UART0 wordt geïnitialiseerd op 9600 baudrates met behulp van de instructie in de hoofdfunctie-
InitialUART0_Timer3 (9600);
De bovenstaande functie is gedefinieerd in het common.c- bestand en het configureert de UART0 met Timer 3 als de baudrate-bron, in modus 1, en met een baudrate van 9600. De functiedefinitie is als volgt:
void InitialUART0_Timer3 (UINT32 u32Baudrate) // gebruik timer3 als baudrate-generator { P06_Quasi_Mode; // UART-pin instellen als Quasi-modus voor het verzenden van P07_Input_Mode; // UART-pin instellen als invoermodus voor ontvangen SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate T3CON inschakelen & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // UART0 baudrate klokbron = 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; // Voor printf functie moet TI = 1 }
De aangifte gebeurt stap voor stap zoals eerder besproken en de registers worden dienovereenkomstig geconfigureerd. In de BSP-bibliotheek van de N76E003 zit echter een bug die in plaats van P07_Input_Mode; er is P07_Quasi_Mode . Hierdoor zal de UART-ontvangstfunctie niet werken.
De baudrate wordt ook geconfigureerd volgens de baudrate-invoer en met behulp van de formule die wordt gegeven in het gegevensblad. Nu wordt in de hoofdfunctie of de while-lus de functie printf gebruikt. Om de printf- functie te gebruiken, moet de TI worden ingesteld als 1. Anders dan dit, wordt in de while-lus een schakelkast gebruikt en volgens de ontvangen UART-gegevens wordt de waarde afgedrukt.
while (1) { printf ("\ r \ nDruk op 1 of druk op 2 of druk op 3 of druk op 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 is ingedrukt"); breken; case '2': printf ("\ r \ n2 is ingedrukt"); breken; case '3': printf ("\ r \ n3 is ingedrukt"); breken; case '4': printf ("\ r \ n4 is ingedrukt"); breken; standaard: printf ("\ r \ nVerkeerde toets ingedrukt"); } Timer0_Delay1ms (300); } }
Welnu, voor de UART0 ontvangt u de Receive_Data_From_UART0 (); functie wordt gebruikt. Het wordt ook gedefinieerd in de common.c- bibliotheek.
UINT8 Receive_Data_From_UART0 (ongeldig) { UINT8 c; terwijl (! RI); c = SBUF; RI = 0; terugkeer (c); }
Het wacht tot de RI-vlag 1 krijgt en retourneert de ontvangen gegevens met behulp van de variabele c.
Knipperende code en uitvoer
De code retourneerde 0 waarschuwing en 0 fouten en flitste met behulp van de standaard knippermethode van de Keil. Als u niet zeker weet hoe u code moet compileren en uploaden, bekijk dan het artikel Aan de slag met nuvoton. De onderstaande regels bevestigen dat onze code met succes is geüpload.
Heropbouw gestart: Project: printf_UART0 Herbouw doel 'GPIO' compileren PUTCHAR.C… compileren Print_UART0.C… compileren Delay.c… compileren Common.c… assembleren STARTUP.A51… koppelen… Programmagrootte: data = 54.2 xdata = 0 code = 2341 creëren hex-bestand van ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Fout (en), 0 Waarschuwing (en). Verstreken bouwtijd: 00:00:02 Laad "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Flash wissen voltooid . Flash schrijven voltooid: 2341 bytes geprogrammeerd. Flash Verify Done: 2341 bytes geverifieerd. Flash Load voltooid om 15:48:08
Het ontwikkelbord wordt via de programmeur en de laptop in de stroombron aangesloten met behulp van de USB naar UART-module. Om de UART-gegevens weer te geven of te verzenden, is seriële monitorsoftware vereist. Ik gebruik tera-term voor dit proces.
Zoals u in de onderstaande afbeelding kunt zien, kon ik de strings die vanaf onze nuvoton-controller zijn verzonden, weergeven en weergeven op de seriële monitorsoftware. Kon ook waarden van de seriële monitor lezen.
Je kunt de onderstaande video bekijken voor de volledige demonstratie van deze tutorial. Ik hoop dat je het artikel leuk vond en iets nuttigs hebt geleerd. Als u vragen heeft, kunt u deze achterlaten in het commentaargedeelte hieronder of onze forums gebruiken om andere technische vragen te stellen.