Warum druckt ARM Cortex M0 fälschlicherweise Hello World auf UART?

Ich bin neu bei ARM CORTEX M0. Ich versuche, den Tx-Pin von UART als Debug-Port zu verwenden.

Wenn ich den XDS200-Debugger verwende, um den Code schrittweise durchzugehen, kann ich die Zeichen sehen, und ich kann sehen, dass „Hello World“ sauber auf dem Tera-Term über den COM-Port gedruckt ist.

Aber wenn ich den Mikrocontroller alleine laufen lasse, sehe ich keinen Ausgang und die am Tx-Pin angeschlossene Sonde zeigt konstant hoch.

Ich denke, erst nach der Verwendung des Debuggers und dem schrittweisen Durchlaufen des Codes werden die Signale angezeigt, die jedoch nicht genau "Hello World" darstellen. Das Folgende ist der Teil der Ausgabe, die ich von Tera-Term protokolliert habe, und dies wiederholt sich:

/***********************************************************/

    W

    oldo

    W

    oldo

     Hrl  

    Well WHWelo

    WHWelo

    WHrld HoHrl WHoell Weold 

    olrl WHrllo

    Welllo

    oell  Hrldo

    Welo o

    oelo o

    oelo  Hrl  

    Welo

/***********************************************************/

Es folgt der main() Funktionscode.

/***********************************************************/

    void main(void)

    {

       Configure_peripheral(); /*This function call initializes all the required interrupts and global variables etc... */

       char message[] = "Hello World \n";

       char *ptr;

       for(;;)

       {

           ptr = message;

           while(*ptr)

           {

               UART_TX_BUF = (volatile unsigned char)(*ptr);

               ptr++;

           }

       }

    }

/***********************************************************/

Es folgt der Code der UART-Interrupt-Service-Routine

/***********************************************************/

    interrupt void uart_isr(void)

    {

       if(UART_INTERRUPT_STATUS & UART_TXCOMPLETE_I)

       {

              /* Clear UART_TXCOMPLETE_I bit */

              UART_INTERRUPT_STATUS |= 0x02;

              /*datasheet : http://www.ti.com/lit/ds/symlink/pga900.pdf*/

              /*As per PGA900 datasheet : TX_COMPLETE is cleared when the UART_TX_BUF is written*/

              /* Read UART_LINE_STATUS for errors */

              UART_Line_Status = UART_LINE_STATUS;

              /* Transmit flag set here */

              UART_Flag_Tx = 1;

       }

     }

Könnte mir bitte jemand helfen zu verstehen, was mir fehlt, um die erwartete Zeichenfolge "Hello World" anstelle von durcheinandergebrachtem Text zu drucken. Ich verwende einen USB-Seriell-Transceiver mit einer Betriebsspannung von 0-3,3 V. Danke

Antworten (1)

Sie fügen so schnell wie möglich Zeichen in den Sendepuffer ein, ohne zu prüfen, ob der UART bereit ist, ein nächstes Zeichen zu akzeptieren. Daher gehen viele Zeichen verloren, und was der PC empfängt, ist eine mehr oder weniger zufällige Teilmenge der Zeichen, die Sie zu übertragen versuchen.

Suchen Sie nach den Bits „tx-Puffer leer“ oder „tx-FIFO nicht voll“. Bevor Sie dem Tx-Puffer ein nächstes Zeichen zuweisen, warten Sie zunächst auf eines dieser Bits.

codefor(;;) { ptr = Nachricht; While (* ptr) { if (UART_LINE_STATUS & TX_COMPLETE) { UART_TX_BUF = (volatile unsigned char) (* ptr); ptr++; } } } codeBitte werfen Sie einen Blick auf das Datenblatt ti.com/lit/ds/symlink/pga900.pdf . Dieser Prozessor hat keine "Tx-Puffer leer"- oder "Tx-Fifo nicht voll"-Bits. Ich habe den Code im Wesentlichen wie oben geändert. Also überprüfe ich, ob das TX_COMPLETE-Bit im UART_LINE_STATUS-Register gesetzt ist oder nicht. Aber immer noch keine Ausgabe zum Tera-Term. Lass es mich wissen, bitte. Vielen Dank für Ihre Hilfe
Wenn Sie den Chip in Ihrer Frage nicht angeben, erhalten Sie eine allgemeine Antwort ... Sie können selbst nachsehen, sobald Sie den Hinweis erhalten, wo Sie suchen müssen. Das Dokument, auf das Sie verlinken, fühlt sich nicht wie ein vollständiges Datenblatt / Handbuch an, aber nach einer 60-sekündigen Suche denke ich, dass COM_TXRDY das sein könnte, was Sie brauchen.
@linux Wouter van Ooijen hat den richtigen Vorschlag, die CPU verfügt über interne Statusregister sowie Interrupt-Leitungen, mit denen Sie den UART-Status abfragen können. Wenn Sie dies auf einem eingebetteten Betriebssystem ausführen, gibt es wahrscheinlich Systemaufrufe dafür. Sie haben eine ISR, aber sie wirkt sich nicht auf Ihren Kontrollfluss aus.
Hallo @Wouter van Ooijen, danke für das Feedback. Das Datenblatt erwähnt nur, dass es einen ARM Cortex M0-Prozessor hat und nicht mehr. Ich habe also keine Ahnung, was ich aus dem COM_TX_STATUS-Register verstehen soll. Was ist die Logik hinter dem Setzen/Prüfen des COM_TXRDY-Bits, das in COM_TX_STATUS gesetzt ist. Was fehlt mir im ISR für Tx zu codieren. Danke
Hallo @crasic, danke für das Feedback. Das Datenblatt erwähnt nur, dass es einen ARM Cortex M0-Prozessor hat und nicht mehr als das. Ich habe also keine Ahnung, was ich aus dem COM_TX_STATUS-Register verstehen soll. Was ist die Logik hinter dem Setzen/Prüfen des COM_TXRDY-Bits, das in COM_TX_STATUS gesetzt ist. Was fehlt mir im ISR für Tx zu codieren. Danke
Hallo @Wouter van Ooijen, der folgende Abfragecode funktioniert codeif(UART_LINE_STATUS & TX_COMPLETE) { UART_TX_BUF = *ptr; ptr++; } codeIch habe das Datenblatt gelesen und der von Ihnen gegebene Hinweis war hilfreich. Aber ich kann die implizite Logik in Bezug auf das COM_TXRDY-Bit nicht ableiten. COM_TX_STATUS ist eine Art Schalter, der die Übertragung steuern kann, aber keine Ahnung hat, wie man von ISR aus steuert. Auch bezüglich des Chips habe ich nur das Datenblatt und das Evaluation Board. Bitte lassen Sie mich wissen, was ich in der ISR vermisse, um den Zeichenfluss ohne Abfrage zu steuern. Danke schön.
Ich weiß es ehrlich gesagt nicht (ich kenne diesen Chip nicht) und es ist mir egal (ich neige dazu, Interrupts zu vermeiden). Aber es sollte ein Dokument geben, das die Funktionsweise der UART-Register detaillierter erklärt. Wenn nicht, werfen Sie den Chip weg und wählen Sie einen, der ordnungsgemäß dokumentiert ist.