rt-thread/bsp/essemi/es8p508x/libraries/Library/Source/lib_uart.c

199 lines
6.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***************************************************************
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
*文件名: lib_uart.c
*作 者: Liut
*版 本: V1.00
*日 期: 2017/07/14
*描 述: UART模块库函数
*备 注: 适用于 ES8P508x芯片
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
***************************************************************/
#include "lib_uart.h"
/***************************************************************
函数名UART_Init
描 述UART初始化
输入值UARTx可以是UART0/1/2/3/4/5 、 UART_InitStruct初始化配置结构体地址
输出值:无
返回值:无
***************************************************************/
void UART_Init(UART_TypeDef* UARTx,UART_InitStruType* UART_InitStruct)
{
uint32_t BaudClockTemp = 0, BaudTemp = 0;
if(UART_InitStruct->UART_ClockSet == UART_Clock_1)
{
BaudClockTemp = (SystemCoreClock/16)%UART_InitStruct->UART_BaudRate;
if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
{
BaudTemp = (SystemCoreClock/16/UART_InitStruct->UART_BaudRate)-1;
}
else
{
BaudTemp = SystemCoreClock/16/UART_InitStruct->UART_BaudRate;
}
}
else if(UART_InitStruct->UART_ClockSet == UART_Clock_2)
{
BaudClockTemp = (SystemCoreClock/32)%UART_InitStruct->UART_BaudRate;
if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
{
BaudTemp = (SystemCoreClock/32/UART_InitStruct->UART_BaudRate)-1;
}
else
{
BaudTemp = SystemCoreClock/32/UART_InitStruct->UART_BaudRate;
}
}
else if(UART_InitStruct->UART_ClockSet == UART_Clock_4)
{
BaudClockTemp = (SystemCoreClock/64)%UART_InitStruct->UART_BaudRate;
if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
{
BaudTemp = (SystemCoreClock/64/UART_InitStruct->UART_BaudRate)-1;
}
else
{
BaudTemp = SystemCoreClock/64/UART_InitStruct->UART_BaudRate;
}
}
if(BaudTemp > 2046)
{
BaudTemp = 2047;
}
UARTx->CON.BCS = UART_InitStruct->UART_ClockSet;
UARTx->BRR.BRR = BaudTemp ;
UARTx->CON.TXFS = UART_InitStruct->UART_StopBits;
UARTx->CON.TXMOD = UART_InitStruct->UART_TxMode;
UARTx->CON.TXP = UART_InitStruct->UART_TxPolar;
UARTx->CON.RXMOD = UART_InitStruct->UART_RxMode;
UARTx->CON.RXP = UART_InitStruct->UART_RxPolar;
}
/***************************************************************
函数名UART_ITConfig
描 述UART中断配置
输入值UARTx可以是UART0/1/2/3/4/5 、 UART_IT中断类型 、 NewState使能/失能
输出值:无
返回值:无
***************************************************************/
void UART_ITConfig(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT,TYPE_FUNCEN NewState)
{
if (NewState != DISABLE)
UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) | (uint32_t) UART_IT;
else
UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) & (~((uint32_t) UART_IT));
}
/***************************************************************
函数名UART_TBIMConfig
描 述UART发送缓冲器空中断模式选择
输入值UARTx可以是UART0/1/2/3/4/5 、 Type空中断模式
输出值:无
返回值:无
***************************************************************/
void UART_TBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type)
{
UARTx->IE.TBIM = Type;
}
/***************************************************************
函数名UART_RBIMConfig
描 述UART接收缓冲器满中断模式选择
输入值UARTx可以是UART0/1/2/3 、 Type满中断模式
输出值:无
返回值:无
***************************************************************/
void UART_RBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type)
{
UARTx->IE.RBIM = Type;
}
/***************************************************************
函数名UART_Sendxxxx
描 述UART发送字节、半字、字
输入值UARTx可以是UART0/1/2/3/4/5 、 数据
输出值:无
返回值:无
***************************************************************/
void UART_SendByte(UART_TypeDef* UARTx,uint8_t Temp08)
{
UARTx->TBW.Byte[0] = Temp08;
}
void UART_SendHalfWord(UART_TypeDef* UARTx,uint16_t Temp16)
{
UARTx->TBW.HalfWord[0] = Temp16;
}
void UART_SendWord(UART_TypeDef* UARTx,uint32_t Temp32)
{
UARTx->TBW.Word = Temp32;
}
/***************************************************************
函数名UART_Recxxxx
描 述UART接收字节、半字、字
输入值UARTx可以是UART0/1/2/3/4/5
输出值:无
返回值:数据
***************************************************************/
uint8_t UART_RecByte(UART_TypeDef* UARTx)
{
return UARTx->RBR.Byte[0];
}
uint16_t UART_RecHalfWord(UART_TypeDef* UARTx)
{
return UARTx->RBR.HalfWord[0];
}
uint32_t UART_RecWord(UART_TypeDef* UARTx)
{
return UARTx->RBR.Word;
}
/***************************************************************
函数名UART_GetFlagStatus
描 述UART获取标志位状态
输入值UARTx可以是UART0/1/2/3/4/5 、 UART_Flag标志位
输出值:无
返回值SET/RESET
***************************************************************/
FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx,UART_TYPE_FLAG UART_Flag)
{
FlagStatus bitstatus = RESET;
if ((UARTx->IF.Word & ((uint32_t)UART_Flag)) != RESET)
bitstatus = SET;
else
bitstatus = RESET;
return bitstatus;
}
/***************************************************************
函数名UART_GetITStatus
描 述UART获取中断状态
输入值UARTx可以是UART0/1/2/3/4/5 、 UART_Flag标志位
输出值:无
返回值SET/RESET
***************************************************************/
ITStatus UART_GetITStatus(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT)
{
FlagStatus bitstatus = RESET;
if((UARTx->IE.Word & ((uint32_t)UART_IT)) == 0)
bitstatus = RESET;
else
bitstatus = SET;
return bitstatus;
}
/***************************************************************
函数名UART_ClearIFPendingBit
描 述UART标志位清除
输入值UARTx可以是UART0/1/2/3/4/5、 UART_Flag标志位
输出值:无
返回值:无
***************************************************************/
void UART_ClearIFPendingBit(UART_TypeDef* UARTx,UART_CLR_IF UART_Flag)
{
UARTx->IF.Word = (uint32_t)UART_Flag;
}
/*************************END OF FILE**********************/