From aa7949da36daa40f2437328d1ea6a50d0ff7f0f4 Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Mon, 3 Jul 2017 16:44:00 +0200 Subject: [PATCH] Fix Serial config Fix #50 Arduino defined several configs (data, parity and stop bits) values for Serial.begin(speed, config) See: https://www.arduino.cc/en/Serial/Begin Below configs could not be supported by STM32 as minimum wordlength (data + parity) is UART_WORDLENGTH_7B (7 bits). SERIAL_5N1 SERIAL_5N2 SERIAL_5E1 SERIAL_5E2 SERIAL_5O1 SERIAL_5O2 SERIAL_6N1 SERIAL_6N2 Signed-off-by: Frederic Pillon --- cores/arduino/HardwareSerial.cpp | 41 ++++++++++++++++++++++++++++++-- cores/arduino/HardwareSerial.h | 30 +++++++++++++---------- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp index 9bb2050650..d15e5c5aff 100644 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "Arduino.h" #include "HardwareSerial.h" @@ -83,15 +84,32 @@ int HardwareSerial::_tx_complete_irq(serial_t* obj) void HardwareSerial::begin(unsigned long baud, byte config) { + uint32_t databits = 0; + _serial.baudrate = (uint32_t)baud; - // Could be 8 or 9 bits. Could match with Arduino small data length? - _serial.databits = UART_WORDLENGTH_8B; + // Manage databits + switch(config & 0x07) { + case 0x02: + databits = 6; + break; + case 0x04: + databits = 7; + break; + case 0x06: + databits = 8; + break; + default: + databits = 0; + break; + } if((config & 0x30) == 0x30) { _serial.parity = UART_PARITY_ODD; + databits++; } else if((config & 0x20) == 0x20) { _serial.parity = UART_PARITY_EVEN; + databits++; } else { _serial.parity = UART_PARITY_NONE; } @@ -102,6 +120,25 @@ void HardwareSerial::begin(unsigned long baud, byte config) _serial.stopbits = UART_STOPBITS_1; } + switch(databits) { +#ifdef UART_WORDLENGTH_7B + case 7: + _serial.databits = UART_WORDLENGTH_7B; + break; +#endif + case 8: + _serial.databits = UART_WORDLENGTH_8B; + break; + case 9: + _serial.databits = UART_WORDLENGTH_9B; + break; + default: + case 0: + databits = 0; + break; + } + assert(databits!=0); + uart_init(&_serial); uart_attach_rx_callback(&_serial, _rx_complete_irq); } diff --git a/cores/arduino/HardwareSerial.h b/cores/arduino/HardwareSerial.h index 69ce30b03e..b31e58e127 100644 --- a/cores/arduino/HardwareSerial.h +++ b/cores/arduino/HardwareSerial.h @@ -57,28 +57,32 @@ typedef uint8_t rx_buffer_index_t; #endif // Define config for Serial.begin(baud, config); -#define SERIAL_5N1 0x00 -#define SERIAL_6N1 0x02 +// below configs are not supported by STM32 +//#define SERIAL_5N1 0x00 +//#define SERIAL_5N2 0x08 +//#define SERIAL_5E1 0x20 +//#define SERIAL_5E2 0x28 +//#define SERIAL_5O1 0x30 +//#define SERIAL_5O2 0x38 +//#define SERIAL_6N1 0x02 +//#define SERIAL_6N2 0x0A + +#ifdef UART_WORDLENGTH_7B #define SERIAL_7N1 0x04 -#define SERIAL_8N1 0x06 -#define SERIAL_5N2 0x08 -#define SERIAL_6N2 0x0A #define SERIAL_7N2 0x0C -#define SERIAL_8N2 0x0E -#define SERIAL_5E1 0x20 #define SERIAL_6E1 0x22 +#define SERIAL_6E2 0x2A +#define SERIAL_6O1 0x32 +#define SERIAL_6O2 0x3A +#endif +#define SERIAL_8N1 0x06 +#define SERIAL_8N2 0x0E #define SERIAL_7E1 0x24 #define SERIAL_8E1 0x26 -#define SERIAL_5E2 0x28 -#define SERIAL_6E2 0x2A #define SERIAL_7E2 0x2C #define SERIAL_8E2 0x2E -#define SERIAL_5O1 0x30 -#define SERIAL_6O1 0x32 #define SERIAL_7O1 0x34 #define SERIAL_8O1 0x36 -#define SERIAL_5O2 0x38 -#define SERIAL_6O2 0x3A #define SERIAL_7O2 0x3C #define SERIAL_8O2 0x3E