516 lines
15 KiB
C
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;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|