OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support

Dependencies:   mbed

Committer:
akpc806a
Date:
Sun Jan 22 04:10:11 2017 +0000
Revision:
1:4683702d7ad8
Parent:
0:2cb59ea20ace
OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support. Version V2 of firmware, forked from the same official version for the PIC32 board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akpc806a 0:2cb59ea20ace 1 // interface for SPI implemented with mbed framework
akpc806a 0:2cb59ea20ace 2
akpc806a 0:2cb59ea20ace 3 #include "PlatformUart.h"
akpc806a 0:2cb59ea20ace 4 #include "mbed.h"
akpc806a 1:4683702d7ad8 5 #include "SerialBuffered.h"
akpc806a 0:2cb59ea20ace 6
akpc806a 1:4683702d7ad8 7
akpc806a 1:4683702d7ad8 8 //Serial uart(PA_9, PA_10, 115200); // Serial(PinName tx, PinName rx, const char *name=NULL, int baud = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE);
akpc806a 1:4683702d7ad8 9 SerialBuffered uart( 256, PA_9, PA_10, 115200 );
akpc806a 0:2cb59ea20ace 10
akpc806a 0:2cb59ea20ace 11
akpc806a 0:2cb59ea20ace 12 int platformUart::write(int data)
akpc806a 0:2cb59ea20ace 13 {
akpc806a 0:2cb59ea20ace 14 return uart.putc(data);
akpc806a 0:2cb59ea20ace 15 }
akpc806a 0:2cb59ea20ace 16 /*
akpc806a 0:2cb59ea20ace 17 int platformUart::write(char* str)
akpc806a 0:2cb59ea20ace 18 {
akpc806a 0:2cb59ea20ace 19 return uart.puts(str);
akpc806a 0:2cb59ea20ace 20 }
akpc806a 0:2cb59ea20ace 21 */
akpc806a 0:2cb59ea20ace 22
akpc806a 0:2cb59ea20ace 23 size_t platformUart::println(void)
akpc806a 0:2cb59ea20ace 24 {
akpc806a 0:2cb59ea20ace 25 return uart.puts("\r\n");
akpc806a 0:2cb59ea20ace 26 }
akpc806a 0:2cb59ea20ace 27
akpc806a 0:2cb59ea20ace 28 size_t platformUart::print(const char str[])
akpc806a 0:2cb59ea20ace 29 {
akpc806a 0:2cb59ea20ace 30 return uart.puts(str);
akpc806a 0:2cb59ea20ace 31 }
akpc806a 0:2cb59ea20ace 32
akpc806a 0:2cb59ea20ace 33 size_t platformUart::print(char c)
akpc806a 0:2cb59ea20ace 34 {
akpc806a 0:2cb59ea20ace 35 return uart.putc(c);
akpc806a 0:2cb59ea20ace 36 }
akpc806a 0:2cb59ea20ace 37
akpc806a 0:2cb59ea20ace 38 size_t platformUart::print(unsigned char b, int base)
akpc806a 0:2cb59ea20ace 39 {
akpc806a 0:2cb59ea20ace 40 return print((unsigned long) b, base);
akpc806a 0:2cb59ea20ace 41 }
akpc806a 0:2cb59ea20ace 42
akpc806a 0:2cb59ea20ace 43 size_t platformUart::print(int n, int base)
akpc806a 0:2cb59ea20ace 44 {
akpc806a 0:2cb59ea20ace 45 return print((long) n, base);
akpc806a 0:2cb59ea20ace 46 }
akpc806a 0:2cb59ea20ace 47
akpc806a 0:2cb59ea20ace 48 size_t platformUart::print(unsigned int n, int base)
akpc806a 0:2cb59ea20ace 49 {
akpc806a 0:2cb59ea20ace 50 return print((unsigned long) n, base);
akpc806a 0:2cb59ea20ace 51 }
akpc806a 0:2cb59ea20ace 52
akpc806a 0:2cb59ea20ace 53 size_t platformUart::print(long n, int base)
akpc806a 0:2cb59ea20ace 54 {
akpc806a 0:2cb59ea20ace 55 if (base == 0) {
akpc806a 0:2cb59ea20ace 56 return write(n);
akpc806a 0:2cb59ea20ace 57 } else if (base == 10) {
akpc806a 0:2cb59ea20ace 58 if (n < 0) {
akpc806a 0:2cb59ea20ace 59 int t = print('-');
akpc806a 0:2cb59ea20ace 60 n = -n;
akpc806a 0:2cb59ea20ace 61 return printNumber(n, 10) + t;
akpc806a 0:2cb59ea20ace 62 }
akpc806a 0:2cb59ea20ace 63 return printNumber(n, 10);
akpc806a 0:2cb59ea20ace 64 } else {
akpc806a 0:2cb59ea20ace 65 return printNumber(n, base);
akpc806a 0:2cb59ea20ace 66 }
akpc806a 0:2cb59ea20ace 67 }
akpc806a 0:2cb59ea20ace 68
akpc806a 0:2cb59ea20ace 69 size_t platformUart::print(unsigned long n, int base)
akpc806a 0:2cb59ea20ace 70 {
akpc806a 0:2cb59ea20ace 71 if (base == 0) return write(n);
akpc806a 0:2cb59ea20ace 72 else return printNumber(n, base);
akpc806a 0:2cb59ea20ace 73 }
akpc806a 0:2cb59ea20ace 74
akpc806a 0:2cb59ea20ace 75 size_t platformUart::print(double n, int digits)
akpc806a 0:2cb59ea20ace 76 {
akpc806a 0:2cb59ea20ace 77 return printFloat(n, digits);
akpc806a 0:2cb59ea20ace 78 }
akpc806a 0:2cb59ea20ace 79
akpc806a 0:2cb59ea20ace 80
akpc806a 0:2cb59ea20ace 81 size_t platformUart::println(const char c[])
akpc806a 0:2cb59ea20ace 82 {
akpc806a 0:2cb59ea20ace 83 size_t n = print(c);
akpc806a 0:2cb59ea20ace 84 n += println();
akpc806a 0:2cb59ea20ace 85 return n;
akpc806a 0:2cb59ea20ace 86 }
akpc806a 0:2cb59ea20ace 87
akpc806a 0:2cb59ea20ace 88 size_t platformUart::println(char c)
akpc806a 0:2cb59ea20ace 89 {
akpc806a 0:2cb59ea20ace 90 size_t n = print(c);
akpc806a 0:2cb59ea20ace 91 n += println();
akpc806a 0:2cb59ea20ace 92 return n;
akpc806a 0:2cb59ea20ace 93 }
akpc806a 0:2cb59ea20ace 94
akpc806a 0:2cb59ea20ace 95 size_t platformUart::println(unsigned char b, int base)
akpc806a 0:2cb59ea20ace 96 {
akpc806a 0:2cb59ea20ace 97 size_t n = print(b, base);
akpc806a 0:2cb59ea20ace 98 n += println();
akpc806a 0:2cb59ea20ace 99 return n;
akpc806a 0:2cb59ea20ace 100 }
akpc806a 0:2cb59ea20ace 101
akpc806a 0:2cb59ea20ace 102 size_t platformUart::println(int num, int base)
akpc806a 0:2cb59ea20ace 103 {
akpc806a 0:2cb59ea20ace 104 size_t n = print(num, base);
akpc806a 0:2cb59ea20ace 105 n += println();
akpc806a 0:2cb59ea20ace 106 return n;
akpc806a 0:2cb59ea20ace 107 }
akpc806a 0:2cb59ea20ace 108
akpc806a 0:2cb59ea20ace 109 size_t platformUart::println(unsigned int num, int base)
akpc806a 0:2cb59ea20ace 110 {
akpc806a 0:2cb59ea20ace 111 size_t n = print(num, base);
akpc806a 0:2cb59ea20ace 112 n += println();
akpc806a 0:2cb59ea20ace 113 return n;
akpc806a 0:2cb59ea20ace 114 }
akpc806a 0:2cb59ea20ace 115
akpc806a 0:2cb59ea20ace 116 size_t platformUart::println(long num, int base)
akpc806a 0:2cb59ea20ace 117 {
akpc806a 0:2cb59ea20ace 118 size_t n = print(num, base);
akpc806a 0:2cb59ea20ace 119 n += println();
akpc806a 0:2cb59ea20ace 120 return n;
akpc806a 0:2cb59ea20ace 121 }
akpc806a 0:2cb59ea20ace 122
akpc806a 0:2cb59ea20ace 123 size_t platformUart::println(unsigned long num, int base)
akpc806a 0:2cb59ea20ace 124 {
akpc806a 0:2cb59ea20ace 125 size_t n = print(num, base);
akpc806a 0:2cb59ea20ace 126 n += println();
akpc806a 0:2cb59ea20ace 127 return n;
akpc806a 0:2cb59ea20ace 128 }
akpc806a 0:2cb59ea20ace 129
akpc806a 0:2cb59ea20ace 130 size_t platformUart::println(double num, int digits)
akpc806a 0:2cb59ea20ace 131 {
akpc806a 0:2cb59ea20ace 132 size_t n = print(num, digits);
akpc806a 0:2cb59ea20ace 133 n += println();
akpc806a 0:2cb59ea20ace 134 return n;
akpc806a 0:2cb59ea20ace 135 }
akpc806a 0:2cb59ea20ace 136
akpc806a 0:2cb59ea20ace 137
akpc806a 0:2cb59ea20ace 138 // Private Methods /////////////////////////////////////////////////////////////
akpc806a 0:2cb59ea20ace 139
akpc806a 0:2cb59ea20ace 140 size_t platformUart::printNumber(unsigned long n, uint8_t base) {
akpc806a 0:2cb59ea20ace 141 char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
akpc806a 0:2cb59ea20ace 142 char *str = &buf[sizeof(buf) - 1];
akpc806a 0:2cb59ea20ace 143
akpc806a 0:2cb59ea20ace 144 *str = '\0';
akpc806a 0:2cb59ea20ace 145
akpc806a 0:2cb59ea20ace 146 // prevent crash if called with base == 1
akpc806a 0:2cb59ea20ace 147 if (base < 2) base = 10;
akpc806a 0:2cb59ea20ace 148
akpc806a 0:2cb59ea20ace 149 do {
akpc806a 0:2cb59ea20ace 150 unsigned long m = n;
akpc806a 0:2cb59ea20ace 151 n /= base;
akpc806a 0:2cb59ea20ace 152 char c = m - base * n;
akpc806a 0:2cb59ea20ace 153 *--str = c < 10 ? c + '0' : c + 'A' - 10;
akpc806a 0:2cb59ea20ace 154 } while(n);
akpc806a 0:2cb59ea20ace 155
akpc806a 0:2cb59ea20ace 156 return uart.puts(str);
akpc806a 0:2cb59ea20ace 157 }
akpc806a 0:2cb59ea20ace 158
akpc806a 0:2cb59ea20ace 159 size_t platformUart::printFloat(double number, uint8_t digits)
akpc806a 0:2cb59ea20ace 160 {
akpc806a 0:2cb59ea20ace 161 size_t n = 0;
akpc806a 0:2cb59ea20ace 162
akpc806a 0:2cb59ea20ace 163 if (isnan(number)) return print("nan");
akpc806a 0:2cb59ea20ace 164 if (isinf(number)) return print("inf");
akpc806a 0:2cb59ea20ace 165 if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
akpc806a 0:2cb59ea20ace 166 if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
akpc806a 0:2cb59ea20ace 167
akpc806a 0:2cb59ea20ace 168 // Handle negative numbers
akpc806a 0:2cb59ea20ace 169 if (number < 0.0)
akpc806a 0:2cb59ea20ace 170 {
akpc806a 0:2cb59ea20ace 171 n += print('-');
akpc806a 0:2cb59ea20ace 172 number = -number;
akpc806a 0:2cb59ea20ace 173 }
akpc806a 0:2cb59ea20ace 174
akpc806a 0:2cb59ea20ace 175 // Round correctly so that print(1.999, 2) prints as "2.00"
akpc806a 0:2cb59ea20ace 176 double rounding = 0.5;
akpc806a 0:2cb59ea20ace 177 for (uint8_t i=0; i<digits; ++i)
akpc806a 0:2cb59ea20ace 178 rounding /= 10.0;
akpc806a 0:2cb59ea20ace 179
akpc806a 0:2cb59ea20ace 180 number += rounding;
akpc806a 0:2cb59ea20ace 181
akpc806a 0:2cb59ea20ace 182 // Extract the integer part of the number and print it
akpc806a 0:2cb59ea20ace 183 unsigned long int_part = (unsigned long)number;
akpc806a 0:2cb59ea20ace 184 double remainder = number - (double)int_part;
akpc806a 0:2cb59ea20ace 185 n += print(int_part);
akpc806a 0:2cb59ea20ace 186
akpc806a 0:2cb59ea20ace 187 // platformUart the decimal point, but only if there are digits beyond
akpc806a 0:2cb59ea20ace 188 if (digits > 0) {
akpc806a 0:2cb59ea20ace 189 n += print(".");
akpc806a 0:2cb59ea20ace 190 }
akpc806a 0:2cb59ea20ace 191
akpc806a 0:2cb59ea20ace 192 // Extract digits from the remainder one at a time
akpc806a 0:2cb59ea20ace 193 while (digits-- > 0)
akpc806a 0:2cb59ea20ace 194 {
akpc806a 0:2cb59ea20ace 195 remainder *= 10.0;
akpc806a 0:2cb59ea20ace 196 int toPrint = int(remainder);
akpc806a 0:2cb59ea20ace 197 n += print(toPrint);
akpc806a 0:2cb59ea20ace 198 remainder -= toPrint;
akpc806a 0:2cb59ea20ace 199 }
akpc806a 0:2cb59ea20ace 200
akpc806a 0:2cb59ea20ace 201 return n;
akpc806a 0:2cb59ea20ace 202 }
akpc806a 0:2cb59ea20ace 203
akpc806a 0:2cb59ea20ace 204
akpc806a 1:4683702d7ad8 205
akpc806a 1:4683702d7ad8 206
akpc806a 0:2cb59ea20ace 207 unsigned char rx_data;
akpc806a 0:2cb59ea20ace 208
akpc806a 0:2cb59ea20ace 209 // Interupt Routine to read in data from serial port
akpc806a 0:2cb59ea20ace 210 void Rx_interrupt()
akpc806a 0:2cb59ea20ace 211 {
akpc806a 1:4683702d7ad8 212 //while (uart.readable())
akpc806a 0:2cb59ea20ace 213 {
akpc806a 0:2cb59ea20ace 214 rx_data = uart.getc();
akpc806a 1:4683702d7ad8 215 //byteQueue_Put(&rxQueue, rx_data);
akpc806a 0:2cb59ea20ace 216 }
akpc806a 0:2cb59ea20ace 217 }
akpc806a 0:2cb59ea20ace 218
akpc806a 0:2cb59ea20ace 219
akpc806a 0:2cb59ea20ace 220
akpc806a 0:2cb59ea20ace 221 platformUart::platformUart()
akpc806a 0:2cb59ea20ace 222 {
akpc806a 1:4683702d7ad8 223 //byteQueue_Init(&rxQueue);
akpc806a 0:2cb59ea20ace 224
akpc806a 1:4683702d7ad8 225 //uart.attach(&Rx_interrupt, Serial::RxIrq);
akpc806a 0:2cb59ea20ace 226 }
akpc806a 0:2cb59ea20ace 227
akpc806a 0:2cb59ea20ace 228 unsigned char platformUart::available()
akpc806a 0:2cb59ea20ace 229 {
akpc806a 1:4683702d7ad8 230 return uart.readable(); //!(byteQueue_IsEmpty(&rxQueue));
akpc806a 0:2cb59ea20ace 231 }
akpc806a 0:2cb59ea20ace 232
akpc806a 0:2cb59ea20ace 233 unsigned char platformUart::read()
akpc806a 0:2cb59ea20ace 234 {
akpc806a 1:4683702d7ad8 235 return uart.getc(); //byteQueue_Get(&rxQueue);
akpc806a 0:2cb59ea20ace 236 }
akpc806a 0:2cb59ea20ace 237
akpc806a 0:2cb59ea20ace 238
akpc806a 0:2cb59ea20ace 239
akpc806a 0:2cb59ea20ace 240
akpc806a 1:4683702d7ad8 241 platformUart Serial0;
akpc806a 1:4683702d7ad8 242 platformUart_Dummy Serial1;