199 lines
6.2 KiB
C
199 lines
6.2 KiB
C
/***************************************************************
|
||
*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**********************/
|