Extend STM mbed board. Thanks Y.Kuroda-san for creating good function.

Dependencies:   RingBuffer

Dependents:   Frequency_Counter_w_GPS_1PPS FreqCntr_GPS1PPS_F746F4xx_w_recipro

Fork of iSerial by Yoji KURODA

Committer:
kenjiArai
Date:
Fri Jan 02 10:35:19 2015 +0000
Revision:
9:45be5c5d5101
Parent:
8:20759f992d48
Child:
11:6bea021727a1
Extend mbed NucleoL152RE, NucleoF401RE and NucleoF411RE. Thanks Y.Kuroda-san to create base function.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 3:d5353b68105f 1 //
ykuroda 3:d5353b68105f 2 // iSerial.cpp ... Serial Driver with Interrupt Rec/Send
ykuroda 3:d5353b68105f 3 //
ykuroda 3:d5353b68105f 4 // 2009.11.13 ... Originally written by Y.Kuroda for Renesas H83664
ykuroda 3:d5353b68105f 5 // 2012.08.31 ... Code convert for mbed in C++
kenjiArai 9:45be5c5d5101 6 // 2015.01.02 ... Added other mbed code by JH1PJL
ykuroda 3:d5353b68105f 7 //
kenjiArai 9:45be5c5d5101 8
ykuroda 4:b38ef9675d39 9 #include <stdarg.h>
ykuroda 3:d5353b68105f 10 #include "mbed.h"
ykuroda 3:d5353b68105f 11 #include "RingBuffer.h"
ykuroda 3:d5353b68105f 12 #include "iSerial.h"
kenjiArai 9:45be5c5d5101 13 // Device header files
kenjiArai 9:45be5c5d5101 14 #include "iSerial_LPC1768.h"
kenjiArai 9:45be5c5d5101 15 #include "iSerial_LPC11U24.h"
kenjiArai 9:45be5c5d5101 16 #include "iSerial_NucleoF4xx.h"
kenjiArai 9:45be5c5d5101 17 #include "iSerial_NucleoL152.h"
ykuroda 4:b38ef9675d39 18
ykuroda 3:d5353b68105f 19 /*
ykuroda 3:d5353b68105f 20 * Interrupt Function
ykuroda 3:d5353b68105f 21 */
ykuroda 3:d5353b68105f 22 void
ykuroda 3:d5353b68105f 23 iSerial::rx_handler(void)
ykuroda 3:d5353b68105f 24 {
ykuroda 8:20759f992d48 25 while(Serial::readable())
ykuroda 3:d5353b68105f 26 rxbuf.save(Serial::getc());
ykuroda 3:d5353b68105f 27 }
ykuroda 3:d5353b68105f 28
ykuroda 3:d5353b68105f 29 void
ykuroda 3:d5353b68105f 30 iSerial::tx_handler(void)
ykuroda 3:d5353b68105f 31 {
ykuroda 7:5a25789c3b55 32 while(Serial::writeable() && txbuf.check())
ykuroda 7:5a25789c3b55 33 Serial::putc( txbuf.read() );
ykuroda 3:d5353b68105f 34 }
ykuroda 3:d5353b68105f 35
kenjiArai 9:45be5c5d5101 36 iSerial::iSerial(PinName _tx, PinName _rx, int _txbufsize, int _rxbufsize)
kenjiArai 9:45be5c5d5101 37 : Serial(_tx, _rx),
kenjiArai 9:45be5c5d5101 38 tx(_tx),
kenjiArai 9:45be5c5d5101 39 rx(_rx),
kenjiArai 9:45be5c5d5101 40 txbufsize(_txbufsize),
kenjiArai 9:45be5c5d5101 41 rxbufsize(_rxbufsize),
kenjiArai 9:45be5c5d5101 42 txbuf(RingBuffer(txbufsize)),
kenjiArai 9:45be5c5d5101 43 rxbuf(RingBuffer(rxbufsize)),
kenjiArai 9:45be5c5d5101 44 str(new char [txbufsize])
ykuroda 3:d5353b68105f 45 {
ykuroda 3:d5353b68105f 46 __disable_irq();
ykuroda 3:d5353b68105f 47
ykuroda 3:d5353b68105f 48 attach(this, &iSerial::tx_handler, Serial::TxIrq);
ykuroda 3:d5353b68105f 49 attach(this, &iSerial::rx_handler, Serial::RxIrq);
ykuroda 3:d5353b68105f 50
ykuroda 3:d5353b68105f 51 // format(8,Serial::None,1); // default
ykuroda 3:d5353b68105f 52 // baud(baudrate);
ykuroda 3:d5353b68105f 53
ykuroda 3:d5353b68105f 54 __enable_irq();
kenjiArai 9:45be5c5d5101 55 enable_uart_irq();
ykuroda 3:d5353b68105f 56 }
ykuroda 3:d5353b68105f 57
ykuroda 4:b38ef9675d39 58 iSerial::~iSerial()
ykuroda 4:b38ef9675d39 59 {
ykuroda 4:b38ef9675d39 60 delete [] str;
ykuroda 4:b38ef9675d39 61 }
ykuroda 4:b38ef9675d39 62
ykuroda 3:d5353b68105f 63 int
ykuroda 3:d5353b68105f 64 iSerial::readable(void)
ykuroda 3:d5353b68105f 65 {
ykuroda 3:d5353b68105f 66 return rxbuf.check();
ykuroda 3:d5353b68105f 67 }
ykuroda 3:d5353b68105f 68
ykuroda 3:d5353b68105f 69 int
ykuroda 3:d5353b68105f 70 iSerial::getc(void)
ykuroda 3:d5353b68105f 71 {
ykuroda 3:d5353b68105f 72 unsigned short int c;
ykuroda 3:d5353b68105f 73
ykuroda 8:20759f992d48 74 while(!rxbuf.check()); // wait receiving a character
ykuroda 8:20759f992d48 75 disable_uart_irq();
ykuroda 3:d5353b68105f 76 c = rxbuf.read();
ykuroda 8:20759f992d48 77 enable_uart_irq();
ykuroda 3:d5353b68105f 78
ykuroda 3:d5353b68105f 79 return c;
ykuroda 3:d5353b68105f 80 }
ykuroda 3:d5353b68105f 81
ykuroda 3:d5353b68105f 82 void
ykuroda 3:d5353b68105f 83 iSerial::putc(short ch)
ykuroda 3:d5353b68105f 84 {
kenjiArai 9:45be5c5d5101 85 if(txbuf.check()==0 && Serial::writeable()) {
ykuroda 3:d5353b68105f 86 Serial::putc(ch);
kenjiArai 9:45be5c5d5101 87
ykuroda 3:d5353b68105f 88 } else {
kenjiArai 9:45be5c5d5101 89 while(txbuf.full()) {
ykuroda 7:5a25789c3b55 90 disable_uart_irq();
ykuroda 7:5a25789c3b55 91 tx_handler();
ykuroda 7:5a25789c3b55 92 enable_uart_irq();
ykuroda 7:5a25789c3b55 93 }
kenjiArai 9:45be5c5d5101 94
ykuroda 7:5a25789c3b55 95 disable_uart_irq();
ykuroda 3:d5353b68105f 96 txbuf.save(ch);
ykuroda 5:d83fc550ccbc 97 enable_uart_irq();
ykuroda 3:d5353b68105f 98 }
ykuroda 3:d5353b68105f 99 }
ykuroda 3:d5353b68105f 100
ykuroda 3:d5353b68105f 101 short int
ykuroda 3:d5353b68105f 102 iSerial::putstr(const char* s)
ykuroda 3:d5353b68105f 103 {
ykuroda 3:d5353b68105f 104 int i=0;
kenjiArai 9:45be5c5d5101 105 for(; ; i++) {
ykuroda 3:d5353b68105f 106 if(*s==0) break;
ykuroda 3:d5353b68105f 107 putc(*s++);
ykuroda 3:d5353b68105f 108 }
ykuroda 3:d5353b68105f 109 return i;
ykuroda 3:d5353b68105f 110 }
ykuroda 3:d5353b68105f 111
ykuroda 3:d5353b68105f 112 short int
ykuroda 3:d5353b68105f 113 iSerial::puts(const char* s)
ykuroda 3:d5353b68105f 114 {
ykuroda 3:d5353b68105f 115 short int n = putstr(s);
ykuroda 3:d5353b68105f 116 putc(CR);
ykuroda 3:d5353b68105f 117 putc(LF);
ykuroda 3:d5353b68105f 118 return n;
ykuroda 3:d5353b68105f 119 }
ykuroda 3:d5353b68105f 120
ykuroda 4:b38ef9675d39 121 char*
ykuroda 4:b38ef9675d39 122 iSerial::printf(const char* format, ...)
ykuroda 4:b38ef9675d39 123 {
ykuroda 4:b38ef9675d39 124 va_list arg;
ykuroda 4:b38ef9675d39 125 va_start(arg,format);
ykuroda 4:b38ef9675d39 126 vsprintf(str, format, arg);
ykuroda 4:b38ef9675d39 127 va_end(arg);
ykuroda 4:b38ef9675d39 128 putstr(str);
ykuroda 4:b38ef9675d39 129 return str;
ykuroda 4:b38ef9675d39 130 }
ykuroda 4:b38ef9675d39 131
ykuroda 6:8d4b95b90c3b 132 void
ykuroda 6:8d4b95b90c3b 133 iSerial::flush(void)
ykuroda 6:8d4b95b90c3b 134 {
ykuroda 7:5a25789c3b55 135 while(txbuf.check())
ykuroda 7:5a25789c3b55 136 enable_uart_irq();
ykuroda 6:8d4b95b90c3b 137 }