[stm32]uart v1 加入 err_count

This commit is contained in:
chinky 2023-06-27 18:44:03 +08:00
parent 7b8e806e3a
commit 665b2346a8

View File

@ -367,6 +367,12 @@ static rt_size_t stm32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t
return 0; return 0;
} }
typedef struct err_count
{
rt_uint32_t count:16;
rt_uint32_t error_count:16;
} uart_err_count_t;
/** /**
* Uart common interrupt process. This need add to uart ISR. * Uart common interrupt process. This need add to uart ISR.
* *
@ -375,6 +381,7 @@ static rt_size_t stm32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t
static void uart_isr(struct rt_serial_device *serial) static void uart_isr(struct rt_serial_device *serial)
{ {
struct stm32_uart *uart; struct stm32_uart *uart;
rt_bool_t err_flag = RT_FALSE;
#ifdef RT_SERIAL_USING_DMA #ifdef RT_SERIAL_USING_DMA
rt_size_t recv_total_index, recv_len; rt_size_t recv_total_index, recv_len;
rt_base_t level; rt_base_t level;
@ -383,6 +390,7 @@ static void uart_isr(struct rt_serial_device *serial)
RT_ASSERT(serial != RT_NULL); RT_ASSERT(serial != RT_NULL);
uart = rt_container_of(serial, struct stm32_uart, serial); uart = rt_container_of(serial, struct stm32_uart, serial);
err_flag = (&(uart->handle))->Instance->SR & (UART_FLAG_NE | UART_FLAG_FE | UART_FLAG_PE);
/* UART in mode Receiver -------------------------------------------------*/ /* UART in mode Receiver -------------------------------------------------*/
if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) && if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&
(__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET)) (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET))
@ -423,15 +431,17 @@ static void uart_isr(struct rt_serial_device *serial)
} }
if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_NE) != RESET) if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_NE) != RESET)
{ {
err_flag = RT_TRUE;
__HAL_UART_CLEAR_NEFLAG(&uart->handle); __HAL_UART_CLEAR_NEFLAG(&uart->handle);
} }
if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_FE) != RESET) if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_FE) != RESET)
{ {
uart->serial.config.reserved = 1; err_flag = RT_TRUE;
__HAL_UART_CLEAR_FEFLAG(&uart->handle); __HAL_UART_CLEAR_FEFLAG(&uart->handle);
} }
if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_PE) != RESET) if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_PE) != RESET)
{ {
err_flag = RT_TRUE;
__HAL_UART_CLEAR_PEFLAG(&uart->handle); __HAL_UART_CLEAR_PEFLAG(&uart->handle);
} }
#if !defined(SOC_SERIES_STM32L4) && !defined(SOC_SERIES_STM32WL) && !defined(SOC_SERIES_STM32F7) && !defined(SOC_SERIES_STM32F0) \ #if !defined(SOC_SERIES_STM32L4) && !defined(SOC_SERIES_STM32WL) && !defined(SOC_SERIES_STM32F7) && !defined(SOC_SERIES_STM32F0) \
@ -467,6 +477,14 @@ static void uart_isr(struct rt_serial_device *serial)
UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_RXNE); UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_RXNE);
} }
} }
uart_err_count_t *err_count = &uart->serial.parent.user_data;
err_count->count++;
if (err_flag)
{
err_count->error_count++;
__HAL_UART_CLEAR_PEFLAG(&uart->handle);
}
} }
#ifdef RT_SERIAL_USING_DMA #ifdef RT_SERIAL_USING_DMA