- Nozioni di base sulla comunicazione UART
- Requisiti hardware e configurazione
- Schema del circuito per la comunicazione UART Nuvoton N76E003
- Pin UART sul microcontrollore Nuvoton N76E003
- Registri UART nel microcontrollore Nuvoton N76E003
- Modalità operative UART in N76E003
- Programmazione del Nuvoton N76E003 per la comunicazione UART
UART è l'acronimo di Universal Asynchronous Receiver / Transmitter ed è un'utile funzionalità hardware in qualsiasi unità microcontrollore. Un microcontrollore deve ricevere dati, elaborarli e inviarli agli altri dispositivi. Ci sono diversi tipi di protocolli di comunicazione disponibili nel microcontrollore, tuttavia, l'UART è il più utilizzato tra gli altri protocolli di comunicazione come SPI e I2C. Se qualcuno ha bisogno di ricevere o trasmettere dati in serie, UART è sempre l'opzione più semplice e comune. Il vantaggio di UART è che richiede solo due fili per trasmettere dati tra i dispositivi. Continuando con il nostro Tutorial sul microcontrollore Nuvoton, in questo articolo impareremo come eseguire la comunicazione seriale utilizzando il microcontrollore N76E003.
Nozioni di base sulla comunicazione UART
Ora, poiché sappiamo cos'è l'UART, è importante conoscere i parametri associati dell'UART.
Due dispositivi UART ricevono e trasmettono dati alla stessa frequenza. Quando il dispositivo UART ricevente rileva un bit di inizio, inizia a leggere i bit in ingresso a una frequenza specifica nota come velocità di trasmissione. La velocità di trasmissione è una cosa importante per la comunicazione UART e viene utilizzata per misurare la velocità di trasferimento dei dati in bit al secondo (bps). Questa velocità di baud rate, per la trasmissione e la ricezione, deve essere alla stessa velocità di trasmissione. La differenza di velocità della velocità di trasmissione tra la trasmissione e la ricezione UART può essere solo del 10% circa prima che la temporizzazione dei bit diventi troppo lontana. Le velocità di baud rate più diffuse sono 4800, 9600, 115200 bps, ecc. In precedenza abbiamo utilizzato la comunicazione UART anche in molti altri microcontrollori elencati di seguito.
- Comunicazione UART tra ATmega8 e Arduino Uno
- Comunicazione UART tra due microcontrollori ATmega8
- Comunicazione UART tramite microcontrollori PIC
- Comunicazione UART sul microcontrollore STM8S
L'N76E003 ha due UART: UART0 e UART1. In questo tutorial, useremo la periferica UART sull'unità microcontrollore N76E003. Senza perdere molto tempo, valutiamo che tipo di configurazione hardware richiediamo per questa applicazione.
Requisiti hardware e configurazione
Il componente principale richiesto per questo progetto è il modulo convertitore da USB a UART o TTL che renderà l'interfaccia richiesta tra il PC o il laptop con il modulo microcontrollore. Per questo progetto, utilizzeremo il modulo da USB a UART basato su CP2102 mostrato di seguito.
Per non parlare, oltre al componente di cui sopra, abbiamo bisogno della scheda di sviluppo basata sul microcontrollore N76E003 e del programmatore Nu-Link. Se il programmatore non viene utilizzato come fonte di alimentazione, potrebbe essere necessario un alimentatore aggiuntivo da 5 V.
Schema del circuito per la comunicazione UART Nuvoton N76E003
Come possiamo vedere nello schema della scheda di sviluppo sottostante, il 2 ° e il 3 ° pin dell'unità microcontrollore vengono utilizzati rispettivamente come UART0 Tx e Rx. All'estrema sinistra viene mostrato il collegamento dell'interfaccia di programmazione.
Pin UART sul microcontrollore Nuvoton N76E003
L'N76E003 ha 20 pin di cui 4 pin possono essere utilizzati per la comunicazione UART. L'immagine sotto mostra i pin UART evidenziati in un riquadro quadrato rosso (Rx) e in un riquadro quadrato blu (Tx).
Per l'UART0, i pin 2 e 3 sono usati per la comunicazione UART e per l'UART1, il pin 8 e il pin 18 sono usati per la comunicazione.
Registri UART nel microcontrollore Nuvoton N76E003
N76E003 dispone di due UART full-duplex potenziati con riconoscimento automatico degli indirizzi e rilevamento degli errori di frame: UART0 e UART1. Questi due UART sono controllati utilizzando registri classificati in due diversi UART. Ci sono due coppie di pin RX e TX disponibili in N76E003 per le operazioni UART. Quindi il primo passo è selezionare la porta UART desiderata per le operazioni.
In questo tutorial, useremo l' UART0, quindi la configurazione verrà mostrata solo per l'UART0. UART1 avrà la stessa configurazione ma i registri saranno diversi.
Dopo aver selezionato un UART (UART0 in questo caso), i pin I / O necessari per essere utilizzati per la comunicazione RX e TX devono essere configurati come ingresso e uscita. Il pin RX di UART0 è il pin 3 del microcontrollore che è la porta 0.7. Poiché si tratta di un pin di ricezione della porta seriale, è necessario impostare la porta 0.7 come input. D'altra parte, la porta 0.6 che è il 2 ° pin del microcontrollore è un pin di trasmissione o pin di uscita. Deve essere impostato come modalità quasi bidirezionale. Questi possono essere selezionati utilizzando il registro PxM1 e PxM2. Questi due registri impostano le modalità I / O dove la x sta per il numero della porta (Ad esempio, Porta P1.0 il registro sarà P1M1 e P1M2, per P3.0 sarà P3M1 e P3M2, ecc.) La configurazione può essere visto nell'immagine qui sotto-
Modalità operative UART in N76E003
Quindi, il passaggio successivo consiste nel determinare la modalità delle operazioni UART. I due UART potrebbero funzionare in 4 modalità. Le modalità sono-
Come possiamo vedere, SM0 e SM1 (7 ° e 6 ° bit del registro SCON) selezionano la modalità delle operazioni UART. La modalità 0 è l' operazione sincrona e le altre tre modalità sono operazioni asincrone. Tuttavia, il generatore di velocità in baud ei bit di frame sono diversi per ciascuna modalità di porta seriale. Qualsiasi modalità può essere selezionata in base ai requisiti dell'applicazione e questo è lo stesso anche per l'UART1. Per questo tutorial, viene utilizzato il funzionamento a 10 bit con la velocità di overflow del timer 3 divisa per 32 o 16.
Ora è il momento di ottenere informazioni e configurare il registro SCON (SCON_1 per UART1) per UART0.
Il 6 ° e il 7 ° bit imposteranno la modalità UART come discusso in precedenza. Il bit 5 viene utilizzato per impostare la modalità di comunicazione multiprocessore per abilitare le opzioni. Tuttavia, il processo dipende dalla modalità UART selezionata. Oltre a questi, il bit REN sarà impostato su 1 per abilitare la ricezione e il flag TI sarà impostato su 1 per utilizzare la funzione printf invece della funzione di trasmissione UART0 personalizzata.
Il prossimo registro importante è il registro di controllo dell'alimentazione (PCON) (Timer 3 bit 7 e 6 per UART1). Se non conosci i timer, dai un'occhiata al tutorial sul timer Nuvoton N76E003 per capire come utilizzare i timer sul microcontrollore N76E003.
Il bit SMOD è importante per selezionare la doppia velocità di trasmissione in modalità UART0 1. Ora, poiché stiamo utilizzando il timer 3, è necessario configurare il registro di controllo del timer 3 T3CON. Tuttavia, i bit 7 e 6 sono riservati per l'impostazione della doppia velocità dati per UART1.
E il valore pre-scaler Timer 3-
Il 5 ° bit BRCK imposterà il timer 3 come sorgente di clock della velocità di trasmissione per UART1. Ora, la scheda tecnica di N76E003 viene fornita la formula per calcolare la velocità di trasmissione desiderata e il valore impostato di esempio per i registri Alto e Basso del Timer 3 (16 bit).
Valore di esempio per sorgente di clock a 16 Mhz
Pertanto, la velocità di trasmissione deve essere configurata nel registro Timer 3 utilizzando la formula sopra. Nel nostro caso, sarà la Formula 4. Dopodiché, l'avvio del Timer 3 impostando il registro TR3 su 1 terminerà il Timer di inizializzazione UART0 3. Per ricevere e inviare i dati UART0 utilizzare il registro sottostante-
Il registro SBUF viene configurato automaticamente per la ricezione e la trasmissione. Per ricevere i dati dall'UART, attendere che il flag RI imposti 1 e leggere il registro SBUF e inviare i dati a UART0, inviare i dati a SBUF e attendere che il flag TI ottenga 1 per confermare la corretta trasmissione dei dati.
Programmazione del Nuvoton N76E003 per la comunicazione UART
La parte di codifica è semplice e il codice completo utilizzato in questo tutorial si trova in fondo a questa pagina. La spiegazione del codice è la seguente, l'UART0 viene inizializzato a 9600 baud rate utilizzando l'istruzione nella funzione principale-
InitialUART0_Timer3 (9600);
La funzione di cui sopra è definita nel file common.c e sta configurando l'UART0 con Timer 3 come sorgente della velocità di trasmissione, in modalità 1 e con una velocità di trasmissione di 9600. La definizione della funzione è la seguente:
void InitialUART0_Timer3 (UINT32 u32Baudrate) // usa timer3 come generatore di Baudrate { P06_Quasi_Mode; // Impostazione del pin UART come modalità Quasi per la trasmissione P07_Input_Mode; // Impostazione del pin UART come modalità di input per ricevere SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // Abilitazione doppia velocità UART0 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; // Per la funzione printf è necessario impostare TI = 1 }
La dichiarazione viene eseguita passo dopo passo come discusso in precedenza ei registri vengono configurati di conseguenza. Tuttavia, nella libreria BSP dell'N76E003, c'è un bug che è invece di P07_Input_Mode; c'è P07_Quasi_Mode . A causa di ciò, la funzione di ricezione UART non funzionerà.
Anche il Baud rate viene configurato secondo l'input del baud rate e utilizzando la formula data dal datasheet. Ora, nella funzione main o nel ciclo while , viene utilizzata la funzione printf. Per utilizzare la funzione printf , il TI deve essere impostato come 1. Oltre a questo, nel ciclo while , viene utilizzato un caso switch e in base ai dati UART ricevuti, il valore viene stampato.
while (1) { printf ("\ r \ nPremere 1 o Premere 2 o Premere 3 o Premere 4"); oper = Receive_Data_From_UART0 (); switch (oper) { caso '1': printf ("\ r \ n1 viene premuto"); rompere; caso "2": printf ("\ r \ n2 viene premuto"); rompere; caso "3": printf ("\ r \ n3 viene premuto"); rompere; caso "4": printf ("\ r \ n4 viene premuto"); rompere; predefinito: printf ("\ r \ nPremuto tasto errato"); } Timer0_Delay1ms (300); } }
Bene, per l'UART0 ricevi il Receive_Data_From_UART0 (); viene utilizzata la funzione. È anche definito nella libreria common.c .
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; while (! RI); c = SBUF; RI = 0; ritorno (c); }
Aspetterà che il flag RI ottenga 1 e restituisca i dati di ricezione utilizzando la variabile c.
Lampeggiante codice e output
Il codice ha restituito 0 avvisi e 0 errori e ha lampeggiato utilizzando il metodo di lampeggiamento predefinito del Keil. Se non sei sicuro di come compilare e caricare il codice, consulta l'articolo su come iniziare con nuvoton. Le righe seguenti confermano che il nostro codice è stato caricato con successo.
Ricostruzione iniziata: Progetto: printf_UART0 Ricostruisci destinazione 'GPIO' compilando PUTCHAR.C… compilando Print_UART0.C… compilando Ritardo.c… compilando Common.c… assemblando STARTUP.A51… collegamento… Dimensione del programma: data = 54.2 xdata = 0 codice = 2341 creazione di un file esadecimale da ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Errore (i), 0 Avviso (i). Tempo di creazione trascorso: 00:00:02 Carica "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Flash Erase Done. Scrittura flash eseguita: 2341 byte programmati. Verifica flash eseguita: 2341 byte verificati. Il caricamento di Flash è terminato alle 15:48:08
La scheda di sviluppo è collegata alla fonte di alimentazione tramite il programmatore e il laptop utilizzando il modulo da USB a UART. Per visualizzare o inviare i dati UART, è necessario un software di monitoraggio seriale. Sto usando il termine tera per questo processo.
Come puoi vedere nell'immagine sotto, sono stato in grado di visualizzare le stringhe inviate dal nostro controller nuvoton e visualizzarle sul software del monitor seriale. Inoltre è stato in grado di leggere i valori dal monitor seriale.
Puoi controllare il video collegato di seguito per la dimostrazione completa di questo tutorial. Spero che l'articolo ti sia piaciuto e che abbia imparato qualcosa di utile. Se hai domande, puoi lasciarle nella sezione commenti qui sotto o utilizzare i nostri forum per pubblicare altre domande tecniche.