modify to nucleo stm32F411

Dependencies:   RingBuffer

Dependents:   MX_control Program_BEAR_Protocol SwitchMode BEAR_Motion ... more

Fork of iSerial by Yoji KURODA

Committer:
soulx
Date:
Sat Jan 16 03:16:37 2016 +0000
Revision:
10:1188a5024611
Parent:
9:e121a1503afa
-

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