modify to nucleo stm32F411
Dependencies: RingBuffer
Dependents: MX_control Program_BEAR_Protocol SwitchMode BEAR_Motion ... more
Fork of iSerial by
SerialIntr.cpp@0:1d193cb1a933, 2012-08-31 (annotated)
- Committer:
- ykuroda
- Date:
- Fri Aug 31 17:17:12 2012 +0000
- Revision:
- 0:1d193cb1a933
1st coding
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ykuroda | 0:1d193cb1a933 | 1 | // |
ykuroda | 0:1d193cb1a933 | 2 | // SerialIntr.cpp ... Serial Driver with Interrupt Rec/Send |
ykuroda | 0:1d193cb1a933 | 3 | // |
ykuroda | 0:1d193cb1a933 | 4 | // 2009.11.13 ... Originally written by Y.Kuroda for Renesas H83664 |
ykuroda | 0:1d193cb1a933 | 5 | // 2012.08.31 ... Code convert for mbed in C++ |
ykuroda | 0:1d193cb1a933 | 6 | // |
ykuroda | 0:1d193cb1a933 | 7 | #include "mbed.h" |
ykuroda | 0:1d193cb1a933 | 8 | #include "RingBuffer.h" |
ykuroda | 0:1d193cb1a933 | 9 | #include "SerialIntr.h" |
ykuroda | 0:1d193cb1a933 | 10 | |
ykuroda | 0:1d193cb1a933 | 11 | |
ykuroda | 0:1d193cb1a933 | 12 | //DigitalOut led1(LED1); |
ykuroda | 0:1d193cb1a933 | 13 | //DigitalOut led2(LED2); |
ykuroda | 0:1d193cb1a933 | 14 | //DigitalOut led3(LED3); |
ykuroda | 0:1d193cb1a933 | 15 | //DigitalOut led4(LED4); |
ykuroda | 0:1d193cb1a933 | 16 | |
ykuroda | 0:1d193cb1a933 | 17 | /* |
ykuroda | 0:1d193cb1a933 | 18 | * Interrupt Function |
ykuroda | 0:1d193cb1a933 | 19 | */ |
ykuroda | 0:1d193cb1a933 | 20 | void |
ykuroda | 0:1d193cb1a933 | 21 | SerialIntr::rx_handler(void) |
ykuroda | 0:1d193cb1a933 | 22 | { |
ykuroda | 0:1d193cb1a933 | 23 | // led4 = !led4; |
ykuroda | 0:1d193cb1a933 | 24 | |
ykuroda | 0:1d193cb1a933 | 25 | if(Serial::readable()){ |
ykuroda | 0:1d193cb1a933 | 26 | // led1 = !led1; |
ykuroda | 0:1d193cb1a933 | 27 | rxbuf.save(Serial::getc()); |
ykuroda | 0:1d193cb1a933 | 28 | // led2 = !led2; |
ykuroda | 0:1d193cb1a933 | 29 | |
ykuroda | 0:1d193cb1a933 | 30 | } |
ykuroda | 0:1d193cb1a933 | 31 | |
ykuroda | 0:1d193cb1a933 | 32 | NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); |
ykuroda | 0:1d193cb1a933 | 33 | } |
ykuroda | 0:1d193cb1a933 | 34 | |
ykuroda | 0:1d193cb1a933 | 35 | void |
ykuroda | 0:1d193cb1a933 | 36 | SerialIntr::tx_handler(void) |
ykuroda | 0:1d193cb1a933 | 37 | { |
ykuroda | 0:1d193cb1a933 | 38 | // led3 = !led3; |
ykuroda | 0:1d193cb1a933 | 39 | |
ykuroda | 0:1d193cb1a933 | 40 | if(writeable()){ |
ykuroda | 0:1d193cb1a933 | 41 | if(txbuf.check()){ |
ykuroda | 0:1d193cb1a933 | 42 | Serial::putc( txbuf.read() ); |
ykuroda | 0:1d193cb1a933 | 43 | } |
ykuroda | 0:1d193cb1a933 | 44 | } |
ykuroda | 0:1d193cb1a933 | 45 | NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); |
ykuroda | 0:1d193cb1a933 | 46 | } |
ykuroda | 0:1d193cb1a933 | 47 | |
ykuroda | 0:1d193cb1a933 | 48 | /* |
ykuroda | 0:1d193cb1a933 | 49 | * void sci_init(void) |
ykuroda | 0:1d193cb1a933 | 50 | * |
ykuroda | 0:1d193cb1a933 | 51 | * ポート初期化関数....すべてのI/Oの設定を行っている. |
ykuroda | 0:1d193cb1a933 | 52 | * |
ykuroda | 0:1d193cb1a933 | 53 | * 引数:なし |
ykuroda | 0:1d193cb1a933 | 54 | * 戻り値:なし |
ykuroda | 0:1d193cb1a933 | 55 | * |
ykuroda | 0:1d193cb1a933 | 56 | */ |
ykuroda | 0:1d193cb1a933 | 57 | SerialIntr::SerialIntr(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize) |
ykuroda | 0:1d193cb1a933 | 58 | : Serial(_tx, _rx, _name), |
ykuroda | 0:1d193cb1a933 | 59 | txbuf(RingBuffer(_txbufsize)), |
ykuroda | 0:1d193cb1a933 | 60 | rxbuf(RingBuffer(_rxbufsize)) |
ykuroda | 0:1d193cb1a933 | 61 | { |
ykuroda | 0:1d193cb1a933 | 62 | __disable_irq(); |
ykuroda | 0:1d193cb1a933 | 63 | |
ykuroda | 0:1d193cb1a933 | 64 | attach(this, &SerialIntr::tx_handler, Serial::TxIrq); |
ykuroda | 0:1d193cb1a933 | 65 | attach(this, &SerialIntr::rx_handler, Serial::RxIrq); |
ykuroda | 0:1d193cb1a933 | 66 | |
ykuroda | 0:1d193cb1a933 | 67 | // format(8,Serial::None,1); // default |
ykuroda | 0:1d193cb1a933 | 68 | // baud(baudrate); |
ykuroda | 0:1d193cb1a933 | 69 | |
ykuroda | 0:1d193cb1a933 | 70 | __enable_irq(); |
ykuroda | 0:1d193cb1a933 | 71 | NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); |
ykuroda | 0:1d193cb1a933 | 72 | } |
ykuroda | 0:1d193cb1a933 | 73 | |
ykuroda | 0:1d193cb1a933 | 74 | /* |
ykuroda | 0:1d193cb1a933 | 75 | * シリアル入力に文字があるかどうかチェック |
ykuroda | 0:1d193cb1a933 | 76 | * 返値: バッファにある文字数 |
ykuroda | 0:1d193cb1a933 | 77 | */ |
ykuroda | 0:1d193cb1a933 | 78 | int |
ykuroda | 0:1d193cb1a933 | 79 | SerialIntr::readable(void) |
ykuroda | 0:1d193cb1a933 | 80 | { |
ykuroda | 0:1d193cb1a933 | 81 | return rxbuf.check(); |
ykuroda | 0:1d193cb1a933 | 82 | } |
ykuroda | 0:1d193cb1a933 | 83 | |
ykuroda | 0:1d193cb1a933 | 84 | /* |
ykuroda | 0:1d193cb1a933 | 85 | * シリアルから一文字入力 |
ykuroda | 0:1d193cb1a933 | 86 | * --- 文字入力を待つ |
ykuroda | 0:1d193cb1a933 | 87 | */ |
ykuroda | 0:1d193cb1a933 | 88 | int |
ykuroda | 0:1d193cb1a933 | 89 | SerialIntr::getc(void) |
ykuroda | 0:1d193cb1a933 | 90 | { |
ykuroda | 0:1d193cb1a933 | 91 | unsigned short int c; |
ykuroda | 0:1d193cb1a933 | 92 | |
ykuroda | 0:1d193cb1a933 | 93 | while(!rxbuf.check()); |
ykuroda | 0:1d193cb1a933 | 94 | c = rxbuf.read(); |
ykuroda | 0:1d193cb1a933 | 95 | |
ykuroda | 0:1d193cb1a933 | 96 | return c; |
ykuroda | 0:1d193cb1a933 | 97 | } |
ykuroda | 0:1d193cb1a933 | 98 | |
ykuroda | 0:1d193cb1a933 | 99 | |
ykuroda | 0:1d193cb1a933 | 100 | /* |
ykuroda | 0:1d193cb1a933 | 101 | * シリアルへ一文字出力 |
ykuroda | 0:1d193cb1a933 | 102 | */ |
ykuroda | 0:1d193cb1a933 | 103 | void |
ykuroda | 0:1d193cb1a933 | 104 | SerialIntr::putc(short ch) |
ykuroda | 0:1d193cb1a933 | 105 | { |
ykuroda | 0:1d193cb1a933 | 106 | if(txbuf.check()==0 && Serial::writeable()){ |
ykuroda | 0:1d193cb1a933 | 107 | Serial::putc(ch); |
ykuroda | 0:1d193cb1a933 | 108 | |
ykuroda | 0:1d193cb1a933 | 109 | } else { |
ykuroda | 0:1d193cb1a933 | 110 | while(txbuf.full()); |
ykuroda | 0:1d193cb1a933 | 111 | txbuf.save(ch); |
ykuroda | 0:1d193cb1a933 | 112 | NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn); |
ykuroda | 0:1d193cb1a933 | 113 | } |
ykuroda | 0:1d193cb1a933 | 114 | } |
ykuroda | 0:1d193cb1a933 | 115 | |
ykuroda | 0:1d193cb1a933 | 116 | /* |
ykuroda | 0:1d193cb1a933 | 117 | * シリアルへ文字列を出力 |
ykuroda | 0:1d193cb1a933 | 118 | * 注:一回の最大文字数はLINESIZE |
ykuroda | 0:1d193cb1a933 | 119 | * 注:文字列の終わりにはヌル文字が必要. |
ykuroda | 0:1d193cb1a933 | 120 | * |
ykuroda | 0:1d193cb1a933 | 121 | * 引数:文字列へのポインタ |
ykuroda | 0:1d193cb1a933 | 122 | * 返値:出力した文字数 |
ykuroda | 0:1d193cb1a933 | 123 | */ |
ykuroda | 0:1d193cb1a933 | 124 | short int |
ykuroda | 0:1d193cb1a933 | 125 | SerialIntr::putstr(const char* s) |
ykuroda | 0:1d193cb1a933 | 126 | { |
ykuroda | 0:1d193cb1a933 | 127 | int i=0; |
ykuroda | 0:1d193cb1a933 | 128 | for(; ; i++){ |
ykuroda | 0:1d193cb1a933 | 129 | if(*s==0) break; |
ykuroda | 0:1d193cb1a933 | 130 | putc(*s++); |
ykuroda | 0:1d193cb1a933 | 131 | } |
ykuroda | 0:1d193cb1a933 | 132 | return i; |
ykuroda | 0:1d193cb1a933 | 133 | } |
ykuroda | 0:1d193cb1a933 | 134 | |
ykuroda | 0:1d193cb1a933 | 135 | /* short int sci_puts(char* s) |
ykuroda | 0:1d193cb1a933 | 136 | * シリアルへ文字列を一行出力 |
ykuroda | 0:1d193cb1a933 | 137 | * 注:最後に改行コードを送る他はsci_putstrと同じ |
ykuroda | 0:1d193cb1a933 | 138 | * |
ykuroda | 0:1d193cb1a933 | 139 | * 引数:文字列へのポインタ |
ykuroda | 0:1d193cb1a933 | 140 | * 返値:出力した文字数 |
ykuroda | 0:1d193cb1a933 | 141 | */ |
ykuroda | 0:1d193cb1a933 | 142 | short int |
ykuroda | 0:1d193cb1a933 | 143 | SerialIntr::puts(const char* s) |
ykuroda | 0:1d193cb1a933 | 144 | { |
ykuroda | 0:1d193cb1a933 | 145 | short int n = putstr(s); |
ykuroda | 0:1d193cb1a933 | 146 | putc(CR); |
ykuroda | 0:1d193cb1a933 | 147 | putc(LF); |
ykuroda | 0:1d193cb1a933 | 148 | return n; |
ykuroda | 0:1d193cb1a933 | 149 | } |
ykuroda | 0:1d193cb1a933 | 150 |