summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2020-03-10 16:24:38 +0800
committerGitHub <[email protected]>2020-03-10 16:24:38 +0800
commit3e8c03e9344d98d2cfa29bfe0ba0789ef624beba (patch)
tree2c5746006acaf5e9ba1b53d26806786f3e471925 /bsp
parenta189eb6c330045cb867999c81edad46593bcdeeb (diff)
parentc1821b85a17360871d0b33be355f20b9a8193c67 (diff)
Merge pull request #3421 from ErnestChen1/master
[bsp] fix UART DMA TX
Diffstat (limited to 'bsp')
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h38
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/drv_usart.c26
2 files changed, 62 insertions, 2 deletions
diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h
index d6f972e7d9..aa71112655 100644
--- a/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h
+++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h
@@ -61,7 +61,19 @@ extern "C" {
}
#endif /* UART1_DMA_RX_CONFIG */
#endif /* BSP_UART1_RX_USING_DMA */
-
+
+#if defined(BSP_UART1_TX_USING_DMA)
+#ifndef UART1_DMA_TX_CONFIG
+#define UART1_DMA_TX_CONFIG \
+ { \
+ .Instance = UART1_TX_DMA_INSTANCE, \
+ .request = UART1_TX_DMA_REQUEST, \
+ .dma_rcc = UART1_TX_DMA_RCC, \
+ .dma_irq = UART1_TX_DMA_IRQ, \
+ }
+#endif /* UART1_DMA_TX_CONFIG */
+#endif /* BSP_UART1_TX_USING_DMA */
+
#if defined(BSP_USING_UART2)
#ifndef UART2_CONFIG
#define UART2_CONFIG \
@@ -85,6 +97,18 @@ extern "C" {
#endif /* UART2_DMA_RX_CONFIG */
#endif /* BSP_UART2_RX_USING_DMA */
+#if defined(BSP_UART2_TX_USING_DMA)
+#ifndef UART2_DMA_TX_CONFIG
+#define UART2_DMA_TX_CONFIG \
+ { \
+ .Instance = UART2_TX_DMA_INSTANCE, \
+ .request = UART2_TX_DMA_REQUEST, \
+ .dma_rcc = UART2_TX_DMA_RCC, \
+ .dma_irq = UART2_TX_DMA_IRQ, \
+ }
+#endif /* UART2_DMA_TX_CONFIG */
+#endif /* BSP_UART2_TX_USING_DMA */
+
#if defined(BSP_USING_UART3)
#ifndef UART3_CONFIG
#define UART3_CONFIG \
@@ -108,6 +132,18 @@ extern "C" {
#endif /* UART3_DMA_RX_CONFIG */
#endif /* BSP_UART3_RX_USING_DMA */
+#if defined(BSP_UART3_TX_USING_DMA)
+#ifndef UART3_DMA_TX_CONFIG
+#define UART3_DMA_TX_CONFIG \
+ { \
+ .Instance = UART3_TX_DMA_INSTANCE, \
+ .request = UART3_TX_DMA_REQUEST, \
+ .dma_rcc = UART3_TX_DMA_RCC, \
+ .dma_irq = UART3_TX_DMA_IRQ, \
+ }
+#endif /* UART3_DMA_TX_CONFIG */
+#endif /* BSP_UART3_TX_USING_DMA */
+
#ifdef __cplusplus
}
#endif
diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c
index 7418d6f50c..64ca8fe4b3 100644
--- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c
+++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c
@@ -876,12 +876,36 @@ void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
uart = (struct stm32_uart *)huart;
dma_isr(&uart->serial);
}
+
+static void _dma_tx_complete(struct rt_serial_device *serial)
+{
+ struct stm32_uart *uart;
+ rt_size_t trans_total_index;
+ rt_base_t level;
+
+ RT_ASSERT(serial != RT_NULL);
+ uart = rt_container_of(serial, struct stm32_uart, serial);
+
+ if ((__HAL_DMA_GET_IT_SOURCE(&(uart->dma_tx.handle), DMA_IT_TC) != RESET) ||
+ (__HAL_DMA_GET_IT_SOURCE(&(uart->dma_tx.handle), DMA_IT_HT) != RESET))
+ {
+ level = rt_hw_interrupt_disable();
+ trans_total_index = __HAL_DMA_GET_COUNTER(&(uart->dma_tx.handle));
+ rt_hw_interrupt_enable(level);
+
+ if (trans_total_index == 0)
+ {
+ rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
+ }
+ }
+}
+
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
struct stm32_uart *uart;
RT_ASSERT(huart != NULL);
uart = (struct stm32_uart *)huart;
- rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_TX_DMADONE);
+ _dma_tx_complete(&uart->serial);
}
#endif /* RT_SERIAL_USING_DMA */