Initial commit: my SECS2 project
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
#include "bsp_Uart.h"
|
||||
#include "string.h"
|
||||
|
||||
#define RX_TEMP_BUFF_NUM (1100)
|
||||
|
||||
#define UART1_TX_LEN (32)
|
||||
#define UART1_RX_LEN (1100)
|
||||
|
||||
#define UART2_TX_LEN (32)
|
||||
#define UART2_RX_LEN (1100)
|
||||
|
||||
u8 Rx_Temp_Buff[RX_TEMP_BUFF_NUM];
|
||||
|
||||
/*发送使用DMA发送 接收*/
|
||||
u8 Uart1_TX_Buff[UART1_TX_LEN];
|
||||
u8 Uart1_Rx_Buff[UART1_RX_LEN];
|
||||
|
||||
u8 Uart2_TX_Buff[UART1_TX_LEN];
|
||||
u8 Uart2_Rx_Buff[UART1_RX_LEN];
|
||||
|
||||
|
||||
|
||||
/*接收使用DMA+串口空闲+超时检测*/
|
||||
|
||||
static void bsp_Uart_Init(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len);
|
||||
static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time);
|
||||
static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart);
|
||||
|
||||
bsp_Uart_t COM_Uart1 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART1_RX_LEN),
|
||||
.Uart =USART1,
|
||||
|
||||
.Tx_DMA = DMA1,
|
||||
.Rx_DMA = DMA1,
|
||||
|
||||
.Rx_DMA_CH = LL_DMA_CHANNEL_4,
|
||||
.Tx_DMA_CH = LL_DMA_CHANNEL_5,
|
||||
|
||||
.Tx_DMA_Len = UART1_TX_LEN,
|
||||
.Rx_DMA_Len = UART1_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart1_TX_Buff[0],
|
||||
.Rx_Addr = &Uart1_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 10, /*接收超时时间10ms 设置为0时为串口空闲中断触发 无超时检测*/
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
bsp_Uart_t COM_Uart2 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART2_RX_LEN),
|
||||
.Uart =USART2,
|
||||
|
||||
.Tx_DMA = DMA1,
|
||||
.Rx_DMA = DMA1,
|
||||
|
||||
.Rx_DMA_CH = LL_DMA_CHANNEL_1,
|
||||
.Tx_DMA_CH = LL_DMA_CHANNEL_2,
|
||||
|
||||
.Tx_DMA_Len = UART2_TX_LEN,
|
||||
.Rx_DMA_Len = UART2_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart2_TX_Buff[0],
|
||||
.Rx_Addr = &Uart2_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 5, /*接收超时时间10ms设置为0时为串口空闲中断触发 无超时检测*/
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
|
||||
static void bsp_Uart_Init(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
/*配置数据解析函数*/
|
||||
p_Uart->Rx_DataAnalysis = NULL;
|
||||
|
||||
/*RX*/
|
||||
if(NULL == p_Uart->Uart)
|
||||
return;
|
||||
LL_USART_EnableIT_RXNE(p_Uart->Uart); //使能串口接收中断
|
||||
if(NULL != p_Uart->Rx_DMA)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void bsp_Uart2_DMASend(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
|
||||
{
|
||||
while (!p_Uart->Tx_DMA_CompleteFlag); /*等待传输完成标志*/
|
||||
p_Uart->Tx_DMA_CompleteFlag = 0;
|
||||
|
||||
if(p_Uart->Tx_DMA_Len < Len)
|
||||
Len = p_Uart->Tx_DMA_Len;
|
||||
|
||||
memcpy(p_Uart->Tx_Addr, pData, Len); /*拷贝数据到发送缓冲*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*空闲中断*/
|
||||
static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
u8 rx_data;
|
||||
rx_data = LL_USART_ReceiveData8(p_Uart->Uart);
|
||||
queue_push_back(p_Uart->RxQueue,(void *)&rx_data);
|
||||
/*开始计数*/
|
||||
bsp_Uart_Rx_TimeStart(p_Uart);
|
||||
}
|
||||
|
||||
/*大数据量发送*/
|
||||
static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
|
||||
{
|
||||
u16 i;
|
||||
for (i = 0; i < Len; i++)
|
||||
{
|
||||
while (!LL_USART_IsActiveFlag_TXE(p_Uart->Uart));
|
||||
LL_USART_TransmitData8(p_Uart->Uart, pData[i]); // 发送一个字节的数据
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Tx_DMA_CompleteFlag = 1;
|
||||
}
|
||||
|
||||
/*中断计数*/
|
||||
static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time)
|
||||
{
|
||||
/*开始计数*/
|
||||
if(1 == p_Uart->Rx_StartFlag)
|
||||
{
|
||||
p_Uart->Rx_TimeCount += Time;
|
||||
}
|
||||
}
|
||||
|
||||
/*开始计数*/
|
||||
static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Rx_StartFlag = 1;
|
||||
p_Uart->Rx_TimeCount = 0;
|
||||
}
|
||||
|
||||
/*停止计数*/
|
||||
static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Rx_StartFlag = 0;
|
||||
p_Uart->Rx_TimeCount = 0;
|
||||
}
|
||||
|
||||
static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
/*超时计数完成,接收到一帧数据*/
|
||||
if(p_Uart->Rx_TimeOver < p_Uart->Rx_TimeCount)
|
||||
{
|
||||
p_Uart->Rx_Len = queue_size(p_Uart->RxQueue);
|
||||
/*停止计数*/
|
||||
bsp_Uart_Rx_TimeStop(p_Uart);
|
||||
if(p_Uart->Rx_Len <= p_Uart->Rx_DMA_Len && (0 != p_Uart->Rx_Len))
|
||||
{
|
||||
if(RX_TEMP_BUFF_NUM < p_Uart->Rx_Len)
|
||||
{
|
||||
queue_clear(p_Uart->RxQueue);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(u16 i = 0;i < p_Uart->Rx_Len;i++)
|
||||
{
|
||||
queue_pop(p_Uart->RxQueue,&Rx_Temp_Buff[i]);
|
||||
}
|
||||
if(NULL != p_Uart->Rx_DataAnalysis)
|
||||
{
|
||||
p_Uart->Rx_DataAnalysis(Rx_Temp_Buff,p_Uart->Rx_Len,p_Uart); /*解析数据*/
|
||||
}
|
||||
//p_Uart->Send(p_Uart,Rx_Buff,p_Uart->Rx_Len);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user