uart stuff
This commit is contained in:
parent
9a6f76feab
commit
2a621fbaf9
14
src/main.cpp
14
src/main.cpp
@ -10,15 +10,8 @@
|
|||||||
#include <intrinsics.h>
|
#include <intrinsics.h>
|
||||||
#include <isr_compat.h>
|
#include <isr_compat.h>
|
||||||
|
|
||||||
void delay(uint16_t c) {
|
#include "uart.h"
|
||||||
volatile uint16_t i = c;
|
|
||||||
while (i--);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
#pragma vector = TIMER0_A0_VECTOR
|
|
||||||
__interrupt void TA0_ISR() {
|
|
||||||
*/
|
|
||||||
ISR(TIMER0_A0, TA0_ISR) {
|
ISR(TIMER0_A0, TA0_ISR) {
|
||||||
static uint8_t state = 0;
|
static uint8_t state = 0;
|
||||||
|
|
||||||
@ -45,8 +38,13 @@ int main() {
|
|||||||
TACCR0 = 1000;
|
TACCR0 = 1000;
|
||||||
TACCTL0 = CCIE;
|
TACCTL0 = CCIE;
|
||||||
TACTL = MC_1 | ID_0 | TASSEL_1 | TACLR;
|
TACTL = MC_1 | ID_0 | TASSEL_1 | TACLR;
|
||||||
|
|
||||||
|
uartInit();
|
||||||
|
|
||||||
__enable_interrupt();
|
__enable_interrupt();
|
||||||
|
|
||||||
|
uartWrite('W');
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
__bis_status_register(LPM0_bits);
|
__bis_status_register(LPM0_bits);
|
||||||
}
|
}
|
||||||
|
126
src/uart.cpp
Normal file
126
src/uart.cpp
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#include <msp430g2553.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <isr_compat.h>
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
volatile uint8_t txBuffer[UART_TX_BUFFER_SIZE+5];
|
||||||
|
|
||||||
|
volatile uint8_t txBufferReadIdx = 0;
|
||||||
|
volatile uint8_t txBufferWriteIdx = 0;
|
||||||
|
|
||||||
|
volatile uint8_t rxBuffer[UART_RX_BUFFER_SIZE+5];
|
||||||
|
volatile uint8_t rxBufferReadIdx = 0;
|
||||||
|
volatile uint8_t rxBufferWriteIdx = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static inline void enableDataRegisterEmptyInterrupt() {
|
||||||
|
IE2 |= UCA0TXIE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void disableDataRegisterEmptyInterrupt() {
|
||||||
|
IE2 &= ~UCA0TXIE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uartInit() {
|
||||||
|
UCA0CTL1 |= UCSWRST;
|
||||||
|
|
||||||
|
UCA0CTL1 |= UCSSEL0; // ACLK
|
||||||
|
|
||||||
|
UCA0BR0 = 13;
|
||||||
|
UCA0BR1 = 0;
|
||||||
|
|
||||||
|
UCA0MCTL = UCBRS1 | UCBRS2;
|
||||||
|
|
||||||
|
UCA0CTL1 &= ~UCSWRST;
|
||||||
|
|
||||||
|
IE2 |= UCA0RXIE;
|
||||||
|
|
||||||
|
|
||||||
|
// FILE *mystdout = fdevopen(uartPutchar, NULL);
|
||||||
|
// stdout = mystdout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uartWrite(uint8_t o) {
|
||||||
|
if (txBufferWriteIdx == (UART_TX_BUFFER_SIZE - 1)) {
|
||||||
|
while (txBufferReadIdx == UART_TX_BUFFER_SIZE);
|
||||||
|
} else {
|
||||||
|
while (txBufferReadIdx == (txBufferWriteIdx + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
txBuffer[txBufferWriteIdx] = o;
|
||||||
|
txBufferWriteIdx++;
|
||||||
|
|
||||||
|
if (txBufferWriteIdx > UART_TX_BUFFER_SIZE) {
|
||||||
|
txBufferWriteIdx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
enableDataRegisterEmptyInterrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//int uartPutchar(char c, FILE *stream) {
|
||||||
|
// if (c == '\n')
|
||||||
|
// uartPutchar('\r', stream);
|
||||||
|
// uartWrite((uint8_t) c);
|
||||||
|
// return 0;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
ISR(USCIAB0TX, UART_TX_ISR) {
|
||||||
|
if ((IFG2 | UCA0TXIE) != 0) {
|
||||||
|
if (txBufferReadIdx != txBufferWriteIdx) {
|
||||||
|
UCA0TXBUF = txBuffer[txBufferReadIdx];
|
||||||
|
txBufferReadIdx++;
|
||||||
|
if (txBufferReadIdx > UART_TX_BUFFER_SIZE) {
|
||||||
|
txBufferReadIdx = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
disableDataRegisterEmptyInterrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(USCIAB0RX, UART_RX_ISR) {
|
||||||
|
if ((IFG2 | UCA0RXIE) != 0) {
|
||||||
|
if (rxBufferWriteIdx == UART_RX_BUFFER_SIZE - 1) {
|
||||||
|
if (rxBufferReadIdx == UART_RX_BUFFER_SIZE) {
|
||||||
|
// rx buffer overflow
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (rxBufferReadIdx == rxBufferWriteIdx + 1) {
|
||||||
|
// rx buffer overflow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rxBuffer[rxBufferWriteIdx] = UCA0RXBUF;
|
||||||
|
rxBufferWriteIdx++;
|
||||||
|
|
||||||
|
if (rxBufferWriteIdx > UART_RX_BUFFER_SIZE) {
|
||||||
|
rxBufferWriteIdx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t uartHasChar() {
|
||||||
|
return rxBufferWriteIdx != rxBufferReadIdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t uartGetChar() {
|
||||||
|
uint8_t c = rxBuffer[rxBufferReadIdx];
|
||||||
|
rxBufferReadIdx++;
|
||||||
|
if (rxBufferReadIdx > UART_RX_BUFFER_SIZE) {
|
||||||
|
rxBufferReadIdx = 0;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int uartRead() {
|
||||||
|
int res = -1;
|
||||||
|
if (uartHasChar()) {
|
||||||
|
res = uartGetChar();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
22
src/uart.h
Normal file
22
src/uart.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef UART_H_
|
||||||
|
#define UART_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
// #include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define UART_TX_BUFFER_SIZE 32
|
||||||
|
#define UART_RX_BUFFER_SIZE 32
|
||||||
|
|
||||||
|
|
||||||
|
void uartInit();
|
||||||
|
// int uartPutchar(char c, FILE *stream);
|
||||||
|
void uartWrite(uint8_t o);
|
||||||
|
|
||||||
|
uint8_t uartHasChar();
|
||||||
|
uint8_t uartGetChar();
|
||||||
|
|
||||||
|
int uartRead();
|
||||||
|
|
||||||
|
#endif /* UART_H_ */
|
Loading…
x
Reference in New Issue
Block a user