Extend STM mbed board. Thanks Y.Kuroda-san for creating good function.
Dependents: Frequency_Counter_w_GPS_1PPS FreqCntr_GPS1PPS_F746F4xx_w_recipro
Fork of iSerial by
iSerial.cpp@11:6bea021727a1, 2016-11-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |