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 17:59:00 2012 +0000
Revision:
8:20759f992d48
Parent:
7:5a25789c3b55
Child:
9:e121a1503afa
bugfix of rx interrupt

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 8:20759f992d48 12 //DigitalOut led3(LED3);
ykuroda 8:20759f992d48 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 8:20759f992d48 86 // led3 = 1;
ykuroda 8:20759f992d48 87 while(Serial::readable())
ykuroda 3:d5353b68105f 88 rxbuf.save(Serial::getc());
ykuroda 8:20759f992d48 89 // led3 = 0;
ykuroda 3:d5353b68105f 90 }
ykuroda 3:d5353b68105f 91
ykuroda 3:d5353b68105f 92 void
ykuroda 3:d5353b68105f 93 iSerial::tx_handler(void)
ykuroda 3:d5353b68105f 94 {
ykuroda 8:20759f992d48 95 // led4 = 1;
ykuroda 7:5a25789c3b55 96 while(Serial::writeable() && txbuf.check())
ykuroda 7:5a25789c3b55 97 Serial::putc( txbuf.read() );
ykuroda 8:20759f992d48 98 // led4 = 0;
ykuroda 3:d5353b68105f 99 }
ykuroda 3:d5353b68105f 100
ykuroda 3:d5353b68105f 101 iSerial::iSerial(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize)
ykuroda 3:d5353b68105f 102 : Serial(_tx, _rx, _name),
ykuroda 5:d83fc550ccbc 103 tx(_tx),
ykuroda 5:d83fc550ccbc 104 rx(_rx),
ykuroda 4:b38ef9675d39 105 txbufsize(_txbufsize),
ykuroda 4:b38ef9675d39 106 rxbufsize(_rxbufsize),
ykuroda 4:b38ef9675d39 107 txbuf(RingBuffer(txbufsize)),
ykuroda 4:b38ef9675d39 108 rxbuf(RingBuffer(rxbufsize)),
ykuroda 5:d83fc550ccbc 109 str(new char [txbufsize])
ykuroda 3:d5353b68105f 110 {
ykuroda 3:d5353b68105f 111 __disable_irq();
ykuroda 3:d5353b68105f 112
ykuroda 3:d5353b68105f 113 attach(this, &iSerial::tx_handler, Serial::TxIrq);
ykuroda 3:d5353b68105f 114 attach(this, &iSerial::rx_handler, Serial::RxIrq);
ykuroda 3:d5353b68105f 115
ykuroda 3:d5353b68105f 116 // format(8,Serial::None,1); // default
ykuroda 3:d5353b68105f 117 // baud(baudrate);
ykuroda 3:d5353b68105f 118
ykuroda 3:d5353b68105f 119 __enable_irq();
ykuroda 5:d83fc550ccbc 120 enable_uart_irq();
ykuroda 3:d5353b68105f 121 }
ykuroda 3:d5353b68105f 122
ykuroda 4:b38ef9675d39 123 iSerial::~iSerial()
ykuroda 4:b38ef9675d39 124 {
ykuroda 4:b38ef9675d39 125 delete [] str;
ykuroda 4:b38ef9675d39 126 }
ykuroda 4:b38ef9675d39 127
ykuroda 3:d5353b68105f 128 int
ykuroda 3:d5353b68105f 129 iSerial::readable(void)
ykuroda 3:d5353b68105f 130 {
ykuroda 3:d5353b68105f 131 return rxbuf.check();
ykuroda 3:d5353b68105f 132 }
ykuroda 3:d5353b68105f 133
ykuroda 3:d5353b68105f 134 int
ykuroda 3:d5353b68105f 135 iSerial::getc(void)
ykuroda 3:d5353b68105f 136 {
ykuroda 3:d5353b68105f 137 unsigned short int c;
ykuroda 3:d5353b68105f 138
ykuroda 8:20759f992d48 139 while(!rxbuf.check()); // wait receiving a character
ykuroda 8:20759f992d48 140 disable_uart_irq();
ykuroda 3:d5353b68105f 141 c = rxbuf.read();
ykuroda 8:20759f992d48 142 enable_uart_irq();
ykuroda 3:d5353b68105f 143
ykuroda 3:d5353b68105f 144 return c;
ykuroda 3:d5353b68105f 145 }
ykuroda 3:d5353b68105f 146
ykuroda 3:d5353b68105f 147 void
ykuroda 3:d5353b68105f 148 iSerial::putc(short ch)
ykuroda 3:d5353b68105f 149 {
ykuroda 3:d5353b68105f 150 if(txbuf.check()==0 && Serial::writeable()){
ykuroda 3:d5353b68105f 151 Serial::putc(ch);
ykuroda 3:d5353b68105f 152
ykuroda 3:d5353b68105f 153 } else {
ykuroda 7:5a25789c3b55 154 while(txbuf.full()){
ykuroda 7:5a25789c3b55 155 disable_uart_irq();
ykuroda 7:5a25789c3b55 156 tx_handler();
ykuroda 7:5a25789c3b55 157 enable_uart_irq();
ykuroda 7:5a25789c3b55 158 }
ykuroda 7:5a25789c3b55 159
ykuroda 7:5a25789c3b55 160 disable_uart_irq();
ykuroda 3:d5353b68105f 161 txbuf.save(ch);
ykuroda 5:d83fc550ccbc 162 enable_uart_irq();
ykuroda 3:d5353b68105f 163 }
ykuroda 3:d5353b68105f 164 }
ykuroda 3:d5353b68105f 165
ykuroda 3:d5353b68105f 166 short int
ykuroda 3:d5353b68105f 167 iSerial::putstr(const char* s)
ykuroda 3:d5353b68105f 168 {
ykuroda 3:d5353b68105f 169 int i=0;
ykuroda 3:d5353b68105f 170 for(; ; i++){
ykuroda 3:d5353b68105f 171 if(*s==0) break;
ykuroda 3:d5353b68105f 172 putc(*s++);
ykuroda 3:d5353b68105f 173 }
ykuroda 3:d5353b68105f 174 return i;
ykuroda 3:d5353b68105f 175 }
ykuroda 3:d5353b68105f 176
ykuroda 3:d5353b68105f 177 short int
ykuroda 3:d5353b68105f 178 iSerial::puts(const char* s)
ykuroda 3:d5353b68105f 179 {
ykuroda 3:d5353b68105f 180 short int n = putstr(s);
ykuroda 3:d5353b68105f 181 putc(CR);
ykuroda 3:d5353b68105f 182 putc(LF);
ykuroda 3:d5353b68105f 183 return n;
ykuroda 3:d5353b68105f 184 }
ykuroda 3:d5353b68105f 185
ykuroda 4:b38ef9675d39 186 char*
ykuroda 4:b38ef9675d39 187 iSerial::printf(const char* format, ...)
ykuroda 4:b38ef9675d39 188 {
ykuroda 4:b38ef9675d39 189 va_list arg;
ykuroda 4:b38ef9675d39 190 va_start(arg,format);
ykuroda 4:b38ef9675d39 191 vsprintf(str, format, arg);
ykuroda 4:b38ef9675d39 192 va_end(arg);
ykuroda 4:b38ef9675d39 193 putstr(str);
ykuroda 4:b38ef9675d39 194 return str;
ykuroda 4:b38ef9675d39 195 }
ykuroda 4:b38ef9675d39 196
ykuroda 4:b38ef9675d39 197
ykuroda 6:8d4b95b90c3b 198 void
ykuroda 6:8d4b95b90c3b 199 iSerial::flush(void)
ykuroda 6:8d4b95b90c3b 200 {
ykuroda 7:5a25789c3b55 201 while(txbuf.check())
ykuroda 7:5a25789c3b55 202 enable_uart_irq();
ykuroda 6:8d4b95b90c3b 203 }
ykuroda 6:8d4b95b90c3b 204
ykuroda 6:8d4b95b90c3b 205