modify to nucleo stm32F411

Dependencies:   RingBuffer

Dependents:   MX_control Program_BEAR_Protocol SwitchMode BEAR_Motion ... more

Fork of iSerial by Yoji KURODA

Committer:
ykuroda
Date:
Mon Sep 03 12:01:55 2012 +0000
Revision:
6:8d4b95b90c3b
Parent:
5:d83fc550ccbc
Child:
7:5a25789c3b55
flush added

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++
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 5:d83fc550ccbc 13 //DigitalOut led1(LED1);
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 4:b38ef9675d39 48
ykuroda 3:d5353b68105f 49 /*
ykuroda 3:d5353b68105f 50 * Interrupt Function
ykuroda 3:d5353b68105f 51 */
ykuroda 3:d5353b68105f 52 void
ykuroda 3:d5353b68105f 53 iSerial::rx_handler(void)
ykuroda 3:d5353b68105f 54 {
ykuroda 3:d5353b68105f 55 if(Serial::readable()){
ykuroda 3:d5353b68105f 56 rxbuf.save(Serial::getc());
ykuroda 3:d5353b68105f 57 }
ykuroda 5:d83fc550ccbc 58 enable_uart_irq();
ykuroda 3:d5353b68105f 59 }
ykuroda 3:d5353b68105f 60
ykuroda 3:d5353b68105f 61 void
ykuroda 3:d5353b68105f 62 iSerial::tx_handler(void)
ykuroda 3:d5353b68105f 63 {
ykuroda 3:d5353b68105f 64 if(Serial::writeable()){
ykuroda 3:d5353b68105f 65 if(txbuf.check()){
ykuroda 3:d5353b68105f 66 Serial::putc( txbuf.read() );
ykuroda 3:d5353b68105f 67 }
ykuroda 3:d5353b68105f 68 }
ykuroda 5:d83fc550ccbc 69 enable_uart_irq();
ykuroda 3:d5353b68105f 70 }
ykuroda 3:d5353b68105f 71
ykuroda 3:d5353b68105f 72 iSerial::iSerial(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize)
ykuroda 3:d5353b68105f 73 : Serial(_tx, _rx, _name),
ykuroda 5:d83fc550ccbc 74 tx(_tx),
ykuroda 5:d83fc550ccbc 75 rx(_rx),
ykuroda 4:b38ef9675d39 76 txbufsize(_txbufsize),
ykuroda 4:b38ef9675d39 77 rxbufsize(_rxbufsize),
ykuroda 4:b38ef9675d39 78 txbuf(RingBuffer(txbufsize)),
ykuroda 4:b38ef9675d39 79 rxbuf(RingBuffer(rxbufsize)),
ykuroda 5:d83fc550ccbc 80 str(new char [txbufsize])
ykuroda 3:d5353b68105f 81 {
ykuroda 3:d5353b68105f 82 __disable_irq();
ykuroda 3:d5353b68105f 83
ykuroda 3:d5353b68105f 84 attach(this, &iSerial::tx_handler, Serial::TxIrq);
ykuroda 3:d5353b68105f 85 attach(this, &iSerial::rx_handler, Serial::RxIrq);
ykuroda 3:d5353b68105f 86
ykuroda 3:d5353b68105f 87 // format(8,Serial::None,1); // default
ykuroda 3:d5353b68105f 88 // baud(baudrate);
ykuroda 3:d5353b68105f 89
ykuroda 3:d5353b68105f 90 __enable_irq();
ykuroda 5:d83fc550ccbc 91 enable_uart_irq();
ykuroda 3:d5353b68105f 92 }
ykuroda 3:d5353b68105f 93
ykuroda 4:b38ef9675d39 94 iSerial::~iSerial()
ykuroda 4:b38ef9675d39 95 {
ykuroda 4:b38ef9675d39 96 delete [] str;
ykuroda 4:b38ef9675d39 97 }
ykuroda 4:b38ef9675d39 98
ykuroda 3:d5353b68105f 99 int
ykuroda 3:d5353b68105f 100 iSerial::readable(void)
ykuroda 3:d5353b68105f 101 {
ykuroda 3:d5353b68105f 102 return rxbuf.check();
ykuroda 3:d5353b68105f 103 }
ykuroda 3:d5353b68105f 104
ykuroda 3:d5353b68105f 105 int
ykuroda 3:d5353b68105f 106 iSerial::getc(void)
ykuroda 3:d5353b68105f 107 {
ykuroda 3:d5353b68105f 108 unsigned short int c;
ykuroda 3:d5353b68105f 109
ykuroda 3:d5353b68105f 110 while(!rxbuf.check());
ykuroda 3:d5353b68105f 111 c = rxbuf.read();
ykuroda 3:d5353b68105f 112
ykuroda 3:d5353b68105f 113 return c;
ykuroda 3:d5353b68105f 114 }
ykuroda 3:d5353b68105f 115
ykuroda 3:d5353b68105f 116 void
ykuroda 3:d5353b68105f 117 iSerial::putc(short ch)
ykuroda 3:d5353b68105f 118 {
ykuroda 3:d5353b68105f 119 if(txbuf.check()==0 && Serial::writeable()){
ykuroda 3:d5353b68105f 120 Serial::putc(ch);
ykuroda 3:d5353b68105f 121
ykuroda 3:d5353b68105f 122 } else {
ykuroda 3:d5353b68105f 123 while(txbuf.full());
ykuroda 3:d5353b68105f 124 txbuf.save(ch);
ykuroda 5:d83fc550ccbc 125 enable_uart_irq();
ykuroda 3:d5353b68105f 126 }
ykuroda 3:d5353b68105f 127 }
ykuroda 3:d5353b68105f 128
ykuroda 3:d5353b68105f 129 short int
ykuroda 3:d5353b68105f 130 iSerial::putstr(const char* s)
ykuroda 3:d5353b68105f 131 {
ykuroda 3:d5353b68105f 132 int i=0;
ykuroda 3:d5353b68105f 133 for(; ; i++){
ykuroda 3:d5353b68105f 134 if(*s==0) break;
ykuroda 3:d5353b68105f 135 putc(*s++);
ykuroda 3:d5353b68105f 136 }
ykuroda 3:d5353b68105f 137 return i;
ykuroda 3:d5353b68105f 138 }
ykuroda 3:d5353b68105f 139
ykuroda 3:d5353b68105f 140 short int
ykuroda 3:d5353b68105f 141 iSerial::puts(const char* s)
ykuroda 3:d5353b68105f 142 {
ykuroda 3:d5353b68105f 143 short int n = putstr(s);
ykuroda 3:d5353b68105f 144 putc(CR);
ykuroda 3:d5353b68105f 145 putc(LF);
ykuroda 3:d5353b68105f 146 return n;
ykuroda 3:d5353b68105f 147 }
ykuroda 3:d5353b68105f 148
ykuroda 4:b38ef9675d39 149 char*
ykuroda 4:b38ef9675d39 150 iSerial::printf(const char* format, ...)
ykuroda 4:b38ef9675d39 151 {
ykuroda 4:b38ef9675d39 152 va_list arg;
ykuroda 4:b38ef9675d39 153 va_start(arg,format);
ykuroda 4:b38ef9675d39 154 vsprintf(str, format, arg);
ykuroda 4:b38ef9675d39 155 va_end(arg);
ykuroda 4:b38ef9675d39 156 putstr(str);
ykuroda 4:b38ef9675d39 157 return str;
ykuroda 4:b38ef9675d39 158 }
ykuroda 4:b38ef9675d39 159
ykuroda 4:b38ef9675d39 160
ykuroda 6:8d4b95b90c3b 161 void
ykuroda 6:8d4b95b90c3b 162 iSerial::flush(void)
ykuroda 6:8d4b95b90c3b 163 {
ykuroda 6:8d4b95b90c3b 164 while(txbuf.check());
ykuroda 6:8d4b95b90c3b 165 }
ykuroda 6:8d4b95b90c3b 166
ykuroda 6:8d4b95b90c3b 167