Zimin Wang / Mbed 2 deprecated DDRO_Farrari

Dependencies:   mbed-rtos mbed

Fork of DDRO_Farrari by Liangzhen Lai

Committer:
josewang
Date:
Tue Feb 11 21:36:52 2014 +0000
Revision:
9:cbb692f51e0f
Parent:
6:d772ad205bc7
Read data from cortex-m3 when GPIO interrupt occurs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
josewang 6:d772ad205bc7 1 #include "mbed.h"
josewang 6:d772ad205bc7 2 #include "pinout.h"
josewang 6:d772ad205bc7 3 #include "serialIO.h"
josewang 6:d772ad205bc7 4
josewang 6:d772ad205bc7 5 // buffer for TX and RX
josewang 6:d772ad205bc7 6 char tx_buffer[buffer_size];
josewang 6:d772ad205bc7 7 char rx_buffer[buffer_size];
josewang 6:d772ad205bc7 8 // buffer for sscanf and sprintf
josewang 6:d772ad205bc7 9 char tx_line[80];
josewang 6:d772ad205bc7 10 char rx_line[80];
josewang 6:d772ad205bc7 11
josewang 6:d772ad205bc7 12 // index marking the begin/end of rx_buffer and tx_buffer
josewang 6:d772ad205bc7 13 volatile int tx_out = 0;
josewang 6:d772ad205bc7 14 volatile int tx_in = 0;
josewang 6:d772ad205bc7 15 volatile int rx_out = 0;
josewang 6:d772ad205bc7 16 volatile int rx_in = 0;
josewang 6:d772ad205bc7 17
josewang 6:d772ad205bc7 18 // Copy tx line buffer to large tx buffer for tx interrupt routine
josewang 6:d772ad205bc7 19 void send_line() {
josewang 6:d772ad205bc7 20 int i;
josewang 6:d772ad205bc7 21 char temp_char;
josewang 6:d772ad205bc7 22 bool empty;
josewang 6:d772ad205bc7 23 i = 0;
josewang 6:d772ad205bc7 24 // Start Critical Section - don't interrupt while changing global buffer variables
josewang 6:d772ad205bc7 25 NVIC_DisableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 26 empty = (tx_in == tx_out);
josewang 6:d772ad205bc7 27 while ((i==0) || (tx_line[i-1] != '\n')) {
josewang 6:d772ad205bc7 28 // Wait if buffer full
josewang 6:d772ad205bc7 29 if (((tx_in + 1) % buffer_size) == tx_out) {
josewang 6:d772ad205bc7 30 // End Critical Section - need to let interrupt routine empty buffer by sending
josewang 6:d772ad205bc7 31 NVIC_EnableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 32 while (((tx_in + 1) % buffer_size) == tx_out) {
josewang 6:d772ad205bc7 33 }
josewang 6:d772ad205bc7 34 // Start Critical Section - don't interrupt while changing global buffer variables
josewang 6:d772ad205bc7 35 NVIC_DisableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 36 }
josewang 6:d772ad205bc7 37 tx_buffer[tx_in] = tx_line[i];
josewang 6:d772ad205bc7 38 i++;
josewang 6:d772ad205bc7 39 tx_in = (tx_in + 1) % buffer_size;
josewang 6:d772ad205bc7 40 }
josewang 6:d772ad205bc7 41 if (pc.writeable() && (empty)) {
josewang 6:d772ad205bc7 42 temp_char = tx_buffer[tx_out];
josewang 6:d772ad205bc7 43 tx_out = (tx_out + 1) % buffer_size;
josewang 6:d772ad205bc7 44 // Send first character to start tx interrupts, if stopped
josewang 6:d772ad205bc7 45 pc.putc(temp_char);
josewang 6:d772ad205bc7 46 }
josewang 6:d772ad205bc7 47 // End Critical Section
josewang 6:d772ad205bc7 48 NVIC_EnableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 49 return;
josewang 6:d772ad205bc7 50 }
josewang 6:d772ad205bc7 51
josewang 6:d772ad205bc7 52 // Interupt Routine to write out data to serial port
josewang 6:d772ad205bc7 53 void Tx_interrupt() {
josewang 6:d772ad205bc7 54 // Loop to fill more than one character in UART's transmit FIFO buffer
josewang 6:d772ad205bc7 55 // Stop if buffer empty
josewang 6:d772ad205bc7 56 while ((pc.writeable()) && (tx_in != tx_out)) {
josewang 6:d772ad205bc7 57 pc.putc(tx_buffer[tx_out]);
josewang 6:d772ad205bc7 58 tx_out = (tx_out + 1) % buffer_size;
josewang 6:d772ad205bc7 59 }
josewang 6:d772ad205bc7 60 return;
josewang 6:d772ad205bc7 61 }
josewang 6:d772ad205bc7 62
josewang 6:d772ad205bc7 63 // Read a line from the large rx buffer from rx interrupt routine
josewang 6:d772ad205bc7 64 void read_line() {
josewang 6:d772ad205bc7 65 int i;
josewang 6:d772ad205bc7 66 i = 0;
josewang 6:d772ad205bc7 67 // Start Critical Section - don't interrupt while changing global buffer variables
josewang 6:d772ad205bc7 68 NVIC_DisableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 69 // Loop reading rx buffer characters until end of line character
josewang 6:d772ad205bc7 70 while ((i==0) || (rx_line[i-1] != '\r')) {
josewang 6:d772ad205bc7 71 // Wait if buffer empty
josewang 6:d772ad205bc7 72 if (rx_in == rx_out) {
josewang 6:d772ad205bc7 73 // End Critical Section - need to allow rx interrupt to get new characters for buffer
josewang 6:d772ad205bc7 74 NVIC_EnableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 75 while (rx_in == rx_out) {
josewang 6:d772ad205bc7 76 }
josewang 6:d772ad205bc7 77 // Start Critical Section - don't interrupt while changing global buffer variables
josewang 6:d772ad205bc7 78 NVIC_DisableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 79 }
josewang 6:d772ad205bc7 80 rx_line[i] = rx_buffer[rx_out];
josewang 6:d772ad205bc7 81 i++;
josewang 6:d772ad205bc7 82 rx_out = (rx_out + 1) % buffer_size;
josewang 6:d772ad205bc7 83 }
josewang 6:d772ad205bc7 84 // End Critical Section
josewang 6:d772ad205bc7 85 NVIC_EnableIRQ(USB_IRQn);
josewang 6:d772ad205bc7 86 rx_line[i-1] = 0;
josewang 6:d772ad205bc7 87 return;
josewang 6:d772ad205bc7 88 }
josewang 6:d772ad205bc7 89
josewang 6:d772ad205bc7 90 // Interupt Routine to read in data from serial port
josewang 6:d772ad205bc7 91 void Rx_interrupt() {
josewang 6:d772ad205bc7 92 // Loop just in case more than one character is in UART's receive FIFO buffer
josewang 6:d772ad205bc7 93 // Stop if buffer full
josewang 6:d772ad205bc7 94 while ((pc.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
josewang 6:d772ad205bc7 95 rx_buffer[rx_in] = pc.getc();
josewang 6:d772ad205bc7 96 // Uncomment to Echo to USB serial to watch data flow
josewang 6:d772ad205bc7 97 // monitor_device.putc(rx_buffer[rx_in]);
josewang 6:d772ad205bc7 98 rx_in = (rx_in + 1) % buffer_size;
josewang 6:d772ad205bc7 99 }
josewang 6:d772ad205bc7 100 return;
josewang 6:d772ad205bc7 101 }