Domanda

Vorrei usare printf per diplay testo su una porta seriale di un microcontrollore ARM. Sono in grado di farlo. Ogni aiuto è apprezzato.

Il mio init_serial assomiglia a questo

void init_serial (void)
{
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
U1DLL = 0x000000C2; /*9600 Baud Rate @12MHz VPB Clock */
U1LCR = 0x00000003; /* DLAB=0*/
}

, che è ovviamente sbagliato.

È stato utile?

Soluzione

Per microcontollers, si deve in genere per definire la propria funzione putc per inviare byte a seconda di quale UART che si sta utilizzando. print sarà quindi chiamare il vostro putc.

Controllare la documentazione per le librerie fornite con il compilatore.

Si noti che questo è del tutto estraneo a come si intialise tuo UART. Tutto ciò che conta è che UART che si sta utilizzando.

(Su un problema non correlato, piuttosto che dire:

PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR   = 0x00000083; /*8 bits, 1 Stop bit */

ci sono in genere #defines per i registri che (di solito) facilitare la lettura, fornire un collegamento ai nomi di bit nella documentazione, e ridurre la necessità per i commenti da aggiungere e mantenuti su ogni linea come questi. Ad esempio:

PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN;
U1LCR   = U1LCR_8BITS | U1LCR_1STOPBIT;

.. e così via.)

Altri suggerimenti

Per printf() , puts() , ecc lavoro su una piattaforma embedded, è necessario implementare alcuni ganci che lavorano con la libreria C. Questo è in genere dipende dalle librerie C forniti con il compilatore, quindi è probabilmente compilatore-dipendente. Ma in molti casi la libreria richiede solo di fornire un putc() la funzione (o nome simile), che prende un carattere (generato dal printf() funzione di libreria) e lo invia al il dispositivo di output prescelto. Questo potrebbe essere un buffer di memoria, porta seriale, USB messaggio, qualunque sia.

Dal punto di vista della libreria C, il putc() funzione dovrebbe essere eseguito a completamento, quindi sta a te decidere se implementare per essere una semplice funzione di blocco (in attesa fino a quando il porta seriale è gratuito e l'invio del carattere), o non bloccante (mettendolo in un buffer, per essere inviato da un task in background interrupt, ma il buffer potrebbe riempire se abbastanza byte di uscita abbastanza veloce, e poi si deve a uno bloccare o scartare caratteri). È anche possibile farlo funzionare correttamente con il RTOS se ne avete uno, l'implementazione di una scrittura di blocco che dorme su un semaforo fino a quando la porta seriale è disponibile.

Così, in sintesi, leggere la documentazione del compilatore e la sua biblioteca C, e dovrebbe dirvi cosa dovete fare per rendere printf() di lavoro.

pubblicitari esempio per AVR micro con compilatore GCC:

compilatore GCC ARM utilizzando newlib libreria C:

Non sono sicuro su ARM, in particolare, ...

Per alcuni chip, all'interno dell'IDE, è necessario specificare che è necessario un mucchio di utilizzare la printf, e quanto grande dovrebbe essere. Il programmatore non metterà automaticamente uno.

Controlla nei menu del vostro programmatore / IDE e vedere se c'è un posto per specificare la dimensione heap.

E sono d'accordo con Steve, questo è solo se si può effettivamente utilizzare il printf, altrimenti scrivere il proprio piccolo frammento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top