[NUCLEO_L053R8] Improvement of Serial hal

pull/459/head
bcostm 2014-08-21 09:54:11 +02:00
parent b507427292
commit 91ee61cc17
1 changed files with 9 additions and 5 deletions

View File

@ -91,6 +91,10 @@ static void init_uart(serial_t *obj) {
UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.Mode = UART_MODE_TX_RX;
} }
// Disable the reception overrun detection
UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT;
UartHandle.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
HAL_UART_Init(&UartHandle); HAL_UART_Init(&UartHandle);
} }
@ -217,7 +221,7 @@ static void uart_irq(UARTName name, int id) {
} }
if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) { if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) {
irq_handler(serial_irq_ids[id], RxIrq); irq_handler(serial_irq_ids[id], RxIrq);
__HAL_UART_SEND_REQ(&UartHandle, UART_RXDATA_FLUSH_REQUEST); volatile uint32_t tmpval = UartHandle.Instance->RDR; // Clear RXNE bit
} }
} }
} }
@ -278,9 +282,9 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
if (irq == RxIrq) { if (irq == RxIrq) {
__HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE); __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);
// Check if TxIrq is disabled too // Check if TxIrq is disabled too
if ((UartHandle.Instance->CR1 & USART_CR1_TXEIE) == 0) all_disabled = 1; if ((UartHandle.Instance->CR1 & USART_CR1_TCIE) == 0) all_disabled = 1;
} else { // TxIrq } else { // TxIrq
__HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TXE); __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TC);
// Check if RxIrq is disabled too // Check if RxIrq is disabled too
if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1; if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
} }
@ -297,13 +301,13 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
int serial_getc(serial_t *obj) { int serial_getc(serial_t *obj) {
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
while (!serial_readable(obj)); while (!serial_readable(obj));
return (int)(uart->RDR & 0xFF); return (int)(uart->RDR & (uint32_t)0xFF);
} }
void serial_putc(serial_t *obj, int c) { void serial_putc(serial_t *obj, int c) {
USART_TypeDef *uart = (USART_TypeDef *)(obj->uart); USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
while (!serial_writable(obj)); while (!serial_writable(obj));
uart->TDR = (uint16_t)(c & 0xFF); uart->TDR = (uint32_t)(c & (uint32_t)0xFF);
} }
int serial_readable(serial_t *obj) { int serial_readable(serial_t *obj) {