Tengo problemas con el UART en el microcontrolador MSP430FR5969. Estoy enviando unos 85 caracteres 100 veces por segundo para un sistema de adquisición de datos. Estoy usando una velocidad de baudios de 115200 que debería ser suficiente. Cuando veo la salida en serie en un programa de terminal, obtengo fragmentos de ~ 4000 caracteres cada unos cientos de milisegundos. Dado que los datos son sensibles al tiempo, me gustaría que ingresen constantemente.
Aquí están las agallas del código con los detalles de adquisición de datos eliminados.
#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;
}
Siento que el problema tiene que ver con una idea errónea de mi parte acerca de UART. ¿Debería usar algún tipo de configuración de temporizador para alimentar constantemente los datos en el búfer de TX?