121 lines
2 KiB
C
121 lines
2 KiB
C
#include <msp430.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
|
|
#include "mw_main.h"
|
|
|
|
#include "mw_uart.h"
|
|
|
|
static char UART_RX_CHAR = 0;
|
|
|
|
#if defined MW_DEVBOARD_V2 || MW_DEBUG_UART
|
|
|
|
void debug_uart_tx_char(char c);
|
|
|
|
#pragma vector=USCI_A3_VECTOR
|
|
__interrupt void UCA_ISR (void)
|
|
{
|
|
switch (UCA3IV) {
|
|
case 2: // RXIFG
|
|
/* clear IRQ flag */
|
|
UCA3IFG &= ~UCRXIFG;
|
|
UART_RX_CHAR = UCA3RXBUF;
|
|
_event_src |= DBG_UART_RCV_EVENT;
|
|
/* wake up to handle the received char */
|
|
// LPM3_EXIT;
|
|
LPM3_EXIT_ISR();
|
|
break;
|
|
case 4: // TXIFG
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void init_debug_uart(void)
|
|
{
|
|
/* assert reset */
|
|
UCA3CTL1 = UCSWRST;
|
|
|
|
/* reset default SMCLK = 1.048MHz */
|
|
UCA3CTL1 |= UCSSEL__SMCLK;
|
|
/* CLK baud BRx BRSx BRFx */
|
|
/* 1,048,576 115200 9 1 0 */
|
|
/* 16,000,000 115200 138 7 0 */
|
|
|
|
UCA3BR0 = 138;
|
|
UCA3MCTL = UCBRS_7 | UCBRF_0;
|
|
|
|
/* set P10.4 & P10.5 to UCA function */
|
|
P10SEL |= BIT4;
|
|
P10SEL |= BIT5;
|
|
|
|
UCA3STAT = 0;
|
|
|
|
/* deassert reset */
|
|
UCA3CTL1 &= ~UCSWRST;
|
|
|
|
/* enable receive interrupt */
|
|
UCA3IE = UCRXIE;
|
|
/* clear interrup flags */
|
|
UCA3IFG = 0;
|
|
}
|
|
|
|
void debug_uart_tx_char(const char c)
|
|
{
|
|
while (UCA3STAT & UCBUSY)
|
|
nop();
|
|
UCA3TXBUF = c;
|
|
while ((UCA3IFG & UCTXIFG) == 0 )
|
|
nop();
|
|
}
|
|
|
|
void debug_uart_tx(const char *buf)
|
|
{
|
|
unsigned char i = 0;
|
|
|
|
while (buf[i] != 0) {
|
|
debug_uart_tx_char(buf[i]);
|
|
if (buf[i++] == '\n')
|
|
debug_uart_tx_char('\r');
|
|
}
|
|
while (UCA3STAT & UCBUSY)
|
|
nop();
|
|
}
|
|
|
|
void debug_dump_hex(const uint16_t len, const void *buf)
|
|
{
|
|
int i;
|
|
char tstr[8];
|
|
|
|
for (i=0; i<len; i++) {
|
|
snprintf(tstr, 8, "0x%02x ", *(uint8_t *)(buf+i));
|
|
debug_uart_tx(tstr);
|
|
}
|
|
debug_uart_tx("\n");
|
|
}
|
|
|
|
void debug_dump_ascii(const uint16_t len, const void *buf)
|
|
{
|
|
int i;
|
|
|
|
for (i=0; i<len; i++) {
|
|
debug_uart_tx_char(isprint(*(uint8_t *)(buf+i)) ? *(uint8_t *)(buf+i) : '.');
|
|
}
|
|
debug_uart_tx("\n");
|
|
}
|
|
|
|
char debug_uart_rx_char(char *c)
|
|
{
|
|
if (UART_RX_CHAR != 0) {
|
|
*c = UART_RX_CHAR;
|
|
UART_RX_CHAR = 0;
|
|
return 1;
|
|
} else {
|
|
*c = 0;
|
|
return 0;
|
|
}
|
|
}
|
|
#endif
|
|
|