From 5e98da14d328e5f466fc41ce7f894e0bcce13e96 Mon Sep 17 00:00:00 2001 From: "Francisco J. Manno" Date: Sat, 22 Apr 2017 15:19:43 +0100 Subject: [PATCH] STM32s Serial does not properly handle parity bits Reworked the serial_format() function for STM32F0x devices to take the format in the form: data_bits - parity - stop_bits E.g. 8 - N - 1 where data_bits exclude the parity bit. Added a case for 7 bits data as at least the chips STM32F0x1/STM32F0x2/STM32F0x8 support 7 bits data. Consolidated serial_format() and uart_init() functions into a general TARGET_STM serial_api.c file since the functions are common to all STM targets. Fixes #4189 --- .../{serial_api.c => serial_device.c} | 77 +---------- .../{serial_api.c => serial_device.c} | 75 +---------- .../{serial_api.c => serial_device.c} | 75 +---------- .../{serial_api.c => serial_device.c} | 78 +---------- .../{serial_api.c => serial_device.c} | 77 +---------- .../{serial_api.c => serial_device.c} | 77 +---------- .../{serial_api.c => serial_device.c} | 76 +---------- .../{serial_api.c => serial_device.c} | 75 +---------- .../{serial_api.c => serial_device.c} | 75 +---------- targets/TARGET_STM/serial_api.c | 122 ++++++++++++++++++ targets/TARGET_STM/serial_api_hal.h | 63 +++++++++ 11 files changed, 206 insertions(+), 664 deletions(-) rename targets/TARGET_STM/TARGET_STM32F0/{serial_api.c => serial_device.c} (93%) rename targets/TARGET_STM/TARGET_STM32F1/{serial_api.c => serial_device.c} (92%) rename targets/TARGET_STM/TARGET_STM32F2/{serial_api.c => serial_device.c} (93%) rename targets/TARGET_STM/TARGET_STM32F3/{serial_api.c => serial_device.c} (92%) rename targets/TARGET_STM/TARGET_STM32F4/{serial_api.c => serial_device.c} (93%) rename targets/TARGET_STM/TARGET_STM32F7/{serial_api.c => serial_device.c} (93%) rename targets/TARGET_STM/TARGET_STM32L0/{serial_api.c => serial_device.c} (92%) rename targets/TARGET_STM/TARGET_STM32L1/{serial_api.c => serial_device.c} (92%) rename targets/TARGET_STM/TARGET_STM32L4/{serial_api.c => serial_device.c} (93%) create mode 100644 targets/TARGET_STM/serial_api.c create mode 100644 targets/TARGET_STM/serial_api_hal.h diff --git a/targets/TARGET_STM/TARGET_STM32F0/serial_api.c b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c similarity index 93% rename from targets/TARGET_STM/TARGET_STM32F0/serial_api.c rename to targets/TARGET_STM/TARGET_STM32F0/serial_device.c index b7f50a0431b..ca9f1239a14 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -49,52 +50,13 @@ #endif static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -293,39 +255,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ @@ -345,6 +274,7 @@ static void uart_irq(int id) if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) { irq_handler(serial_irq_ids[id], RxIrq); volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag + UNUSED(tmpval); } } if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) { @@ -975,6 +905,7 @@ void serial_rx_abort_asynch(serial_t *obj) // clear flags __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF | UART_CLEAR_FEF | UART_CLEAR_OREF); volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag + UNUSED(tmpval); // reset states huart->RxXferCount = 0; diff --git a/targets/TARGET_STM/TARGET_STM32F1/serial_api.c b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c similarity index 92% rename from targets/TARGET_STM/TARGET_STM32F1/serial_api.c rename to targets/TARGET_STM/TARGET_STM32F1/serial_device.c index cf0df17d7cb..938df986741 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32F1/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,52 +42,13 @@ #define UART_NUM (3) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -188,39 +150,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32F2/serial_api.c b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c similarity index 93% rename from targets/TARGET_STM/TARGET_STM32F2/serial_api.c rename to targets/TARGET_STM/TARGET_STM32F2/serial_device.c index 5c9a12bc88d..3d173e59175 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32F2/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,52 +42,13 @@ #define UART_NUM (8) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -275,39 +237,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32F3/serial_api.c b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c similarity index 92% rename from targets/TARGET_STM/TARGET_STM32F3/serial_api.c rename to targets/TARGET_STM/TARGET_STM32F3/serial_device.c index 5698b91fe34..5e1ce117e54 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32F3/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,53 +42,13 @@ #define UART_NUM (5) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; -static uart_irq_handler irq_handler; +uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -240,39 +201,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32F4/serial_api.c b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c similarity index 93% rename from targets/TARGET_STM/TARGET_STM32F4/serial_api.c rename to targets/TARGET_STM/TARGET_STM32F4/serial_device.c index 653e06ab165..0d5ad8c890d 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32F4/serial_device.c @@ -30,6 +30,7 @@ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,54 +42,13 @@ #define UART_NUM (8) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->Init.OverSampling = UART_OVERSAMPLING_16; - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -274,39 +234,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32F7/serial_api.c b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c similarity index 93% rename from targets/TARGET_STM/TARGET_STM32F7/serial_api.c rename to targets/TARGET_STM/TARGET_STM32F7/serial_device.c index 32f890e8703..f5b2f3da27a 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32F7/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -40,54 +41,13 @@ #define UART_NUM (8) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->Init.OverSampling = UART_OVERSAMPLING_16; - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -269,39 +229,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32L0/serial_api.c b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c similarity index 92% rename from targets/TARGET_STM/TARGET_STM32L0/serial_api.c rename to targets/TARGET_STM/TARGET_STM32L0/serial_device.c index f947b4d645a..06ac4d31b67 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,53 +42,13 @@ #define UART_NUM (5) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -231,39 +192,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32L1/serial_api.c b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c similarity index 92% rename from targets/TARGET_STM/TARGET_STM32L1/serial_api.c rename to targets/TARGET_STM/TARGET_STM32L1/serial_device.c index 9f804f521e6..01cced32600 100755 --- a/targets/TARGET_STM/TARGET_STM32L1/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32L1/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,52 +42,13 @@ #define UART_NUM (5) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -219,39 +181,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/TARGET_STM32L4/serial_api.c b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c similarity index 93% rename from targets/TARGET_STM/TARGET_STM32L4/serial_api.c rename to targets/TARGET_STM/TARGET_STM32L4/serial_device.c index 3458a8bf393..61657cf1dcf 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/serial_api.c +++ b/targets/TARGET_STM/TARGET_STM32L4/serial_device.c @@ -29,6 +29,7 @@ */ #include "mbed_assert.h" #include "serial_api.h" +#include "serial_api_hal.h" #if DEVICE_SERIAL @@ -41,52 +42,13 @@ #define UART_NUM (6) static uint32_t serial_irq_ids[UART_NUM] = {0}; -static UART_HandleTypeDef uart_handlers[UART_NUM]; +UART_HandleTypeDef uart_handlers[UART_NUM]; static uart_irq_handler irq_handler; int stdio_uart_inited = 0; serial_t stdio_uart; -#if DEVICE_SERIAL_ASYNCH - #define SERIAL_S(obj) (&((obj)->serial)) -#else - #define SERIAL_S(obj) (obj) -#endif - -static void init_uart(serial_t *obj) -{ - struct serial_s *obj_s = SERIAL_S(obj); - UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; - huart->Instance = (USART_TypeDef *)(obj_s->uart); - - huart->Init.BaudRate = obj_s->baudrate; - huart->Init.WordLength = obj_s->databits; - huart->Init.StopBits = obj_s->stopbits; - huart->Init.Parity = obj_s->parity; -#if DEVICE_SERIAL_FC - huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; -#else - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; -#endif - huart->TxXferCount = 0; - huart->TxXferSize = 0; - huart->RxXferCount = 0; - huart->RxXferSize = 0; - - if (obj_s->pin_rx == NC) { - huart->Init.Mode = UART_MODE_TX; - } else if (obj_s->pin_tx == NC) { - huart->Init.Mode = UART_MODE_RX; - } else { - huart->Init.Mode = UART_MODE_TX_RX; - } - - if (HAL_UART_Init(huart) != HAL_OK) { - error("Cannot initialize UART\n"); - } -} - void serial_init(serial_t *obj, PinName tx, PinName rx) { struct serial_s *obj_s = SERIAL_S(obj); @@ -246,39 +208,6 @@ void serial_baud(serial_t *obj, int baudrate) init_uart(obj); } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) -{ - struct serial_s *obj_s = SERIAL_S(obj); - - if (data_bits == 9) { - obj_s->databits = UART_WORDLENGTH_9B; - } else { - obj_s->databits = UART_WORDLENGTH_8B; - } - - switch (parity) { - case ParityOdd: - obj_s->parity = UART_PARITY_ODD; - break; - case ParityEven: - obj_s->parity = UART_PARITY_EVEN; - break; - default: // ParityNone - case ParityForced0: // unsupported! - case ParityForced1: // unsupported! - obj_s->parity = UART_PARITY_NONE; - break; - } - - if (stop_bits == 2) { - obj_s->stopbits = UART_STOPBITS_2; - } else { - obj_s->stopbits = UART_STOPBITS_1; - } - - init_uart(obj); -} - /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ diff --git a/targets/TARGET_STM/serial_api.c b/targets/TARGET_STM/serial_api.c new file mode 100644 index 00000000000..c851b04bc4d --- /dev/null +++ b/targets/TARGET_STM/serial_api.c @@ -0,0 +1,122 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2015, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#include "mbed_assert.h" +#include "mbed_error.h" +#include "serial_api.h" +#include "serial_api_hal.h" + +#if DEVICE_SERIAL + +void init_uart(serial_t *obj) +{ + struct serial_s *obj_s = SERIAL_S(obj); + UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; + huart->Instance = (USART_TypeDef *)(obj_s->uart); + + huart->Init.BaudRate = obj_s->baudrate; + huart->Init.WordLength = obj_s->databits; + huart->Init.StopBits = obj_s->stopbits; + huart->Init.Parity = obj_s->parity; +#if DEVICE_SERIAL_FC + huart->Init.HwFlowCtl = obj_s->hw_flow_ctl; +#else + huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; +#endif + huart->Init.OverSampling = UART_OVERSAMPLING_16; + huart->TxXferCount = 0; + huart->TxXferSize = 0; + huart->RxXferCount = 0; + huart->RxXferSize = 0; + + if (obj_s->pin_rx == NC) { + huart->Init.Mode = UART_MODE_TX; + } else if (obj_s->pin_tx == NC) { + huart->Init.Mode = UART_MODE_RX; + } else { + huart->Init.Mode = UART_MODE_TX_RX; + } + + if (HAL_UART_Init(huart) != HAL_OK) { + error("Cannot initialize UART\n"); + } +} + +void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) +{ + struct serial_s *obj_s = SERIAL_S(obj); + + switch (parity) { + case ParityOdd: + obj_s->parity = UART_PARITY_ODD; + break; + case ParityEven: + obj_s->parity = UART_PARITY_EVEN; + break; + default: // ParityNone + case ParityForced0: // unsupported! + case ParityForced1: // unsupported! + obj_s->parity = UART_PARITY_NONE; + break; + } + + switch (data_bits) { + case 9: + MBED_ASSERT(parity == UART_PARITY_NONE); + obj_s->databits = UART_WORDLENGTH_9B; + break; + default: + case 8: + if (parity != UART_PARITY_NONE) { + obj_s->databits = UART_WORDLENGTH_9B; + } else { + obj_s->databits = UART_WORDLENGTH_8B; + } + break; +#if defined UART_WORDLENGTH_7B + case 7: + if (parity != UART_PARITY_NONE) { + obj_s->databits = UART_WORDLENGTH_8B; + } else { + obj_s->databits = UART_WORDLENGTH_7B; + } + break; +#endif + } + + if (stop_bits == 2) { + obj_s->stopbits = UART_STOPBITS_2; + } else { + obj_s->stopbits = UART_STOPBITS_1; + } + + init_uart(obj); +} + +#endif /* DEVICE_SERIAL */ diff --git a/targets/TARGET_STM/serial_api_hal.h b/targets/TARGET_STM/serial_api_hal.h new file mode 100644 index 00000000000..e4a1892f527 --- /dev/null +++ b/targets/TARGET_STM/serial_api_hal.h @@ -0,0 +1,63 @@ +/* mbed Microcontroller Library +******************************************************************************* +* Copyright (c) 2016, STMicroelectronics +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* 3. Neither the name of STMicroelectronics nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +******************************************************************************* +*/ + +#ifndef MBED_SERIAL_API_HAL_H +#define MBED_SERIAL_API_HAL_H + +#include "serial_api.h" + + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Extend serial_api.h + */ + +#if DEVICE_SERIAL_ASYNCH + #define SERIAL_S(obj) (&((obj)->serial)) +#else + #define SERIAL_S(obj) (obj) +#endif + +extern UART_HandleTypeDef uart_handlers[]; + + +/** Initialize and configure the UART peripheral + * + * @param obj The serial object containing the configuration + */ +void init_uart(serial_t *obj); + +#ifdef __cplusplus +} +#endif + +#endif