2025-04-26 16:03:23 +08:00

516 lines
15 KiB
C

/** ##########################################################################
** Filename : uart.c
** Project :
** Module :
** Processor :
** Version : 1.0
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note : uart底层
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20230602- --V1.0-- --mingyea--- --修改--
** #########################################################################*/
/*---------------------------------------------------------------------------
* I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "uart.h"
#include "nvic.h"
/*---------------------------------------------------------------------------
* D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
static uart_s g_uart =
{
0u
};
/*---------------------------------------------------------------------------
* G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* C O N S T A N T S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
|Prototype : uart_init
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 初始化
----------------------------------------------------------------------------*/
void uart_init(void)
{
#ifdef USART_0_EN
usart_0_gpio_init();
FL_UART_Init(UART0, &g_UART0_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_DisableIRQ(UART0_IRQn);
NVIC_SetPriority(UART0_IRQn, NVIC_PRIORITY_USART0); //中断优先级配置
NVIC_EnableIRQ(UART0_IRQn);
#endif
#ifdef USART_1_EN
usart_1_gpio_init();
FL_UART_Init(UART1, &g_UART1_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART1_IRQn);
NVIC_DisableIRQ(UART1_IRQn);
NVIC_SetPriority(UART1_IRQn, NVIC_PRIORITY_USART1); //中断优先级配置
NVIC_EnableIRQ(UART1_IRQn);
#endif
#ifdef USART_3_EN
usart_3_gpio_init();
FL_UART_Init(UART3, &g_UART3_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART3_IRQn);
NVIC_DisableIRQ(UART3_IRQn);
NVIC_SetPriority(UART3_IRQn, NVIC_PRIORITY_USART3); //中断优先级配置
NVIC_EnableIRQ(UART3_IRQn);
#endif
#ifdef USART_4_EN
usart_4_gpio_init();
FL_UART_Init(UART4, &g_UART4_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART4_IRQn);
NVIC_DisableIRQ(UART4_IRQn);
NVIC_SetPriority(UART4_IRQn, NVIC_PRIORITY_USART4); //中断优先级配置
NVIC_EnableIRQ(UART4_IRQn);
#endif
#ifdef USART_5_EN
usart_5_gpio_init();
FL_UART_Init(UART5, &g_UART5_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART5_IRQn);
NVIC_DisableIRQ(UART5_IRQn);
NVIC_SetPriority(UART5_IRQn, NVIC_PRIORITY_USART5); //中断优先级配置
NVIC_EnableIRQ(UART5_IRQn);
#endif
}
/*---------------------------------------------------------------------------
|Prototype : uart_tx_start
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 初始化
----------------------------------------------------------------------------*/
u8 uart_tx_start(UART_Type *device, u8 *pdata, u8 length)
{
u8 l_result = UART_OP_RESULT_OK;
u8 i ;
UART_Type *l_usart_dev = (UART_Type *)device;
//做了长度的判断
if( (length == 0u) || (length>UART_TX_BUFF_LENGTH) )
{
l_result = UART_OP_RESULT_FAILED;
}
else
{
if(g_uart.state == UART_STATE_IDLE)
{
for(i = 0; i < length; i++)
{
g_uart.tx_data[i] = pdata[i] ;
}
#ifdef UART_INSERT_PROTOCAL
g_uart.cmd = g_uart.tx_data[3];
#endif
g_uart.timecount=0u;
g_uart.byte_count=0u;
g_uart.tx_byte_total=length;
g_uart.result=UART_RESULT_INIT;
g_uart.state=UART_STATE_TX;
#if 0
l_usart_dev->RBR = g_uart.tx_data[g_uart.byte_count];
UART_SetTXEInterrupt(l_usart_dev, ENABLE);
#else
FL_UART_ClearFlag_TXShiftBuffEmpty(device);
FL_UART_EnableIT_TXShiftBuffEmpty(device);
FL_UART_WriteTXBuff(device,g_uart.tx_data[g_uart.byte_count]);
#endif
}
else
{
l_result = UART_OP_RESULT_BUSY;
}
}
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype : uart_tx_isr_task
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 初始化
----------------------------------------------------------------------------*/
void uart_tx_isr_task(UART_Type *device)
{
UART_Type *l_usart_dev = (UART_Type *)device;
u8 l_result = UART_OP_RESULT_OK;
g_uart.timecount=0u;
g_uart.byte_count++;
if(g_uart.byte_count>=g_uart.tx_byte_total)
{
g_uart.byte_count=0u;
g_uart.result=UART_RESULT_TX_OK;
#ifdef UART_INSERT_PROTOCAL
if( (g_uart.cmd & 0x20) || (g_uart.cmd==USART_CMD_READ_VERSION) )
{
#ifdef UART_INSERT_PROTOCAL
if( (g_uart.cmd & 0x20) )
{
g_uart.rx_byte_total=(g_uart.cmd &0x1fu) + 4u;;
}
else
{
g_uart.rx_byte_total= USART_LEN_READ_VERSION + 1u;
}
#else
//
#endif
g_uart.state=UART_STATE_RX;
}
else
{
g_uart.state=UART_STATE_IDLE;
}
#else
g_uart.rx_byte_total=0u;
g_uart.state=UART_STATE_IDLE;
#endif
#if 0
UART_SetTXEInterrupt(l_usart_dev, DISABLE);
#else
FL_UART_DisableIT_TXShiftBuffEmpty(device);
FL_UART_EnableIT_RXBuffFull(device);
#endif
#ifdef UART_DEBUG_EN
g_uart.tx_count++;
#endif
}
else
{
#if 0
l_usart_dev->RBR = g_uart.tx_data[g_uart.byte_count];
#else
//FL_UART_ClearFlag_TXShiftBuffEmpty(device);
//FL_UART_EnableIT_TXShiftBuffEmpty(device);
FL_UART_WriteTXBuff(device,g_uart.tx_data[g_uart.byte_count]);
#endif
}
}
/*---------------------------------------------------------------------------
|Prototype : uart_rx_isr_task
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 初始化
----------------------------------------------------------------------------*/
void uart_rx_isr_task(UART_Type *device,u8 data)
{
UART_Type *l_usart_dev = (UART_Type *)device;
u8 l_len = UART_RX_BUFF_LENGTH;
g_uart.timecount=0u;
if(g_uart.state == UART_STATE_IDLE)
{
g_uart.byte_count=0u;
g_uart.rx_data[g_uart.byte_count] = data;
#ifdef UART_INSERT_PROTOCAL
if( (g_uart.cmd & 0x20) )
{
g_uart.rx_byte_total=(g_uart.cmd &0x1fu) + 4u;;
}
else
{
g_uart.rx_byte_total= USART_LEN_READ_VERSION + 1u;
}
#else
//
#endif
g_uart.byte_count++;
g_uart.state = UART_STATE_RX;
}
else if(g_uart.state == UART_STATE_RX)
{
g_uart.rx_data[g_uart.byte_count] = data;
g_uart.byte_count++;
#ifdef UART_INSERT_PROTOCAL
if(g_uart.byte_count>=g_uart.rx_byte_total)
{
//g_uart.byte_total=g_uart.byte_count;
g_uart.byte_count=0u;
g_uart.result=UART_RESULT_RX_OK;
g_uart.state=UART_STATE_IDLE;
#ifdef UART_DEBUG_EN
g_uart.rx_count++;
#endif
}
#endif
if(g_uart.byte_count>=UART_RX_BUFF_LENGTH)
{
//g_uart.byte_total=g_uart.byte_count;
g_uart.byte_count=0u;
FL_UART_DisableIT_TXShiftBuffEmpty(device);
FL_UART_DisableIT_RXBuffFull(device);
g_uart.result=UART_RESULT_OVER_LEN;
g_uart.state=UART_STATE_IDLE;
}
}
else
{
//
}
}
/*---------------------------------------------------------------------------
|Prototype : uart_timeout_task
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 初始化
----------------------------------------------------------------------------*/
void uart_timeout_task(UART_Type *device)
{
UART_Type *l_usart_dev = (UART_Type *)device;
u8 l_state;
UART_SR_ALLOC();
UART_CRITICAL_ENTER();
l_state = g_uart.state;
UART_CRITICAL_EXIT();
if(l_state != UART_STATE_IDLE)
{
UART_CRITICAL_ENTER();
g_uart.timecount++;
if(g_uart.timecount>=UART_RECOVERY_TIMEOUT)
{
g_uart.timecount =0u;
if(g_uart.state == UART_STATE_TX)
{
g_uart.result=UART_RESULT_TIMEOUT;
#ifdef UART_DEBUG_EN
g_uart.tx_count_timeout++;
#endif
}
else
{
g_uart.rx_byte_total = g_uart.byte_count; //收完后的把总字长,保存
#ifdef UART_INSERT_PROTOCAL
g_uart.result=UART_RESULT_TIMEOUT;
#else
g_uart.result=UART_RESULT_RX_OK;
#endif
#ifdef UART_DEBUG_EN
g_uart.rx_count_timeout++;
#endif
}
g_uart.byte_count=0u;
FL_UART_DisableIT_RXBuffFull(device);
g_uart.state=UART_STATE_IDLE;
}
UART_CRITICAL_EXIT();
}
}
/*---------------------------------------------------------------------------
|Prototype : uart_task
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void uart_task(void)
{
uart_timeout_task(UART5);
}
/*---------------------------------------------------------------------------
|Prototype : uart_get_result
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
u8 uart_get_result(void)
{
return g_uart.result;
}
/*---------------------------------------------------------------------------
|Prototype : uart_get_rx_data
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
u8 uart_get_rx_data(u8 *pdata,u8 len)
{
u8 i;
u8 l_result=0u;
u8 l_len = len;
if(l_len > UART_RX_BUFF_LENGTH) //
{
l_len = UART_RX_BUFF_LENGTH;
}
for(i = 0; i < l_len; i++)
{
pdata[i] = g_uart.rx_data[i];
}
return l_result;
}
/**
* @brief UART初始化
* @param UARTx: 串口号
* rate: 波特率
* @retval void
*/
void Uartx_Init(UART_Type *device, uint32_t baud_rate)
{
//FL_UART_InitTypeDef UART_InitStruct = {0};
switch ((uint32_t)device)
{
case UART0_BASE:
#ifdef USART_0_EN
//usart_0_gpio_init(); //在GPIO表格中配置
FL_UART_Init(UART0, &g_UART0_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_DisableIRQ(UART0_IRQn);
NVIC_SetPriority(UART0_IRQn, NVIC_PRIORITY_USART0); //中断优先级配置
NVIC_EnableIRQ(UART0_IRQn);
#endif
break;
case UART1_BASE:
#ifdef USART_1_EN
//usart_1_gpio_init(); //在GPIO表格中配置
FL_UART_Init(UART1, &g_UART1_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART1_IRQn);
NVIC_DisableIRQ(UART1_IRQn);
NVIC_SetPriority(UART1_IRQn, NVIC_PRIORITY_USART1); //中断优先级配置
NVIC_EnableIRQ(UART1_IRQn);
#endif
break;
case UART3_BASE:
#ifdef USART_3_EN
//usart_3_gpio_init(); //在GPIO表格中配置
FL_UART_Init(UART3, &g_UART3_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART3_IRQn);
NVIC_DisableIRQ(UART3_IRQn);
NVIC_SetPriority(UART3_IRQn, NVIC_PRIORITY_USART3); //中断优先级配置
NVIC_EnableIRQ(UART3_IRQn);
#endif
break;
case UART4_BASE:
#ifdef USART_4_EN
//usart_4_gpio_init(); //在GPIO表格中配置
FL_UART_Init(UART4, &g_UART4_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART4_IRQn);
NVIC_DisableIRQ(UART4_IRQn);
NVIC_SetPriority(UART4_IRQn, NVIC_PRIORITY_USART4); //中断优先级配置
NVIC_EnableIRQ(UART4_IRQn);
#endif
break;
case UART5_BASE:
#ifdef USART_5_EN
//usart_5_gpio_init(); //在GPIO表格中配置
FL_UART_Init(UART5, &g_UART5_InitStruct);
/* NVIC中断配置 */
NVIC_ClearPendingIRQ(UART5_IRQn);
NVIC_DisableIRQ(UART5_IRQn);
NVIC_SetPriority(UART5_IRQn, NVIC_PRIORITY_USART5); //中断优先级配置
NVIC_EnableIRQ(UART5_IRQn);
#endif
break;
default:
break;
}
}