69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
/**
|
|
* @file uart_transport.c
|
|
* @brief USART1 transmit helpers used by the application core.
|
|
*/
|
|
|
|
#include "uart_transport.h"
|
|
|
|
#include "main.h"
|
|
|
|
static volatile uint8_t g_dma_busy = 0u;
|
|
|
|
void uart_transport_init(void)
|
|
{
|
|
LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_7);
|
|
LL_DMA_ClearFlag_TC7(DMA2);
|
|
LL_DMA_ClearFlag_TE7(DMA2);
|
|
LL_USART_EnableDMAReq_TX(USART1);
|
|
LL_DMA_EnableIT_TC(DMA2, LL_DMA_STREAM_7);
|
|
LL_DMA_EnableIT_TE(DMA2, LL_DMA_STREAM_7);
|
|
g_dma_busy = 0u;
|
|
}
|
|
|
|
void uart_transport_reset(void)
|
|
{
|
|
g_dma_busy = 0u;
|
|
}
|
|
|
|
void uart_transport_send_blocking(const uint8_t *data, uint16_t size)
|
|
{
|
|
uint16_t index;
|
|
|
|
for (index = 0u; index < size; ++index)
|
|
{
|
|
while (!LL_USART_IsActiveFlag_TXE(USART1))
|
|
{
|
|
}
|
|
LL_USART_TransmitData8(USART1, data[index]);
|
|
}
|
|
}
|
|
|
|
void uart_transport_send_dma(const uint8_t *data, uint16_t size)
|
|
{
|
|
while (g_dma_busy != 0u)
|
|
{
|
|
}
|
|
|
|
LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_7);
|
|
LL_DMA_ClearFlag_TC7(DMA2);
|
|
LL_DMA_ClearFlag_TE7(DMA2);
|
|
LL_DMA_ConfigAddresses(DMA2,
|
|
LL_DMA_STREAM_7,
|
|
(uint32_t)data,
|
|
LL_USART_DMA_GetRegAddr(USART1, LL_USART_DMA_REG_DATA_TRANSMIT),
|
|
LL_DMA_GetDataTransferDirection(DMA2, LL_DMA_STREAM_7));
|
|
LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_7, size);
|
|
g_dma_busy = 1u;
|
|
LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_7);
|
|
}
|
|
|
|
void uart_transport_mark_dma_complete(void)
|
|
{
|
|
g_dma_busy = 0u;
|
|
}
|
|
|
|
bool uart_transport_is_dma_busy(void)
|
|
{
|
|
return g_dma_busy != 0u;
|
|
}
|