Mit Printf auf dem seriellen Port eines ARM-Mikrocontroller anzuzeigen
-
19-09-2019 - |
Frage
Ich möchte printf verwenden, um Text auf einem seriellen Port eines ARM-Mikrocontroller Diplay. Ich bin zu tun, damit nicht in der Lage. Jede Hilfe ist willkommen.
Meine init_serial wie folgt aussieht
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*/
}
was offensichtlich falsch ist.
Lösung
Für Mikrocontrollern, haben Sie in der Regel Ihre eigene putc
Funktion definieren Bytes zu senden je nachdem, was Sie UART verwenden. print
wird dann putc
nennen.
Überprüfen Sie die Dokumentation für die Bibliotheken mit dem Compiler zugeführt wird.
Beachten Sie, dass dies völlig unabhängig ist, wie Sie Ihre UART intialise. Alles, was zählt, ist die UART Sie verwenden.
(auf einem nicht verwandtes Thema, anstatt zu sagen:
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
gibt es typischerweise #define
s für die Register, die (in der Regel) Hilfe Lesbarkeit, einen Link zu den Bit-Namen in der Dokumentation, und reduziert die Notwendigkeit für Kommentare zu jeder Zeile wie diese aufgenommen und gepflegt werden. Zum Beispiel:
PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN;
U1LCR = U1LCR_8BITS | U1LCR_1STOPBIT;
.. und so weiter.)
Andere Tipps
Um printf()
, puts()
etc Arbeit auf einer Embedded-Plattform, müssen Sie einige Haken implementieren, die mit der C-Bibliothek arbeiten. Dies ist in der Regel abhängig von den C-Bibliotheken mit dem Compiler bereitgestellt, so ist wahrscheinlich Compiler abhängig. Aber in vielen Fällen nur die Bibliothek erfordert, dass Sie eine schaffen putc()
Funktion (oder einem ähnlichen Namen), die ein Zeichen nimmt (erzeugt durch die printf()
Library-Funktion) und sendet sie an Ihr gewähltes Ausgabegerät. Das könnte ein Speicherpuffer, serielle Schnittstelle, USB-Nachricht sein, was auch immer.
Aus der Sicht der C-Bibliothek, die putc()
Funktion Run-to-Completion würde, so ist es an Ihnen ist, ob Sie es implementieren eine einfache Sperrfunktion zu sein (zu warten, bis die seriell Port ist frei und das Zeichen) senden, oder nicht-blockierenden (es in einen Puffer setzen, durch einen Hintergrund Interrupt-Task gesendet werden, aber der Puffer füllen könnte, wenn Sie Ausgang genug Bytes schnell genug, und dann haben Sie entweder blockieren oder verwerfen Zeichen). Sie können es auch richtig mit Ihrem RTOS machen arbeiten, wenn Sie eine haben, eine blockierende Schreib Implementierung, die auf einem Semaphore schläft, bis die serielle Schnittstelle zur Verfügung.
So in der Zusammenfassung, lesen Sie in der Dokumentation zu Ihrem Compiler und seine C-Bibliothek, und es sollte Ihnen sagen, was Sie printf()
Arbeit.
Beispiel-Links für AVR Micro mit GCC Compiler:
ARM GCC-Compiler newlib C-Bibliothek:
Ich bin nicht sicher über ARM insbesondere ...
Für einige Chips innerhalb der IDE, müssen Sie angeben, dass Sie einen Haufen benötigen die printf zu verwenden, und wie groß es sein sollte. Der Programmierer wird nicht automatisch eine angelegt.
Überprüfen Sie in den Menüs Ihrer Programmierer / IDE und sehen, ob es ein Ort ist, um die Heap-Größe angeben.
Und ich mit Steve einverstanden ist, ist dies nur, wenn Sie tatsächlich die printf verwenden können, sonst Ihre eigenen kleine Schnipsel schreiben.