You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

275 lines
7.6 KiB

/*********************************************************
*Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名: lib_uart.c
*作 者: AE Team
*版 本: V1.01
*日 期: 2021/06/09
*描 述: UART模块库函数
*备 注:
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include "lib_uart.h"
#include "system_ES8P5066.h"
/*************************************
函数名:UART_Init
描 述:UART初始化
输入值:UART0/UART1
初始化结构体
返回值:无
**************************************/
void UART_Init(UART_TypeDef *UARTx, UART_InitStruType *UART_InitStruct)
{
float tmp;
uint32_t baud;
tmp = 0;
if (UART_InitStruct->UART_ClockSet == UART_Clock_1)
{
tmp = (float)SystemCoreClock / (float)(16 * UART_InitStruct->UART_BaudRate);
}
else if (UART_InitStruct->UART_ClockSet == UART_Clock_2)
{
tmp = (float)SystemCoreClock / (float)(32 * UART_InitStruct->UART_BaudRate);
}
else if (UART_InitStruct->UART_ClockSet == UART_Clock_3)
{
tmp = (float)SystemCoreClock / (float)(64 * UART_InitStruct->UART_BaudRate);
}
else if (UART_InitStruct->UART_ClockSet == UART_Clock_4)
{
tmp = (float)SystemCoreClock / (float)(128 * UART_InitStruct->UART_BaudRate);
}
tmp = tmp < 1.0 ? 1.0 : tmp;
baud = (uint32_t)(tmp * 16);
UARTx->CON1.BCS = UART_InitStruct->UART_ClockSet;
UARTx->BRR.Word = baud;
UARTx->CON0.TXFS = UART_InitStruct->UART_StopBits;
UARTx->CON0.TXMOD = UART_InitStruct->UART_TxMode;
UARTx->CON0.TXP = UART_InitStruct->UART_TxPolar;
UARTx->CON0.RXMOD = UART_InitStruct->UART_RxMode;
UARTx->CON0.RXP = UART_InitStruct->UART_RxPolar;
return;
}
/*************************************
函数名:UART_AutoBaudConfig
描 述:UART自动配置波特率并返回波特率
输入值:UART0/UART1
mode:检测模式选择
返回值:检测到的波特率的值,如果为0,则配置失败
**************************************/
void UART_AutoBaudConfig(UART_TypeDef *UARTx, UART_AUTO_BAUD_MODE mode)
{
UARTx->CON1.BDM = mode;
UARTx->CON0.BDEN = 1;
}
/*************************************
函数名:UART_AutoBaudResult
描 述:UART自动检测波特率的检测结果
输入值:UART0/UART1
返回值:波特率检测成功返回0
**************************************/
uint8_t UART_AutoBaudResult(UART_TypeDef *UARTx)
{
return UARTx->CON0.BDEN;
}
/*************************************
函数名:UART_BaudFreeConfig
描 述:UART空闲检测
输入值:UART0/UART1
mode:检测模式选择
返回值:检测到的波特率的值,如果为0,则配置失败
**************************************/
void UART_BaudFreeConfig(UART_TypeDef *UARTx, UART_AUTO_BAUD_FREE_MODE mode)
{
UARTx->CON0.IDEN = 1; /* 使能空闲检测 */
UARTx->CON1.IDM = mode;
}
/*************************************
函数名:UART_ITConfig
描 述:中断配置
输入值:UART0/UART1
中断类型
使能/禁止
返回值:无
**************************************/
void UART_ITConfig(UART_TypeDef *UARTx, UART_TYPE_IT UART_IT, TYPE_FUNCEN NewState)
{
if (NewState == Enable)
UARTx->IE.Word |= (uint32_t)UART_IT;
else
UARTx->IE.Word &= ~(uint32_t)UART_IT;
return;
}
/*************************************
函数名:UART_TBIMConfig
描 述:发送缓冲器空中断类型
输入值:UART0/UART1
中断类型
返回值:无
**************************************/
void UART_TBIMConfig(UART_TypeDef *UARTx, UART_TYPE_TRBIM Type)
{
UARTx->CON1.TBIM = Type;
return;
}
/*************************************
函数名:UART_RBIMConfig
描 述:接收缓冲器满中断类型
输入值:UART0/UART1
中断类型
返回值:无
**************************************/
void UART_RBIMConfig(UART_TypeDef *UARTx, UART_TYPE_TRBIM Type)
{
UARTx->CON1.RBIM = Type;
return;
}
/*************************************
函数名:UART_SendByte
描 述:发送一个字节
输入值:UART0/UART1
需要发送的数据
返回值:无
**************************************/
void UART_SendByte(UART_TypeDef *UARTx, uint8_t data08)
{
UARTx->TBW.Byte[0] = data08;
return;
}
/*************************************
函数名:UART_SendHalfWord
描 述:发送半字
输入值:UART0/UART1
需要发送的数据
返回值:无
**************************************/
void UART_SendHalfWord(UART_TypeDef *UARTx, uint16_t data16)
{
UARTx->TBW.HalfWord[0] = data16;
return;
}
/*************************************
函数名:UART_SendWord
描 述:发送字
输入值:UART0/UART1
需要发送的数据
返回值:无
**************************************/
void UART_SendWord(UART_TypeDef *UARTx, uint32_t data32)
{
UARTx->TBW.Word = data32;
return;
}
/*************************************
函数名:UART_RecByte
描 述:接收一个字节
输入值:UART0/UART1
返回值:接收到的数据
**************************************/
uint8_t UART_RecByte(UART_TypeDef *UARTx)
{
return UARTx->RBR.Byte[0];
}
/*************************************
函数名:UART_RecHalfWord
描 述:接收半字
输入值:UART0/UART1
返回值:接收到的数据
**************************************/
uint16_t UART_RecHalfWord(UART_TypeDef *UARTx)
{
return UARTx->RBR.HalfWord[0];
}
/*************************************
函数名:UART_RecWord
描 述:接收字
输入值:UART0/UART1
返回值:接收到的数据
**************************************/
uint32_t UART_RecWord(UART_TypeDef *UARTx)
{
return UARTx->RBR.Word;
}
/*************************************
函数名:UART_GetStatus
描 述:获取UART状态
输入值:UART0/UART1
状态类型
返回值:SET/RESET
**************************************/
FlagStatus UART_GetStatus(UART_TypeDef *UARTx, UART_TYPE_STA UART_Flag)
{
FlagStatus bitstatus = RESET;
if (UARTx->STA.Word & UART_Flag)
bitstatus = SET;
return bitstatus;
}
/*************************************
函数名:UART_GetFlagStatus
描 述:获取中断标志位状态
输入值:UART0/UART1
状态类型
返回值:SET/RESET
**************************************/
FlagStatus UART_GetFlagStatus(UART_TypeDef *UARTx, UART_TYPE_FLAG UART_Flag)
{
FlagStatus bitstatus = RESET;
if (UARTx->IF.Word & UART_Flag)
bitstatus = SET;
return bitstatus;
}
/*************************************
函数名:UART_GetITStatus
描 述:获取中断使能状态
输入值:UART0/UART1
状态类型
返回值:SET/RESET
**************************************/
ITStatus UART_GetITStatus(UART_TypeDef *UARTx, UART_TYPE_IT UART_IT)
{
ITStatus bitstatus = RESET;
if (UARTx->IE.Word & UART_IT)
bitstatus = SET;
return bitstatus;
}
/*************************************
函数名:UART_ClearITPendingBit
描 述:清除中断状态
输入值:UART0/UART1
状态类型
返回值:无
**************************************/
void UART_ClearITPendingBit(UART_TypeDef *UARTx, UART_TYPE_FLAG UART_Flag)
{
UARTx->IF.Word = (uint32_t) UART_Flag;
return;
}