From d5ec0ec7e09be5fbbf60d13e0aa36d9da097767a Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Tue, 14 Apr 2026 15:35:22 +0800 Subject: [PATCH] feat[STM32][USART]: add uart error callback support add a control command to register a per-device uart error callback invoke the callback from the HAL uart error hook and clear it before close return -RT_ENOSYS when dma mode is requested without dma support propagate the set-int fallback result in optmode setup to keep control return values explicit --- .../HAL_Drivers/drivers/drv_usart_v2.c | 35 ++++++++++++++----- .../HAL_Drivers/drivers/drv_usart_v2.h | 4 ++- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c index 3dc578ba7e0..cab816b52e2 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c @@ -280,25 +280,39 @@ static rt_err_t stm32_control(struct rt_serial_device *serial, int cmd, void *ar { #ifdef RT_SERIAL_USING_DMA stm32_dma_config(serial, ctrl_arg); +#else + return -RT_ENOSYS; #endif } else - stm32_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)ctrl_arg); + { + return stm32_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)ctrl_arg); + } break; - case RT_DEVICE_CHECK_OPTMODE: { + case RT_DEVICE_CHECK_OPTMODE: + { if (ctrl_arg & RT_DEVICE_FLAG_DMA_TX) return RT_SERIAL_TX_BLOCKING_NO_BUFFER; else return RT_SERIAL_TX_BLOCKING_BUFFER; } case RT_DEVICE_CTRL_CLOSE: + { + uart->error_indicate = RT_NULL; if (HAL_UART_DeInit(&(uart->handle)) != HAL_OK) { RT_ASSERT(0) } break; } + case UART_CTRL_SET_ERROR_CALLBACK: + { + uart->error_indicate = (rt_err_t (*)(rt_device_t dev, rt_uint32_t error_code))arg; + break; + } + } + return RT_EOK; } @@ -1242,6 +1256,10 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) struct stm32_uart *uart = (struct stm32_uart *)huart; LOG_D("%s: %s %d\n", __FUNCTION__, uart->config->name, huart->ErrorCode); UNUSED(uart); + if(uart->error_indicate != RT_NULL) + { + uart->error_indicate(&uart->serial.parent, huart->ErrorCode); + } } /** @@ -1304,12 +1322,13 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) #endif /* RT_SERIAL_USING_DMA */ static const struct rt_uart_ops stm32_uart_ops = - { - .configure = stm32_configure, - .control = stm32_control, - .putc = stm32_putc, - .getc = stm32_getc, - .transmit = stm32_transmit}; +{ + .configure = stm32_configure, + .control = stm32_control, + .putc = stm32_putc, + .getc = stm32_getc, + .transmit = stm32_transmit +}; int rt_hw_usart_init(void) { diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.h b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.h index 2f263a70078..7d23514fe45 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.h @@ -47,6 +47,7 @@ int rt_hw_usart_init(void); #define UART_RX_DMA_IT_HT_FLAG 0x01 #define UART_RX_DMA_IT_TC_FLAG 0x02 +#define UART_CTRL_SET_ERROR_CALLBACK 0x100 /* stm32 config class */ struct stm32_uart_config @@ -66,7 +67,8 @@ struct stm32_uart { UART_HandleTypeDef handle; struct stm32_uart_config *config; - + /* device call back */ + rt_err_t (*error_indicate)(rt_device_t dev, rt_uint32_t error_code); #ifdef RT_SERIAL_USING_DMA struct {