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:
Wed Nov 16 13:05:47 2016 +0000
Revision:
11:6bea021727a1
Parent:
9:45be5c5d5101
F746 does NOT work but set dummy code for keeping compatibility.

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