MSP430 Abgehackter UART

Ich habe Probleme mit dem UART auf dem Mikrocontroller MSP430FR5969. Ich sende etwa 85 Zeichen 100 Mal pro Sekunde für ein Datenerfassungssystem. Ich verwende eine Baudrate von 115200, was ausreichen sollte. Wenn ich die serielle Ausgabe in einem Terminalprogramm ansehe, erhalte ich alle paar hundert Millisekunden Blöcke von ~ 4000 Zeichen. Da die Daten zeitkritisch sind, möchte ich, dass sie stetig eingehen.

Hier ist der Kern des Codes mit entfernten Datenerfassungsdetails.

#include <msp430.h>

unsigned char counter = 0;

int main(void) {
    init();             // Initialize MSP430

    while(1) {
        write_data_to_uart();
    }
}

void init() {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer

    P2SEL0 &= ~(BIT5);           // USCI_A1 UART TX line
    P2SEL1 |=  (BIT5);

    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;

    // Clock System Setup
    // ---------------------------------------------------------------------
    CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
    CSCTL1 = DCOFSEL_4 | DCORSEL;             // Set DCO to 16MHz
    CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;  // Set SMCLK = MCLK = DCO
                                              // ACLK = VLOCLK
    CSCTL3 = DIVA__2 | DIVS__1 | DIVM__2;     // Set all dividers to 1
    CSCTL0_H = 0;                             // Lock CS registers
    // ---------------------------------------------------------------------

    // Configure USCI_A1 for UART mode
    // ---------------------------------------------------------------------
    UCA1CTLW0 = UCSWRST;                       // Put eUSCI in reset
    UCA1CTLW0 |= UCSSEL__SMCLK;                // CLK = SMCLK
    UCA1BR0 = 8;                               // 115200 baud rate
    UCA1BR1 = 0x00;
    UCA1MCTLW |= UCOS16 | UCBRF_10 | 0xF700;
    UCA1CTLW0 &= ~UCSWRST;                     // Initialize eUSCI
}

void write_data_to_uart() {
    char i;
    uart_write_byte(counter);
    counter++;
    for(i = 0; i < 85; i++) {
        uart_write_byte(0x30);
    }
    uart_write_byte(0x0D);                  // Carriage return
    uart_write_byte(0x0A);                  // Line feed
}

void uart_write_byte(char x) {
    while(!(UCA1IFG & UCTXIFG));
    UCA1TXBUF = x;
}

Ich habe das Gefühl, dass das Problem mit einem Missverständnis meinerseits über UART zu tun hat. Gibt es eine Art Timer-Setup, das ich verwenden sollte, um die Daten kontinuierlich in den TX-Puffer einzuspeisen?

Verwenden Sie einen USB-zu-Seriell-Konverter? Es ist wahrscheinlich eine Art Pufferung, die damit vor sich geht, versuchen Sie vielleicht eine andere, wenn Sie eine bekommen können. Könnte auch das Terminalprogramm sein, denke ich, es könnte sich lohnen, ein anderes auszuprobieren.
Kam hierher, um Pufferung auf der Hostseite zu sagen, aber @PeterJ hat es bereits getan :) Können Sie sich die uart-Zeilen mit einem Oszilloskop oder Logikanalysator ansehen? So könntest du es dir selbst beweisen.
Ich weiß nicht, warum ich nicht daran gedacht habe, das zu versuchen ... war ein langer Tag! Aber es scheint, dass vom Mikrocontroller stetige Daten kommen - ich sehe keine langen Pausen. Danke schön!
Möglicherweise müssen Sie die Flusskontrolle in Betracht ziehen.

Antworten (1)

Möglicherweise haben Sie es entfernt, aber ich sehe keine Verzögerung zwischen Ihren Aufrufen von write_data_to_uart(). Schlafen Sie ausreichend Zeit zwischen Ihren Anrufen?

Was befindet sich auf der Empfangsseite des UART? Ein echter serieller Port oder ein USB-Seriell-Konverter?

Der beste Weg, um die aus dem uC austretenden Daten zu beschleunigen, besteht darin, Ihre Daten an einen Speicherort zu schreiben, einen Timer-Interrupt anzuschließen und eine DMA-Übertragung mit dem DMA vom Speicher zum UCA1TXBUF zu starten. Diese Methode hat in der Vergangenheit den geringsten Jitter verursacht und ich konnte uC in einen Low-Power-Zustand versetzen.