mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #4216 from fmanno/issue-4189
STM32s Serial: Correct handling of parity bitspull/4489/head
						commit
						8232afa53e
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
		Loading…
	
		Reference in New Issue