Yuki Suga / RTnoV4

Dependencies:   EthernetInterface mbed-rtos

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers UART.cpp Source File

UART.cpp

00001 #define RTNO_SUBMODULE_DEFINE
00002 
00003 #include "mbed.h"
00004 #include "UART.h"
00005 
00006 #define UART_RX_BUFFER_SIZE 64
00007 
00008 static Serial *m_pSerial;
00009 unsigned char uart_rx_buffer[UART_RX_BUFFER_SIZE];
00010 int uart_rx_buffer_pointer_head = 0;
00011 int uart_rx_buffer_pointer_tail = 0;
00012 
00013 
00014 /**
00015  * Push data to ring buffer.
00016  */
00017 int uart_rx_buffer_push(unsigned char* c) {
00018     uart_rx_buffer[uart_rx_buffer_pointer_tail] = *c;
00019     uart_rx_buffer_pointer_tail++;
00020     if(uart_rx_buffer_pointer_tail >= UART_RX_BUFFER_SIZE) {
00021         uart_rx_buffer_pointer_tail = 0;
00022     }
00023     return 0;
00024 }
00025 
00026 
00027 
00028 /**
00029  * Pop data fron ring buffer
00030  */
00031 int uart_rx_buffer_pop(unsigned char *c) {
00032     *c = uart_rx_buffer[uart_rx_buffer_pointer_head];
00033     uart_rx_buffer_pointer_head++;
00034     if(uart_rx_buffer_pointer_head >= UART_RX_BUFFER_SIZE) {
00035         uart_rx_buffer_pointer_head = 0;
00036     }
00037     return 0;
00038 }
00039 
00040 int uart_rx_buffer_get_size() {
00041     int size = uart_rx_buffer_pointer_tail - uart_rx_buffer_pointer_head;
00042     if(size < 0) {
00043         size += UART_RX_BUFFER_SIZE;
00044     }
00045     return size;
00046 }
00047 
00048 void rx_isr(void) {
00049     int8_t c = m_pSerial->getc();
00050     uart_rx_buffer_push((uint8_t*)&c);
00051 }
00052 
00053 
00054 
00055 void UART_init(unsigned char num, unsigned long baudrate)
00056 {
00057     PinName rx, tx;
00058     switch(num) {
00059     case 0:
00060       rx = USBRX; tx = USBTX;
00061       break;
00062     case 1:
00063       tx = p9, rx = p10;
00064       break;
00065     case 2:
00066       tx = p13, rx = p14;
00067       break;
00068     case 3:
00069       tx = p28, rx = p27;
00070       break;
00071     }
00072     
00073     m_pSerial = new Serial(tx, rx);
00074     m_pSerial->baud(baudrate);
00075     m_pSerial->attach(rx_isr, Serial::RxIrq);
00076 
00077     SerialDevice_putc = UART_putc;
00078     SerialDevice_getc = UART_getc;
00079     SerialDevice_available = UART_available;
00080 }
00081 
00082 void UART_putc(const char c) {
00083   while(!m_pSerial->writeable()) {
00084     wait_us(100);
00085   }
00086   m_pSerial->putc(c);
00087 }
00088 
00089 uint8_t UART_available()
00090 {
00091     return uart_rx_buffer_get_size();
00092 }
00093 
00094 
00095 uint8_t UART_getc()
00096 {
00097     unsigned char c;
00098     uart_rx_buffer_pop(&c);
00099     return c;
00100 }