An example project for the Heltec Turtle LoRa board (STM32L4 and SX1276 chips). The projects is only supported for the Nucleo-L432KC board platform in the mbed online and offline compiler environment. Visit www.radioshuttle.de (choose Turtle board) for instructions. Note that most source files and libraries are open source, however some files especially the RadioShuttle core protocol is copyrighted work. Check header for details.

Dependencies:   mbed BufferedSerial SX1276GenericLib OLED_SSD1306 HELIOS_Si7021 NVProperty RadioShuttle-STM32L4 USBDeviceHT

Committer:
Helmut Tschemernjak
Date:
Wed Feb 06 15:52:20 2019 +0100
Revision:
22:9cca40fcb25e
Parent:
16:c12c85fdfa60
Child:
30:8bc655c9b224
Added a ConsoleReadline timeout feature
Added a little cmd line option for main

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut64 0:3b6c2ce051a6 1 /*
Helmut Tschemernjak 1:56fdc660a26a 2 * Copyright (c) 2019 Helmut Tschemernjak
Helmut64 0:3b6c2ce051a6 3 * 30826 Garbsen (Hannover) Germany
Helmut64 0:3b6c2ce051a6 4 */
Helmut Tschemernjak 1:56fdc660a26a 5 #include "main.h"
Helmut Tschemernjak 5:c6a960febe80 6
Helmut Tschemernjak 5:c6a960febe80 7 volatile uint32_t PendingInterrupts; // global interrupt mask of received interrupts
Helmut Tschemernjak 5:c6a960febe80 8
Helmut64 0:3b6c2ce051a6 9 time_t cvt_date(char const *date, char const *time);
Helmut64 0:3b6c2ce051a6 10
Helmut64 0:3b6c2ce051a6 11 BufferedSerial *ser;
Helmut64 0:3b6c2ce051a6 12 #ifdef FEATURE_USBSERIAL
Helmut64 0:3b6c2ce051a6 13 USBSerialBuffered *usb;
Helmut64 0:3b6c2ce051a6 14 #endif
Helmut64 0:3b6c2ce051a6 15 bool _useDprintf;
Helmut64 0:3b6c2ce051a6 16
Helmut64 0:3b6c2ce051a6 17 void InitSerial(int timeout, DigitalOut *led)
Helmut64 0:3b6c2ce051a6 18 {
Helmut64 0:3b6c2ce051a6 19 _useDprintf = true;
Helmut64 0:3b6c2ce051a6 20 bool uartActive;
Helmut64 0:3b6c2ce051a6 21 {
Helmut64 0:3b6c2ce051a6 22 {
Helmut64 0:3b6c2ce051a6 23 // need to turn rx low to avoid floating signal
Helmut64 0:3b6c2ce051a6 24 DigitalOut rx(USBRX);
Helmut64 0:3b6c2ce051a6 25 rx = 0;
Helmut64 0:3b6c2ce051a6 26 }
Helmut64 0:3b6c2ce051a6 27 DigitalIn uartRX(USBRX);
Helmut64 0:3b6c2ce051a6 28 uartActive = uartRX.read();
Helmut64 0:3b6c2ce051a6 29 }
Helmut64 0:3b6c2ce051a6 30 #ifdef FEATURE_USBSERIAL
Helmut64 0:3b6c2ce051a6 31 if (!uartActive) {
Helmut64 0:3b6c2ce051a6 32 usb = new USBSerialBuffered();
Helmut64 0:3b6c2ce051a6 33 Timer t;
Helmut64 0:3b6c2ce051a6 34 t.start();
Helmut64 0:3b6c2ce051a6 35 while(!usb->connected()) {
Helmut64 0:3b6c2ce051a6 36 if (led)
Helmut64 0:3b6c2ce051a6 37 *led = !*led;
Helmut64 0:3b6c2ce051a6 38 wait_ms(100);
Helmut64 0:3b6c2ce051a6 39 if (timeout) {
Helmut Tschemernjak 5:c6a960febe80 40 if (t.read_ms() >= timeout) {
Helmut Tschemernjak 5:c6a960febe80 41 delete usb;
Helmut Tschemernjak 5:c6a960febe80 42 usb = NULL;
Helmut Tschemernjak 5:c6a960febe80 43 DigitalOut rx(USBRX);
Helmut Tschemernjak 5:c6a960febe80 44 rx = 0; // need to turn tx low to avoid floating signal
Helmut Tschemernjak 5:c6a960febe80 45 goto done;
Helmut Tschemernjak 5:c6a960febe80 46 }
Helmut64 0:3b6c2ce051a6 47 }
Helmut64 0:3b6c2ce051a6 48 }
Helmut Tschemernjak 5:c6a960febe80 49 goto done;
Helmut64 0:3b6c2ce051a6 50 } else {
Helmut64 0:3b6c2ce051a6 51 #else
Helmut64 0:3b6c2ce051a6 52 {
Helmut64 0:3b6c2ce051a6 53 #endif
Helmut64 0:3b6c2ce051a6 54 ser = new BufferedSerial(USBTX, USBRX);
Helmut64 0:3b6c2ce051a6 55 ser->baud(230400);
Helmut64 0:3b6c2ce051a6 56 ser->format(8);
Helmut64 0:3b6c2ce051a6 57 }
Helmut Tschemernjak 5:c6a960febe80 58 done:
Helmut64 0:3b6c2ce051a6 59 time_t t = cvt_date(__DATE__, __TIME__);
Helmut64 0:3b6c2ce051a6 60 if (t > time(NULL)) {
Helmut64 0:3b6c2ce051a6 61 set_time(t);
Helmut64 0:3b6c2ce051a6 62 }
Helmut64 0:3b6c2ce051a6 63 }
Helmut64 0:3b6c2ce051a6 64
Helmut64 0:3b6c2ce051a6 65 void printTimeStamp()
Helmut64 0:3b6c2ce051a6 66 {
Helmut64 0:3b6c2ce051a6 67 static LowPowerTimer *timer;
Helmut64 0:3b6c2ce051a6 68 if (!timer) {
Helmut64 0:3b6c2ce051a6 69 timer = new LowPowerTimer();
Helmut64 0:3b6c2ce051a6 70 timer->start();
Helmut64 0:3b6c2ce051a6 71 }
Helmut64 0:3b6c2ce051a6 72 time_t seconds = time(NULL);
Helmut64 0:3b6c2ce051a6 73 struct tm *tm = localtime(&seconds);
Helmut64 0:3b6c2ce051a6 74 int usecs = timer->read_us();
Helmut64 0:3b6c2ce051a6 75 if (usecs < 0) {
Helmut64 0:3b6c2ce051a6 76 usecs = 0;
Helmut64 0:3b6c2ce051a6 77 timer->stop();
Helmut64 0:3b6c2ce051a6 78 timer->reset();
Helmut64 0:3b6c2ce051a6 79 timer->start();
Helmut64 0:3b6c2ce051a6 80 }
Helmut64 0:3b6c2ce051a6 81 int msecs = usecs % 1000000;
Helmut64 0:3b6c2ce051a6 82
Helmut64 0:3b6c2ce051a6 83 rprintf("%02d:%02d:%02d.%06d ", tm->tm_hour, tm->tm_min, tm->tm_sec, msecs);
Helmut64 0:3b6c2ce051a6 84 }
Helmut64 0:3b6c2ce051a6 85
Helmut64 0:3b6c2ce051a6 86 void dprintf(const char *format, ...)
Helmut64 0:3b6c2ce051a6 87 {
Helmut64 0:3b6c2ce051a6 88 std::va_list arg;
Helmut64 0:3b6c2ce051a6 89
Helmut64 0:3b6c2ce051a6 90 va_start(arg, format);
Helmut64 0:3b6c2ce051a6 91 VAprintf(true, true, _useDprintf, format, arg);
Helmut64 0:3b6c2ce051a6 92 va_end(arg);
Helmut64 0:3b6c2ce051a6 93 }
Helmut64 0:3b6c2ce051a6 94
Helmut64 0:3b6c2ce051a6 95 void rprintf(const char *format, ...)
Helmut64 0:3b6c2ce051a6 96 {
Helmut64 0:3b6c2ce051a6 97 std::va_list arg;
Helmut64 0:3b6c2ce051a6 98
Helmut64 0:3b6c2ce051a6 99 va_start(arg, format);
Helmut64 0:3b6c2ce051a6 100 VAprintf(false, false, _useDprintf, format, arg);
Helmut64 0:3b6c2ce051a6 101 va_end(arg);
Helmut64 0:3b6c2ce051a6 102 }
Helmut64 0:3b6c2ce051a6 103
Helmut64 0:3b6c2ce051a6 104 void VAprintf(bool timstamp, bool newline, bool printEnabled, const char *format, va_list arg)
Helmut64 0:3b6c2ce051a6 105 {
Helmut64 0:3b6c2ce051a6 106 if (!printEnabled)
Helmut64 0:3b6c2ce051a6 107 return;
Helmut64 0:3b6c2ce051a6 108
Helmut64 0:3b6c2ce051a6 109 if (timstamp)
Helmut64 0:3b6c2ce051a6 110 printTimeStamp();
Helmut64 0:3b6c2ce051a6 111 #ifdef FEATURE_USBSERIAL
Helmut64 0:3b6c2ce051a6 112 if (usb) {
Helmut64 0:3b6c2ce051a6 113 usb->vprintf_irqsafe(format, arg);
Helmut64 0:3b6c2ce051a6 114 if (newline)
Helmut64 0:3b6c2ce051a6 115 usb->printf_irqsafe("\r\n");
Helmut64 0:3b6c2ce051a6 116 #else
Helmut64 0:3b6c2ce051a6 117 if (0) {
Helmut64 0:3b6c2ce051a6 118 #endif
Helmut64 0:3b6c2ce051a6 119 } else if (ser) {
Helmut64 0:3b6c2ce051a6 120 // serial jas
Helmut64 0:3b6c2ce051a6 121 int r = 0;
Helmut64 0:3b6c2ce051a6 122 r = vsnprintf(NULL, 0, format, arg);
Helmut64 0:3b6c2ce051a6 123 if (r < 82) {
Helmut64 0:3b6c2ce051a6 124 char buffer[82+1];
Helmut64 0:3b6c2ce051a6 125
Helmut64 0:3b6c2ce051a6 126 vsnprintf(buffer, sizeof(buffer), format, arg);
Helmut64 0:3b6c2ce051a6 127 r = ser->write(buffer, r);
Helmut64 0:3b6c2ce051a6 128 } else {
Helmut64 0:3b6c2ce051a6 129 char *buffer = new char[r+1];
Helmut64 0:3b6c2ce051a6 130 if (buffer) {
Helmut64 0:3b6c2ce051a6 131 vsnprintf(buffer, r+1, format, arg);
Helmut64 0:3b6c2ce051a6 132 r = ser->write(buffer, r);
Helmut64 0:3b6c2ce051a6 133 delete[] buffer;
Helmut64 0:3b6c2ce051a6 134 } else {
Helmut64 0:3b6c2ce051a6 135 error("%s %d cannot alloc memory (%d bytes)!\r\n", __FILE__, __LINE__, r+1);
Helmut64 0:3b6c2ce051a6 136 r = 0;
Helmut64 0:3b6c2ce051a6 137 }
Helmut64 0:3b6c2ce051a6 138 }
Helmut64 0:3b6c2ce051a6 139 if (newline)
Helmut64 0:3b6c2ce051a6 140 ser->write("\r\n", 2);
Helmut64 0:3b6c2ce051a6 141 }
Helmut64 0:3b6c2ce051a6 142 }
Helmut64 0:3b6c2ce051a6 143
Helmut Tschemernjak 22:9cca40fcb25e 144 char *ConsoleReadline(char *buf, int buflen, bool echo, int timeout_ms)
Helmut Tschemernjak 14:d9340be18c3d 145 {
Helmut Tschemernjak 14:d9340be18c3d 146 int count = 0;
Helmut Tschemernjak 14:d9340be18c3d 147 memset(buf, 0, buflen);
Helmut Tschemernjak 14:d9340be18c3d 148
Helmut Tschemernjak 22:9cca40fcb25e 149 if (usb == NULL && ser == NULL)
Helmut Tschemernjak 22:9cca40fcb25e 150 return NULL;
Helmut Tschemernjak 22:9cca40fcb25e 151
Helmut Tschemernjak 22:9cca40fcb25e 152 Timer t;
Helmut Tschemernjak 22:9cca40fcb25e 153 int start = 0;
Helmut Tschemernjak 22:9cca40fcb25e 154 if (timeout_ms) {
Helmut Tschemernjak 22:9cca40fcb25e 155 t.start();
Helmut Tschemernjak 22:9cca40fcb25e 156 start = t.read_ms();
Helmut Tschemernjak 22:9cca40fcb25e 157 }
Helmut Tschemernjak 22:9cca40fcb25e 158
Helmut Tschemernjak 22:9cca40fcb25e 159 if (usb) {
Helmut Tschemernjak 14:d9340be18c3d 160 usb->flush();
Helmut Tschemernjak 14:d9340be18c3d 161 while(usb->readable())
Helmut Tschemernjak 14:d9340be18c3d 162 usb->getc(); // flush old chars
Helmut Tschemernjak 14:d9340be18c3d 163 }
Helmut Tschemernjak 14:d9340be18c3d 164 if (ser) {
Helmut Tschemernjak 14:d9340be18c3d 165 while(ser->readable())
Helmut Tschemernjak 14:d9340be18c3d 166 ser->getc(); // flush old chars
Helmut Tschemernjak 22:9cca40fcb25e 167 }
Helmut Tschemernjak 14:d9340be18c3d 168
Helmut Tschemernjak 22:9cca40fcb25e 169 while(true) {
Helmut Tschemernjak 22:9cca40fcb25e 170 if (timeout_ms && t.read_ms() - start > timeout_ms)
Helmut Tschemernjak 22:9cca40fcb25e 171 return NULL;
Helmut Tschemernjak 22:9cca40fcb25e 172 int c = -2;
Helmut Tschemernjak 22:9cca40fcb25e 173 if (usb && usb->readable())
Helmut Tschemernjak 22:9cca40fcb25e 174 c = usb->getc();
Helmut Tschemernjak 22:9cca40fcb25e 175 if (ser && ser->readable())
Helmut Tschemernjak 22:9cca40fcb25e 176 c = ser->getc();
Helmut Tschemernjak 22:9cca40fcb25e 177 if (c == -2)
Helmut Tschemernjak 22:9cca40fcb25e 178 continue;
Helmut Tschemernjak 22:9cca40fcb25e 179
Helmut Tschemernjak 22:9cca40fcb25e 180 if (c == 0 || c == -1 || c == '\r' || c == '\n' || c == 3 || c == 4)
Helmut Tschemernjak 22:9cca40fcb25e 181 break;
Helmut Tschemernjak 22:9cca40fcb25e 182 if (c == '\b' || c == 0x7f) { // backspace
Helmut Tschemernjak 22:9cca40fcb25e 183 if (count < 1)
Helmut Tschemernjak 22:9cca40fcb25e 184 continue;
Helmut Tschemernjak 22:9cca40fcb25e 185 buf[--count] = 0;
Helmut Tschemernjak 22:9cca40fcb25e 186 if (echo)
Helmut Tschemernjak 22:9cca40fcb25e 187 rprintf("\b \b");
Helmut Tschemernjak 22:9cca40fcb25e 188 if (usb)
Helmut Tschemernjak 22:9cca40fcb25e 189 usb->flush();
Helmut Tschemernjak 22:9cca40fcb25e 190 continue;
Helmut Tschemernjak 14:d9340be18c3d 191 }
Helmut Tschemernjak 22:9cca40fcb25e 192 if (echo) {
Helmut Tschemernjak 22:9cca40fcb25e 193 rprintf("%c", c);
Helmut Tschemernjak 22:9cca40fcb25e 194 if (usb)
Helmut Tschemernjak 22:9cca40fcb25e 195 usb->flush();
Helmut Tschemernjak 22:9cca40fcb25e 196 }
Helmut Tschemernjak 22:9cca40fcb25e 197
Helmut Tschemernjak 22:9cca40fcb25e 198 buf[count] = c;
Helmut Tschemernjak 22:9cca40fcb25e 199 if (count++ >= buflen-2)
Helmut Tschemernjak 22:9cca40fcb25e 200 break;
Helmut Tschemernjak 22:9cca40fcb25e 201 // dprintf("Got char: '%c'(%d)", c, c);
Helmut Tschemernjak 14:d9340be18c3d 202 }
Helmut Tschemernjak 22:9cca40fcb25e 203
Helmut Tschemernjak 14:d9340be18c3d 204 if (echo)
Helmut Tschemernjak 14:d9340be18c3d 205 rprintf("\r\n");
Helmut Tschemernjak 14:d9340be18c3d 206 if (count)
Helmut Tschemernjak 14:d9340be18c3d 207 return buf;
Helmut Tschemernjak 14:d9340be18c3d 208 return NULL;
Helmut Tschemernjak 14:d9340be18c3d 209 }
Helmut Tschemernjak 14:d9340be18c3d 210
Helmut64 0:3b6c2ce051a6 211
Helmut64 0:3b6c2ce051a6 212 void dump(const char *title, const void *data, int len, bool dwords)
Helmut64 0:3b6c2ce051a6 213 {
Helmut Tschemernjak 14:d9340be18c3d 214 dprintf("dump(\"%s\", 0x%x, %d bytes)", title, (unsigned int)data, len);
Helmut64 0:3b6c2ce051a6 215
Helmut64 0:3b6c2ce051a6 216 int i, j, cnt;
Helmut64 0:3b6c2ce051a6 217 unsigned char *u;
Helmut64 0:3b6c2ce051a6 218 const int width = 16;
Helmut64 0:3b6c2ce051a6 219 const int seppos = 7;
Helmut64 0:3b6c2ce051a6 220
Helmut64 0:3b6c2ce051a6 221 cnt = 0;
Helmut64 0:3b6c2ce051a6 222 u = (unsigned char *)data;
Helmut64 0:3b6c2ce051a6 223 while (len > 0) {
Helmut64 0:3b6c2ce051a6 224 rprintf("%08x: ", (unsigned int)data + cnt);
Helmut64 0:3b6c2ce051a6 225 if (dwords) {
Helmut64 0:3b6c2ce051a6 226 unsigned int *ip = ( unsigned int *)u;
Helmut64 0:3b6c2ce051a6 227 rprintf(" 0x%08x\r\n", *ip);
Helmut64 0:3b6c2ce051a6 228 u+= 4;
Helmut64 0:3b6c2ce051a6 229 len -= 4;
Helmut64 0:3b6c2ce051a6 230 cnt += 4;
Helmut64 0:3b6c2ce051a6 231 continue;
Helmut64 0:3b6c2ce051a6 232 }
Helmut64 0:3b6c2ce051a6 233 cnt += width;
Helmut64 0:3b6c2ce051a6 234 j = len < width ? len : width;
Helmut64 0:3b6c2ce051a6 235 for (i = 0; i < j; i++) {
Helmut64 0:3b6c2ce051a6 236 rprintf("%2.2x ", *(u + i));
Helmut64 0:3b6c2ce051a6 237 if (i == seppos)
Helmut64 0:3b6c2ce051a6 238 rprintf(" ");
Helmut64 0:3b6c2ce051a6 239 }
Helmut64 0:3b6c2ce051a6 240 rprintf(" ");
Helmut64 0:3b6c2ce051a6 241 if (j < width) {
Helmut64 0:3b6c2ce051a6 242 i = width - j;
Helmut64 0:3b6c2ce051a6 243 if (i > seppos + 1)
Helmut64 0:3b6c2ce051a6 244 rprintf(" ");
Helmut64 0:3b6c2ce051a6 245 while (i--) {
Helmut64 0:3b6c2ce051a6 246 rprintf("%s", " ");
Helmut64 0:3b6c2ce051a6 247 }
Helmut64 0:3b6c2ce051a6 248 }
Helmut64 0:3b6c2ce051a6 249 for (i = 0; i < j; i++) {
Helmut64 0:3b6c2ce051a6 250 int c = *(u + i);
Helmut64 0:3b6c2ce051a6 251 if (c >= ' ' && c <= '~')
Helmut64 0:3b6c2ce051a6 252 rprintf("%c", c);
Helmut64 0:3b6c2ce051a6 253 else
Helmut64 0:3b6c2ce051a6 254 rprintf(".");
Helmut64 0:3b6c2ce051a6 255 if (i == seppos)
Helmut64 0:3b6c2ce051a6 256 rprintf(" ");
Helmut64 0:3b6c2ce051a6 257 }
Helmut64 0:3b6c2ce051a6 258 len -= width;
Helmut64 0:3b6c2ce051a6 259 u += width;
Helmut64 0:3b6c2ce051a6 260 rprintf("\r\n");
Helmut Tschemernjak 22:9cca40fcb25e 261 if (ser)
Helmut Tschemernjak 22:9cca40fcb25e 262 wait_ms(5); // give the serial some time.
Helmut64 0:3b6c2ce051a6 263 }
Helmut64 0:3b6c2ce051a6 264 rprintf("--\r\n");
Helmut64 0:3b6c2ce051a6 265 }
Helmut64 0:3b6c2ce051a6 266
Helmut64 0:3b6c2ce051a6 267 /*
Helmut64 0:3b6c2ce051a6 268 * Convert compile time to system time
Helmut64 0:3b6c2ce051a6 269 */
Helmut64 0:3b6c2ce051a6 270 time_t
Helmut64 0:3b6c2ce051a6 271 cvt_date(char const *date, char const *time)
Helmut64 0:3b6c2ce051a6 272 {
Helmut64 0:3b6c2ce051a6 273 char s_month[5];
Helmut64 0:3b6c2ce051a6 274 int year;
Helmut64 0:3b6c2ce051a6 275 struct tm t;
Helmut64 0:3b6c2ce051a6 276 static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
Helmut64 0:3b6c2ce051a6 277 sscanf(date, "%s %d %d", s_month, &t.tm_mday, &year);
Helmut64 0:3b6c2ce051a6 278 sscanf(time, "%2d %*c %2d %*c %2d", &t.tm_hour, &t.tm_min, &t.tm_sec);
Helmut64 0:3b6c2ce051a6 279 // Find where is s_month in month_names. Deduce month value.
Helmut64 0:3b6c2ce051a6 280 t.tm_mon = (strstr(month_names, s_month) - month_names) / 3;
Helmut64 0:3b6c2ce051a6 281 t.tm_year = year - 1900;
Helmut64 0:3b6c2ce051a6 282 return (int)mktime(&t);
Helmut64 0:3b6c2ce051a6 283 }
Helmut Tschemernjak 1:56fdc660a26a 284
Helmut Tschemernjak 1:56fdc660a26a 285
Helmut Tschemernjak 1:56fdc660a26a 286
Helmut Tschemernjak 1:56fdc660a26a 287 void InterrruptMSG(enum InterrruptDevice irqid) {
Helmut Tschemernjak 1:56fdc660a26a 288 help_atomic_or_relaxed(&PendingInterrupts, irqid);
Helmut Tschemernjak 1:56fdc660a26a 289 }
Helmut Tschemernjak 1:56fdc660a26a 290
Helmut Tschemernjak 1:56fdc660a26a 291
Helmut Tschemernjak 1:56fdc660a26a 292 uint32_t readclrPendingInterrupts() {
Helmut Tschemernjak 1:56fdc660a26a 293 return help_atomic_readclr_relaxed(&PendingInterrupts);
Helmut Tschemernjak 1:56fdc660a26a 294 }
Helmut Tschemernjak 1:56fdc660a26a 295
Helmut Tschemernjak 1:56fdc660a26a 296 uint32_t readPendingInterrupts() {
Helmut Tschemernjak 1:56fdc660a26a 297 return help_atomic_load_relaxed(&PendingInterrupts);
Helmut Tschemernjak 1:56fdc660a26a 298 }
Helmut Tschemernjak 1:56fdc660a26a 299
Helmut Tschemernjak 1:56fdc660a26a 300 const char *
Helmut Tschemernjak 1:56fdc660a26a 301 BatterySource(void)
Helmut Tschemernjak 1:56fdc660a26a 302 {
Helmut Tschemernjak 1:56fdc660a26a 303 const char *pwrSource = "Battery";
Helmut Tschemernjak 1:56fdc660a26a 304 #ifdef BATPOWER_EN
Helmut Tschemernjak 1:56fdc660a26a 305 {
Helmut Tschemernjak 1:56fdc660a26a 306 DigitalIn pwr(BATPOWER_EN);
Helmut Tschemernjak 1:56fdc660a26a 307 if (pwr == BATPOWER_EXT)
Helmut Tschemernjak 1:56fdc660a26a 308 pwrSource = "USB";
Helmut Tschemernjak 1:56fdc660a26a 309 }
Helmut Tschemernjak 1:56fdc660a26a 310 #endif
Helmut Tschemernjak 1:56fdc660a26a 311 return pwrSource;
Helmut Tschemernjak 1:56fdc660a26a 312 }
Helmut Tschemernjak 1:56fdc660a26a 313
Helmut Tschemernjak 22:9cca40fcb25e 314
Helmut Tschemernjak 22:9cca40fcb25e 315 void MCUReset(void)
Helmut Tschemernjak 22:9cca40fcb25e 316 {
Helmut Tschemernjak 22:9cca40fcb25e 317 #define AIRCR_VECTKEY_MASK 0x05FA0000
Helmut Tschemernjak 22:9cca40fcb25e 318 SCB->AIRCR = AIRCR_VECTKEY_MASK | 0x04; // NVIC_GenerateSystemReset();
Helmut Tschemernjak 22:9cca40fcb25e 319 }
Helmut Tschemernjak 22:9cca40fcb25e 320