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@7:5a25789c3b55, 2012-09-03 (annotated)
- Committer:
- ykuroda
- Date:
- Mon Sep 03 17:26:38 2012 +0000
- Revision:
- 7:5a25789c3b55
- Parent:
- 6:8d4b95b90c3b
- Child:
- 8:20759f992d48
bugfix of tx interrupt
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++ |
ykuroda | 3:d5353b68105f | 6 | // |
ykuroda | 4:b38ef9675d39 | 7 | #include <stdarg.h> |
ykuroda | 3:d5353b68105f | 8 | #include "mbed.h" |
ykuroda | 3:d5353b68105f | 9 | #include "RingBuffer.h" |
ykuroda | 3:d5353b68105f | 10 | #include "iSerial.h" |
ykuroda | 3:d5353b68105f | 11 | |
ykuroda | 3:d5353b68105f | 12 | |
ykuroda | 7:5a25789c3b55 | 13 | DigitalOut led4(LED4); |
ykuroda | 4:b38ef9675d39 | 14 | |
ykuroda | 4:b38ef9675d39 | 15 | |
ykuroda | 5:d83fc550ccbc | 16 | void |
ykuroda | 5:d83fc550ccbc | 17 | iSerial::enable_uart_irq(void) |
ykuroda | 5:d83fc550ccbc | 18 | { |
ykuroda | 5:d83fc550ccbc | 19 | switch(tx){ |
ykuroda | 5:d83fc550ccbc | 20 | case USBTX: |
ykuroda | 5:d83fc550ccbc | 21 | #if defined(TARGET_LPC1768) |
ykuroda | 5:d83fc550ccbc | 22 | NVIC_EnableIRQ(UART2_IRQn); |
ykuroda | 5:d83fc550ccbc | 23 | #elif defined(TARGET_LPC11U24) |
ykuroda | 5:d83fc550ccbc | 24 | NVIC_EnableIRQ(UART_IRQn); |
ykuroda | 5:d83fc550ccbc | 25 | #endif |
ykuroda | 5:d83fc550ccbc | 26 | // led1 = !led1; |
ykuroda | 5:d83fc550ccbc | 27 | break; |
ykuroda | 5:d83fc550ccbc | 28 | |
ykuroda | 5:d83fc550ccbc | 29 | case p9: |
ykuroda | 5:d83fc550ccbc | 30 | #if defined(TARGET_LPC1768) |
ykuroda | 5:d83fc550ccbc | 31 | NVIC_EnableIRQ(UART1_IRQn); |
ykuroda | 5:d83fc550ccbc | 32 | #elif defined(TARGET_LPC11U24) |
ykuroda | 5:d83fc550ccbc | 33 | NVIC_EnableIRQ(UART_IRQn); |
ykuroda | 5:d83fc550ccbc | 34 | #endif |
ykuroda | 5:d83fc550ccbc | 35 | break; |
ykuroda | 4:b38ef9675d39 | 36 | |
ykuroda | 5:d83fc550ccbc | 37 | #if defined(TARGET_LPC1768) |
ykuroda | 5:d83fc550ccbc | 38 | case p13: |
ykuroda | 5:d83fc550ccbc | 39 | NVIC_EnableIRQ(UART3_IRQn); |
ykuroda | 5:d83fc550ccbc | 40 | break; |
ykuroda | 5:d83fc550ccbc | 41 | case p28: |
ykuroda | 5:d83fc550ccbc | 42 | NVIC_EnableIRQ(UART0_IRQn); |
ykuroda | 5:d83fc550ccbc | 43 | break; |
ykuroda | 5:d83fc550ccbc | 44 | #endif |
ykuroda | 5:d83fc550ccbc | 45 | } |
ykuroda | 5:d83fc550ccbc | 46 | } |
ykuroda | 4:b38ef9675d39 | 47 | |
ykuroda | 7:5a25789c3b55 | 48 | void |
ykuroda | 7:5a25789c3b55 | 49 | iSerial::disable_uart_irq(void) |
ykuroda | 7:5a25789c3b55 | 50 | { |
ykuroda | 7:5a25789c3b55 | 51 | switch(tx){ |
ykuroda | 7:5a25789c3b55 | 52 | case USBTX: |
ykuroda | 7:5a25789c3b55 | 53 | #if defined(TARGET_LPC1768) |
ykuroda | 7:5a25789c3b55 | 54 | NVIC_DisableIRQ(UART2_IRQn); |
ykuroda | 7:5a25789c3b55 | 55 | #elif defined(TARGET_LPC11U24) |
ykuroda | 7:5a25789c3b55 | 56 | NVIC_DisableIRQ(UART_IRQn); |
ykuroda | 7:5a25789c3b55 | 57 | #endif |
ykuroda | 7:5a25789c3b55 | 58 | // led1 = !led1; |
ykuroda | 7:5a25789c3b55 | 59 | break; |
ykuroda | 7:5a25789c3b55 | 60 | |
ykuroda | 7:5a25789c3b55 | 61 | case p9: |
ykuroda | 7:5a25789c3b55 | 62 | #if defined(TARGET_LPC1768) |
ykuroda | 7:5a25789c3b55 | 63 | NVIC_DisableIRQ(UART1_IRQn); |
ykuroda | 7:5a25789c3b55 | 64 | #elif defined(TARGET_LPC11U24) |
ykuroda | 7:5a25789c3b55 | 65 | NVIC_DisableIRQ(UART_IRQn); |
ykuroda | 7:5a25789c3b55 | 66 | #endif |
ykuroda | 7:5a25789c3b55 | 67 | break; |
ykuroda | 7:5a25789c3b55 | 68 | |
ykuroda | 7:5a25789c3b55 | 69 | #if defined(TARGET_LPC1768) |
ykuroda | 7:5a25789c3b55 | 70 | case p13: |
ykuroda | 7:5a25789c3b55 | 71 | NVIC_DisableIRQ(UART3_IRQn); |
ykuroda | 7:5a25789c3b55 | 72 | break; |
ykuroda | 7:5a25789c3b55 | 73 | case p28: |
ykuroda | 7:5a25789c3b55 | 74 | NVIC_DisableIRQ(UART0_IRQn); |
ykuroda | 7:5a25789c3b55 | 75 | break; |
ykuroda | 7:5a25789c3b55 | 76 | #endif |
ykuroda | 7:5a25789c3b55 | 77 | } |
ykuroda | 7:5a25789c3b55 | 78 | } |
ykuroda | 4:b38ef9675d39 | 79 | |
ykuroda | 3:d5353b68105f | 80 | /* |
ykuroda | 3:d5353b68105f | 81 | * Interrupt Function |
ykuroda | 3:d5353b68105f | 82 | */ |
ykuroda | 3:d5353b68105f | 83 | void |
ykuroda | 3:d5353b68105f | 84 | iSerial::rx_handler(void) |
ykuroda | 3:d5353b68105f | 85 | { |
ykuroda | 7:5a25789c3b55 | 86 | // disable_uart_irq(); |
ykuroda | 3:d5353b68105f | 87 | if(Serial::readable()){ |
ykuroda | 3:d5353b68105f | 88 | rxbuf.save(Serial::getc()); |
ykuroda | 3:d5353b68105f | 89 | } |
ykuroda | 7:5a25789c3b55 | 90 | // enable_uart_irq(); |
ykuroda | 3:d5353b68105f | 91 | } |
ykuroda | 3:d5353b68105f | 92 | |
ykuroda | 3:d5353b68105f | 93 | void |
ykuroda | 3:d5353b68105f | 94 | iSerial::tx_handler(void) |
ykuroda | 3:d5353b68105f | 95 | { |
ykuroda | 7:5a25789c3b55 | 96 | led4 = 1; |
ykuroda | 7:5a25789c3b55 | 97 | // disable_uart_irq(); |
ykuroda | 7:5a25789c3b55 | 98 | while(Serial::writeable() && txbuf.check()) |
ykuroda | 7:5a25789c3b55 | 99 | Serial::putc( txbuf.read() ); |
ykuroda | 7:5a25789c3b55 | 100 | // enable_uart_irq(); |
ykuroda | 7:5a25789c3b55 | 101 | led4 = 0; |
ykuroda | 3:d5353b68105f | 102 | } |
ykuroda | 3:d5353b68105f | 103 | |
ykuroda | 3:d5353b68105f | 104 | iSerial::iSerial(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize) |
ykuroda | 3:d5353b68105f | 105 | : Serial(_tx, _rx, _name), |
ykuroda | 5:d83fc550ccbc | 106 | tx(_tx), |
ykuroda | 5:d83fc550ccbc | 107 | rx(_rx), |
ykuroda | 4:b38ef9675d39 | 108 | txbufsize(_txbufsize), |
ykuroda | 4:b38ef9675d39 | 109 | rxbufsize(_rxbufsize), |
ykuroda | 4:b38ef9675d39 | 110 | txbuf(RingBuffer(txbufsize)), |
ykuroda | 4:b38ef9675d39 | 111 | rxbuf(RingBuffer(rxbufsize)), |
ykuroda | 5:d83fc550ccbc | 112 | str(new char [txbufsize]) |
ykuroda | 3:d5353b68105f | 113 | { |
ykuroda | 3:d5353b68105f | 114 | __disable_irq(); |
ykuroda | 3:d5353b68105f | 115 | |
ykuroda | 3:d5353b68105f | 116 | attach(this, &iSerial::tx_handler, Serial::TxIrq); |
ykuroda | 3:d5353b68105f | 117 | attach(this, &iSerial::rx_handler, Serial::RxIrq); |
ykuroda | 3:d5353b68105f | 118 | |
ykuroda | 3:d5353b68105f | 119 | // format(8,Serial::None,1); // default |
ykuroda | 3:d5353b68105f | 120 | // baud(baudrate); |
ykuroda | 3:d5353b68105f | 121 | |
ykuroda | 3:d5353b68105f | 122 | __enable_irq(); |
ykuroda | 5:d83fc550ccbc | 123 | enable_uart_irq(); |
ykuroda | 3:d5353b68105f | 124 | } |
ykuroda | 3:d5353b68105f | 125 | |
ykuroda | 4:b38ef9675d39 | 126 | iSerial::~iSerial() |
ykuroda | 4:b38ef9675d39 | 127 | { |
ykuroda | 4:b38ef9675d39 | 128 | delete [] str; |
ykuroda | 4:b38ef9675d39 | 129 | } |
ykuroda | 4:b38ef9675d39 | 130 | |
ykuroda | 3:d5353b68105f | 131 | int |
ykuroda | 3:d5353b68105f | 132 | iSerial::readable(void) |
ykuroda | 3:d5353b68105f | 133 | { |
ykuroda | 3:d5353b68105f | 134 | return rxbuf.check(); |
ykuroda | 3:d5353b68105f | 135 | } |
ykuroda | 3:d5353b68105f | 136 | |
ykuroda | 3:d5353b68105f | 137 | int |
ykuroda | 3:d5353b68105f | 138 | iSerial::getc(void) |
ykuroda | 3:d5353b68105f | 139 | { |
ykuroda | 3:d5353b68105f | 140 | unsigned short int c; |
ykuroda | 3:d5353b68105f | 141 | |
ykuroda | 7:5a25789c3b55 | 142 | while(!rxbuf.check()) // wait receiving a character |
ykuroda | 7:5a25789c3b55 | 143 | enable_uart_irq(); |
ykuroda | 3:d5353b68105f | 144 | c = rxbuf.read(); |
ykuroda | 3:d5353b68105f | 145 | |
ykuroda | 3:d5353b68105f | 146 | return c; |
ykuroda | 3:d5353b68105f | 147 | } |
ykuroda | 3:d5353b68105f | 148 | |
ykuroda | 3:d5353b68105f | 149 | void |
ykuroda | 3:d5353b68105f | 150 | iSerial::putc(short ch) |
ykuroda | 3:d5353b68105f | 151 | { |
ykuroda | 3:d5353b68105f | 152 | if(txbuf.check()==0 && Serial::writeable()){ |
ykuroda | 3:d5353b68105f | 153 | Serial::putc(ch); |
ykuroda | 3:d5353b68105f | 154 | |
ykuroda | 3:d5353b68105f | 155 | } else { |
ykuroda | 7:5a25789c3b55 | 156 | while(txbuf.full()){ |
ykuroda | 7:5a25789c3b55 | 157 | disable_uart_irq(); |
ykuroda | 7:5a25789c3b55 | 158 | tx_handler(); |
ykuroda | 7:5a25789c3b55 | 159 | enable_uart_irq(); |
ykuroda | 7:5a25789c3b55 | 160 | } |
ykuroda | 7:5a25789c3b55 | 161 | |
ykuroda | 7:5a25789c3b55 | 162 | disable_uart_irq(); |
ykuroda | 3:d5353b68105f | 163 | txbuf.save(ch); |
ykuroda | 5:d83fc550ccbc | 164 | enable_uart_irq(); |
ykuroda | 3:d5353b68105f | 165 | } |
ykuroda | 3:d5353b68105f | 166 | } |
ykuroda | 3:d5353b68105f | 167 | |
ykuroda | 3:d5353b68105f | 168 | short int |
ykuroda | 3:d5353b68105f | 169 | iSerial::putstr(const char* s) |
ykuroda | 3:d5353b68105f | 170 | { |
ykuroda | 3:d5353b68105f | 171 | int i=0; |
ykuroda | 3:d5353b68105f | 172 | for(; ; i++){ |
ykuroda | 3:d5353b68105f | 173 | if(*s==0) break; |
ykuroda | 3:d5353b68105f | 174 | putc(*s++); |
ykuroda | 3:d5353b68105f | 175 | } |
ykuroda | 3:d5353b68105f | 176 | return i; |
ykuroda | 3:d5353b68105f | 177 | } |
ykuroda | 3:d5353b68105f | 178 | |
ykuroda | 3:d5353b68105f | 179 | short int |
ykuroda | 3:d5353b68105f | 180 | iSerial::puts(const char* s) |
ykuroda | 3:d5353b68105f | 181 | { |
ykuroda | 3:d5353b68105f | 182 | short int n = putstr(s); |
ykuroda | 3:d5353b68105f | 183 | putc(CR); |
ykuroda | 3:d5353b68105f | 184 | putc(LF); |
ykuroda | 3:d5353b68105f | 185 | return n; |
ykuroda | 3:d5353b68105f | 186 | } |
ykuroda | 3:d5353b68105f | 187 | |
ykuroda | 4:b38ef9675d39 | 188 | char* |
ykuroda | 4:b38ef9675d39 | 189 | iSerial::printf(const char* format, ...) |
ykuroda | 4:b38ef9675d39 | 190 | { |
ykuroda | 4:b38ef9675d39 | 191 | va_list arg; |
ykuroda | 4:b38ef9675d39 | 192 | va_start(arg,format); |
ykuroda | 4:b38ef9675d39 | 193 | vsprintf(str, format, arg); |
ykuroda | 4:b38ef9675d39 | 194 | va_end(arg); |
ykuroda | 4:b38ef9675d39 | 195 | putstr(str); |
ykuroda | 4:b38ef9675d39 | 196 | return str; |
ykuroda | 4:b38ef9675d39 | 197 | } |
ykuroda | 4:b38ef9675d39 | 198 | |
ykuroda | 4:b38ef9675d39 | 199 | |
ykuroda | 6:8d4b95b90c3b | 200 | void |
ykuroda | 6:8d4b95b90c3b | 201 | iSerial::flush(void) |
ykuroda | 6:8d4b95b90c3b | 202 | { |
ykuroda | 7:5a25789c3b55 | 203 | while(txbuf.check()) |
ykuroda | 7:5a25789c3b55 | 204 | enable_uart_irq(); |
ykuroda | 6:8d4b95b90c3b | 205 | } |
ykuroda | 6:8d4b95b90c3b | 206 | |
ykuroda | 6:8d4b95b90c3b | 207 |