From 18d24cfd8d774b123c91fa690ddc164be71b031b Mon Sep 17 00:00:00 2001 From: zhouchuanfu <353896039@qq.com> Date: Fri, 3 May 2019 18:16:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0uart=E7=9A=84dma=E5=8D=8A?= =?UTF-8?q?=E4=B8=AD=E6=96=AD=E6=8E=A5=E6=94=B6=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E6=9D=A5=E8=A7=A3=E5=86=B3=E8=BF=9E=E7=BB=AD=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E6=80=A7=E6=8E=A5=E6=94=B6=E5=A4=A7=E4=BA=8Edma?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=9A=84=E6=95=B0=E6=8D=AE=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E4=B8=A2=E5=A4=B1=E6=95=B0=E6=8D=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/HAL_Drivers/drv_usart.c | 130 ++++++++++++-------- 1 file changed, 79 insertions(+), 51 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c index a1379f8a01..8d75b4dd8f 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c @@ -7,7 +7,7 @@ * Date Author Notes * 2018-10-30 SummerGift first version */ - + #include "board.h" #include "drv_usart.h" #include "drv_config.h" @@ -20,12 +20,12 @@ #if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) \ && !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && !defined(BSP_USING_LPUART1) -#error "Please define at least one BSP_USING_UARTx" -/* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */ + #error "Please define at least one BSP_USING_UARTx" + /* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */ #endif #ifdef RT_SERIAL_USING_DMA -static void stm32_dma_config(struct rt_serial_device *serial); + static void stm32_dma_config(struct rt_serial_device *serial); #endif enum @@ -56,25 +56,25 @@ enum static struct stm32_uart_config uart_config[] = { #ifdef BSP_USING_UART1 - UART1_CONFIG, + UART1_CONFIG, #endif #ifdef BSP_USING_UART2 - UART2_CONFIG, + UART2_CONFIG, #endif #ifdef BSP_USING_UART3 - UART3_CONFIG, + UART3_CONFIG, #endif #ifdef BSP_USING_UART4 - UART4_CONFIG, + UART4_CONFIG, #endif #ifdef BSP_USING_UART5 - UART5_CONFIG, + UART5_CONFIG, #endif #ifdef BSP_USING_UART6 - UART6_CONFIG, + UART6_CONFIG, #endif #ifdef BSP_USING_LPUART1 - LPUART1_CONFIG, + LPUART1_CONFIG, #endif }; @@ -147,7 +147,7 @@ static rt_err_t stm32_control(struct rt_serial_device *serial, int cmd, void *ar #ifdef RT_SERIAL_USING_DMA rt_ubase_t ctrl_arg = (rt_ubase_t)arg; #endif - + RT_ASSERT(serial != RT_NULL); uart = (struct stm32_uart *)serial->parent.user_data; RT_ASSERT(uart != RT_NULL); @@ -239,7 +239,7 @@ static void uart_isr(struct rt_serial_device *serial) rt_size_t recv_total_index, recv_len; rt_base_t level; #endif - + RT_ASSERT(serial != RT_NULL); uart = (struct stm32_uart *) serial->parent.user_data; @@ -247,7 +247,7 @@ static void uart_isr(struct rt_serial_device *serial) /* UART in mode Receiver -------------------------------------------------*/ 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)) { rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -312,6 +312,42 @@ static void uart_isr(struct rt_serial_device *serial) } } +#ifdef RT_SERIAL_USING_DMA +static void dma_isr(struct rt_serial_device *serial) +{ + struct stm32_uart *uart; + rt_size_t recv_total_index, recv_len; + rt_base_t level; + + RT_ASSERT(serial != RT_NULL); + + uart = (struct stm32_uart *) serial->parent.user_data; + RT_ASSERT(uart != RT_NULL); + + if ((__HAL_DMA_GET_IT_SOURCE(&(uart->dma.handle), DMA_IT_TC) != RESET) || + (__HAL_DMA_GET_IT_SOURCE(&(uart->dma.handle), DMA_IT_HT) != RESET)) + { + level = rt_hw_interrupt_disable(); + recv_total_index = serial->config.bufsz - __HAL_DMA_GET_COUNTER(&(uart->dma.handle)); + if (recv_total_index == 0) + { + recv_len = serial->config.bufsz - uart->dma.last_index; + } + else + { + recv_len = recv_total_index - uart->dma.last_index; + } + uart->dma.last_index = recv_total_index; + rt_hw_interrupt_enable(level); + + if (recv_len) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + } + } +} +#endif + #if defined(BSP_USING_UART1) void USART1_IRQHandler(void) { @@ -319,7 +355,7 @@ void USART1_IRQHandler(void) rt_interrupt_enter(); uart_isr(&(uart_obj[UART1_INDEX].serial)); - + /* leave interrupt */ rt_interrupt_leave(); } @@ -369,7 +405,7 @@ void USART3_IRQHandler(void) rt_interrupt_enter(); uart_isr(&(uart_obj[UART3_INDEX].serial)); - + /* leave interrupt */ rt_interrupt_leave(); } @@ -394,7 +430,7 @@ void UART4_IRQHandler(void) rt_interrupt_enter(); uart_isr(&(uart_obj[UART4_INDEX].serial)); - + /* leave interrupt */ rt_interrupt_leave(); } @@ -419,7 +455,7 @@ void UART5_IRQHandler(void) rt_interrupt_enter(); uart_isr(&(uart_obj[UART5_INDEX].serial)); - + /* leave interrupt */ rt_interrupt_leave(); } @@ -444,7 +480,7 @@ void USART6_IRQHandler(void) rt_interrupt_enter(); uart_isr(&(uart_obj[UART6_INDEX].serial)); - + /* leave interrupt */ rt_interrupt_leave(); } @@ -469,7 +505,7 @@ void LPUART1_IRQHandler(void) rt_interrupt_enter(); uart_isr(&(uart_obj[LPUART1_INDEX].serial)); - + /* leave interrupt */ rt_interrupt_leave(); } @@ -494,13 +530,13 @@ static void stm32_dma_config(struct rt_serial_device *serial) struct stm32_uart *uart = (struct stm32_uart *)serial->parent.user_data; RT_ASSERT(uart != RT_NULL); struct rt_serial_rx_fifo *rx_fifo; - + LOG_D("%s dma config start", uart->config->name); { - rt_uint32_t tmpreg= 0x00U; + rt_uint32_t tmpreg = 0x00U; #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) \ - || defined(SOC_SERIES_STM32L0) + || defined(SOC_SERIES_STM32L0) /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ SET_BIT(RCC->AHBENR, uart->config->dma_rx->dma_rcc); tmpreg = READ_BIT(RCC->AHBENR, uart->config->dma_rx->dma_rcc); @@ -508,7 +544,7 @@ static void stm32_dma_config(struct rt_serial_device *serial) /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ SET_BIT(RCC->AHB1ENR, uart->config->dma_rx->dma_rcc); tmpreg = READ_BIT(RCC->AHB1ENR, uart->config->dma_rx->dma_rcc); -#endif +#endif UNUSED(tmpreg); /* To avoid compiler warnings */ } @@ -544,7 +580,7 @@ static void stm32_dma_config(struct rt_serial_device *serial) } rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; - + /* Start DMA transfer */ if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.bufsz) != HAL_OK) { @@ -554,14 +590,14 @@ static void stm32_dma_config(struct rt_serial_device *serial) /* enable interrupt */ __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE); - + /* enable rx irq */ HAL_NVIC_SetPriority(uart->config->dma_rx->dma_irq, 0, 0); HAL_NVIC_EnableIRQ(uart->config->dma_rx->dma_irq); - + HAL_NVIC_SetPriority(uart->config->irq_type, 1, 0); HAL_NVIC_EnableIRQ(uart->config->irq_type); - + LOG_D("%s dma RX instance: %x", uart->config->name, uart->dma.handle.Instance); LOG_D("%s dma config done", uart->config->name); } @@ -590,25 +626,17 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { - struct rt_serial_device *serial; struct stm32_uart *uart; - rt_size_t recv_len; - rt_base_t level; - RT_ASSERT(huart != NULL); uart = (struct stm32_uart *)huart; - serial = &uart->serial; - - level = rt_hw_interrupt_disable(); - - recv_len = serial->config.bufsz - uart->dma.last_index; - uart->dma.last_index = 0; - - rt_hw_interrupt_enable(level); - if (recv_len) - { - rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); - } + dma_isr(&uart->serial); +} +void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + struct stm32_uart *uart; + RT_ASSERT(huart != NULL); + uart = (struct stm32_uart *)huart; + dma_isr(&uart->serial); } #endif /* RT_SERIAL_USING_DMA */ @@ -658,7 +686,7 @@ int rt_hw_usart_init(void) rt_err_t result = 0; stm32_uart_get_dma_config(); - + for (int i = 0; i < obj_num; i++) { uart_obj[i].config = &uart_config[i]; @@ -666,20 +694,20 @@ int rt_hw_usart_init(void) uart_obj[i].serial.config = config; #if defined(RT_SERIAL_USING_DMA) - if(uart_obj[i].uart_dma_flag) + if (uart_obj[i].uart_dma_flag) { /* register UART device */ - result = rt_hw_serial_register(&uart_obj[i].serial,uart_obj[i].config->name, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX| RT_DEVICE_FLAG_DMA_RX - ,&uart_obj[i]); + result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name, + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_RX + , &uart_obj[i]); } else #endif { /* register UART device */ - result = rt_hw_serial_register(&uart_obj[i].serial,uart_obj[i].config->name, + result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX - ,&uart_obj[i]); + , &uart_obj[i]); } RT_ASSERT(result == RT_EOK); } From 77daf413be26940398464735a62065b3fde49a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E4=BC=A0=E7=A6=8F?= <46174387+zhouchuanfu@users.noreply.github.com> Date: Thu, 16 May 2019 12:37:25 +0800 Subject: [PATCH 2/2] Update drv_usart.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加函数说明 --- bsp/stm32/libraries/HAL_Drivers/drv_usart.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c index 8d75b4dd8f..68133457b4 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c @@ -631,6 +631,14 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) uart = (struct stm32_uart *)huart; dma_isr(&uart->serial); } + +/** + * @brief Rx Half transfer completed callback + * @param huart: UART handle + * @note This example shows a simple way to report end of DMA Rx Half transfer, + * and you can add your own implementation. + * @retval None + */ void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) { struct stm32_uart *uart;