Skip to content

Commit 3e8c03e

Browse files
authored
Merge pull request #3421 from ErnestChen1/master
[bsp] fix UART DMA TX
2 parents a189eb6 + c1821b8 commit 3e8c03e

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,19 @@ extern "C" {
6161
}
6262
#endif /* UART1_DMA_RX_CONFIG */
6363
#endif /* BSP_UART1_RX_USING_DMA */
64-
64+
65+
#if defined(BSP_UART1_TX_USING_DMA)
66+
#ifndef UART1_DMA_TX_CONFIG
67+
#define UART1_DMA_TX_CONFIG \
68+
{ \
69+
.Instance = UART1_TX_DMA_INSTANCE, \
70+
.request = UART1_TX_DMA_REQUEST, \
71+
.dma_rcc = UART1_TX_DMA_RCC, \
72+
.dma_irq = UART1_TX_DMA_IRQ, \
73+
}
74+
#endif /* UART1_DMA_TX_CONFIG */
75+
#endif /* BSP_UART1_TX_USING_DMA */
76+
6577
#if defined(BSP_USING_UART2)
6678
#ifndef UART2_CONFIG
6779
#define UART2_CONFIG \
@@ -85,6 +97,18 @@ extern "C" {
8597
#endif /* UART2_DMA_RX_CONFIG */
8698
#endif /* BSP_UART2_RX_USING_DMA */
8799

100+
#if defined(BSP_UART2_TX_USING_DMA)
101+
#ifndef UART2_DMA_TX_CONFIG
102+
#define UART2_DMA_TX_CONFIG \
103+
{ \
104+
.Instance = UART2_TX_DMA_INSTANCE, \
105+
.request = UART2_TX_DMA_REQUEST, \
106+
.dma_rcc = UART2_TX_DMA_RCC, \
107+
.dma_irq = UART2_TX_DMA_IRQ, \
108+
}
109+
#endif /* UART2_DMA_TX_CONFIG */
110+
#endif /* BSP_UART2_TX_USING_DMA */
111+
88112
#if defined(BSP_USING_UART3)
89113
#ifndef UART3_CONFIG
90114
#define UART3_CONFIG \
@@ -108,6 +132,18 @@ extern "C" {
108132
#endif /* UART3_DMA_RX_CONFIG */
109133
#endif /* BSP_UART3_RX_USING_DMA */
110134

135+
#if defined(BSP_UART3_TX_USING_DMA)
136+
#ifndef UART3_DMA_TX_CONFIG
137+
#define UART3_DMA_TX_CONFIG \
138+
{ \
139+
.Instance = UART3_TX_DMA_INSTANCE, \
140+
.request = UART3_TX_DMA_REQUEST, \
141+
.dma_rcc = UART3_TX_DMA_RCC, \
142+
.dma_irq = UART3_TX_DMA_IRQ, \
143+
}
144+
#endif /* UART3_DMA_TX_CONFIG */
145+
#endif /* BSP_UART3_TX_USING_DMA */
146+
111147
#ifdef __cplusplus
112148
}
113149
#endif

bsp/stm32/libraries/HAL_Drivers/drv_usart.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,12 +876,36 @@ void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
876876
uart = (struct stm32_uart *)huart;
877877
dma_isr(&uart->serial);
878878
}
879+
880+
static void _dma_tx_complete(struct rt_serial_device *serial)
881+
{
882+
struct stm32_uart *uart;
883+
rt_size_t trans_total_index;
884+
rt_base_t level;
885+
886+
RT_ASSERT(serial != RT_NULL);
887+
uart = rt_container_of(serial, struct stm32_uart, serial);
888+
889+
if ((__HAL_DMA_GET_IT_SOURCE(&(uart->dma_tx.handle), DMA_IT_TC) != RESET) ||
890+
(__HAL_DMA_GET_IT_SOURCE(&(uart->dma_tx.handle), DMA_IT_HT) != RESET))
891+
{
892+
level = rt_hw_interrupt_disable();
893+
trans_total_index = __HAL_DMA_GET_COUNTER(&(uart->dma_tx.handle));
894+
rt_hw_interrupt_enable(level);
895+
896+
if (trans_total_index == 0)
897+
{
898+
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
899+
}
900+
}
901+
}
902+
879903
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
880904
{
881905
struct stm32_uart *uart;
882906
RT_ASSERT(huart != NULL);
883907
uart = (struct stm32_uart *)huart;
884-
rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_TX_DMADONE);
908+
_dma_tx_complete(&uart->serial);
885909
}
886910
#endif /* RT_SERIAL_USING_DMA */
887911

0 commit comments

Comments
 (0)