/******************************************************************************
Copyright 2013- XinTong
All Rights Reserved.
Filename: hal_uart.c
Revised: 2013-06-08
Revision: 1.0.0
Author: 关文健
Description: uart definition and manipulation functions for k10.
History:
-----------------------------------------------------------------------------------------
Revision: 1.0.0
Author: 关文健
Date: 2013-06-08
Brief: First Create
-----------------------------------------------------------------------------------------
******************************************************************************/
/*********************************************************************
* INCLUDES
*********************************************************************/
#include "hal_uart.h"
#include "XT_utility.h"
/*********************************************************************
* MACROS
*********************************************************************/
#define UART_Port_Select(x) UART_TYPE[x]
/*********************************************************************
* CONSTANTS
*********************************************************************/
/*********************************************************************
* TYPEDEFS
*********************************************************************/
typedef struct
{
uint8 *pSendBuffer;
uint16 uSendBufferSize;
uint16 uSendLen;
uint16 uSendPos;
uint8 *pRecvBuffer;
uint16 uRecvBufferSize;
uint16 uRecvLen;
uint16 uRecvPos_Start;
uint16 uRecvPos_End;
uint8 uRecvBuf_OverFlow;
UART_WORKMODE SendMode;
UART_WORKMODE RecvMode;
}UART_PORTCONTROL_t;
/*********************************************************************
* GLOBAL VARIABLES
*********************************************************************/
UART_PORTCONTROL_t _UartPortControl[5];
UART_Type * UART_TYPE[5] =
{
UART0,
UART1,
UART2,
UART3,
UART4,
};
/*********************************************************************
* EXTERNAL VARIABLES
*********************************************************************/
/*********************************************************************
* EXTERNAL FUNCTIONS
*********************************************************************/
/*********************************************************************
* LOCAL VARIABLES
*********************************************************************/
xSemaphoreHandle xBinarySemaphore_UART0;
/*********************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************/
//写一个字节到串口
void UART_SendOneToPort(UART_PORT Port);
//从串口读一个字节
void UART_ReadOneFromPort(UART_PORT Port);
/*********************************************************************
* FUNCTIONS
*********************************************************************/
//写一个字节到串口
void UART_SendOneToPort(UART_PORT Port)
{
uint8 *pData;
UART_Type *uartch;
uartch = UART_Port_Select(Port);
if(_UartPortControl[Port].uSendPos < _UartPortControl[Port].uSendLen)
{
if (uartch->S1 & UART_S1_TDRE_MASK)
{
pData = _UartPortControl[Port].pSendBuffer + _UartPortControl[Port].uSendPos;
uartch->D = *pData;
_UartPortControl[Port].uSendPos++;
if (_UartPortControl[Port].uSendPos == _UartPortControl[Port].uSendLen )
{
_UartPortControl[Port].uSendPos = 0;
_UartPortControl[Port].uSendLen = 0;
}
}
}
}
//从串口读一个字节
void UART_ReadOneFromPort(UART_PORT Port)
{
uint8 uTemp;
uint8 *pData;
UART_Type *uartch;
uartch = UART_Port_Select(Port);
if(uartch->S1&UART_S1_RDRF_MASK)
{
if (_UartPortControl[Port].uRecvLen < _UartPortControl[Port].uRecvBufferSize)
{
uTemp = uartch->D;
pData = _UartPortControl[Port].pRecvBuffer + _UartPortControl[Port].uRecvPos_End;
*pData = uTemp;
_UartPortControl[Port].uRecvPos_End++;
if (_UartPortControl[Port].uRecvPos_End == _UartPortControl[Port].uRecvBufferSize)
{
_UartPortControl[Port].uRecvPos_End = 0; //写指针返回队列首
}
_UartPortControl[Port].uRecvLen++;
if(_UartPortControl[Port].uRecvLen == _UartPortControl[Port].uRecvBufferSize)
{
_UartPortControl[Port].uRecvBuf_OverFlow = 1; //缓冲区溢出标志置位
}
}
else
{
_UartPortControl[Port].uRecvBuf_OverFlow = 1;
}
}
}
//串口端口初始化
/*------------------------------------------------------------
*
* Port: 串口端口号
* pConfig: 配置结构指针
*
* return: 成功或者失败
*
*-----------------------------------------------------------*/
uint8 UART_Config(UART_PORT Port,UART_CONFIG_t *Config)
{
uint8 uReValue = 0;
uint16 sbr;
uint8 brfa;
uint32 clock;
UART_Type *uartch;
GetProcessorInfo(); //计算系统时钟
clock=PInfo.BusClock;
uartch = UART_Port_Select(Port);
if((uint32)uartch==UART0_BASE||(uint32)uartch==UART1_BASE) clock=PInfo.CoreClock;; //UART0 UART1使用CoreClock
sbr=(uint16)((clock)/(Config->uBaud*16));
brfa=((clock*2)/Config->uBaud-(sbr*32));
switch((uint32)uartch)
{
case UART0_BASE:
SIM->SCGC5|=SIM_SCGC5_PORTA_MASK; //与uart0相关的引脚的时钟使能,参见手册267页
PORTA->PCR[14]&=~PORT_PCR_MUX_MASK;
PORTA->PCR[14]=PORT_PCR_MUX(0x3); //在PTA14上使能UART0_TXD功能
PORTA->PCR[15]&=~PORT_PCR_MUX_MASK;
PORTA->PCR[15]|=PORT_PCR_MUX(0x3); //在PTA15上使能UART0_RXD
SIM->SCGC4|=SIM_SCGC4_UART0_MASK; //使能uart0时钟模块,参见手册265页
NVIC_EnableIRQ(UART0_RX_TX_IRQn); //开启接受中断,参见手册1221页,函数来自core_cm4.h
break;
case UART1_BASE:
SIM->SCGC5|=SIM_SCGC5_PORTC_MASK; //与uart1相关的引脚的时钟使能,参见手册267页
PORTC->PCR[4]&=~PORT_PCR_MUX_MASK;
PORTC->PCR[4]=PORT_PCR_MUX(0x3); //在PTC4上使能UART1_TXD功能
PORTC->PCR[3]&=~PORT_PCR_MUX_MASK;
PORTC->PCR[3]|=PORT_PCR_MUX(0x3); //在PTC3上使能UART1_RXD
SIM->SCGC4|=SIM_SCGC4_UART1_MASK; //使能uart1时钟模块,参见手册265页
NVIC_EnableIRQ(UART1_RX_TX_IRQn); //开启接受中断,参见手册1221页,函数来自core_cm4.h
break;
case UART2_BASE:
SIM->SCGC5|=SIM_SCGC5_PORTD_MASK; //与uart2相关的引脚的时钟使能,参见手册267页
PORTD->PCR[3]&=~PORT_PCR_MUX_MASK;
PORTD->PCR[3]=PORT_PCR_MUX(0x3); //在PTD3上使能UART2_TXD功能
PORTD->PCR[2]&=~PORT_PCR_MUX_MASK;
PORTD->PCR[2]|=PORT_PCR_MUX(0x3); //在PTD2上使能UART2_RXD
SIM->SCGC4|=SIM_SCGC4_UART2_MASK; //使能uart2时钟模块,参见手册265页
NVIC_EnableIRQ(UART2_RX_TX_IRQn); //开启接受中断,参见手册1221页,函数来自core_cm4.h
break;
case UART3_BASE:
SIM->SCGC5|=SIM_SCGC5_PORTB_MASK; //与uart3相关的引脚的时钟使能,参见手册267页
PORTB->PCR[11]&=~PORT_PCR_MUX_MASK;
PORTB->PCR[11]=PORT_PCR_MUX(0x3); //在PTB11上使能UART3_TXD功能
PORTB->PCR[10]&=~PORT_PCR_MUX_MASK;
PORTB->PCR[10]|=PORT_PCR_MUX(0x3); //在PTD10上使能UART3_RXD功能
SIM->SCGC4|=SIM_SCGC4_UART3_MASK; //使能uart3时钟模块,参见手册265页
NVIC_EnableIRQ(UART3_RX_TX_IRQn); //开启接受中断,参见手册1221页,函数来自core_cm4.h
break;
case UART4_BASE:
SIM->SCGC5|=SIM_SCGC5_PORTE_MASK; //与uart4相关的引脚的时钟使能,参见手册267页
PORTE->PCR[24]&=~PORT_PCR_MUX_MASK;
PORTE->PCR[24]=PORT_PCR_MUX(0x3); //在PTE24上使能UART4_TXD功能
PORTE->PCR[25]&=~PORT_PCR_MUX_MASK;
PORTE->PCR[25]|=PORT_PCR_MUX(0x3); //在PTE25上使能UART4_RXD功能
SIM->SCGC1|=SIM_SCGC1_UART4_MASK; //使能uart4时钟模块,参见手册262页
NVIC_EnableIRQ(UART4_RX_TX_IRQn); //开启接受中断,参见手册1221页,函数来自core_cm4.h
break;
default: break;
}
//配置数据位
uartch->C2&=~(UART_C2_RE_MASK|UART_C2_TE_MASK); //禁止发送接受,参见手册1221页
if(Config->uDataBit)
uartch->C1|=UART_C1_M_MASK;
else uartch->C1&=~UART_C1_M_MASK; //配置数据位数为8位,参见数�
freescale K60 (uart+adc驱动)
5星 · 超过95%的资源 需积分: 31 45 浏览量
2013-06-18
09:50:58
上传
评论 4
收藏 9KB ZIP 举报
freedheart618
- 粉丝: 0
- 资源: 2