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:26:38 2012 +0000
Revision:
7:5a25789c3b55
Parent:
6:8d4b95b90c3b
Child:
8:20759f992d48
bugfix of tx 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 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