⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 飞利浦ARM7
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			Uart.c
** Last modified Date:  2007-01-08
** Last Version:		1.0
** Descriptions:		Uart库函数文件
**
**------------------------------------------------------------------------------------------------------
** Created by:			Litiantian
** Created date:		2007-01-08
** Version:				1.0
** Descriptions:		原始版本
**
**------------------------------------------------------------------------------------------------------
** Modified by:			
** Modified date:		
** Version:
** Descriptions:		
**
********************************************************************************************************/
#include 	"config.h"

/* 如下所定义的宏用于各串口发送和结束的判断 */
#define		UARTSND_END 	(UnLSR & 0x40)		 // 查询方式下,当UARTSNDEND值不为0时,发送结束
#define		UARTRCV_END 	(UnLSR & 0x01)		 // 查询方式下,当UARTRCVEND值不为0时,发送结束

/* 定义串口n的各寄存器*/
#define 	UnLCR			(*(volatile uint8 *)((&U0LCR) + n * 0x4000))
#define		UnDLM			(*(volatile uint8 *)((&U0DLM) + n * 0x4000))
#define 	UnDLL			(*(volatile uint8 *)((&U0DLL) + n * 0x4000))
#define		UnFCR 			(*(volatile uint8 *)((&U0FCR) + n * 0x4000))
#define		UnIER 			(*(volatile uint8 *)((&U0IER) + n * 0x4000))
#define		UnTHR 			(*(volatile uint8 *)((&U0THR) + n * 0x4000))
#define		UnLSR 			(*(volatile uint8 *)((&U0LSR) + n * 0x4000))
#define		UnRBR 			(*(volatile uint8 *)((&U0RBR) + n * 0x4000))

/*********************************************************************************************************
** 函数名称 :UARTnIO_Ini(uint8 n)
** 函数功能 :初始化串口n的发送和接收脚。
** 入口参数 :  n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
** 出口参数 :无
**********************************************************************************************************/
void UARTnIO_Ini (uint8 n)
{
  	switch(n)
	{
		case 	0:
				SCS		&= ~0x01;						// 端口P0选择低速GPIO
				PINSEL0 = (0x01 << 4) | (0x01 << 6);	// 设置P0.2和P0.3连接到UART0
				break;
		case	1:
			    PINSEL4 = 0x02 | (0x02 << 2);  			// 选择P2.0和P2.1管脚为UART1
				break;
		case 	2:
				PINSEL4 = (0x02 << 16) | (0x02 << 18);	// 设置P2.8和P2.9连接到UART2
				break;
	   	case 	3:
				PINSEL9 = (0x03 << 24) | (0x03 << 26);	// 设置P2.8和P2.9连接到UART3
				break;
		default:
				while(1);
	}
}

/*********************************************************************************************************
** 函数名称:UARTn_IniDft(uint8 n)
** 函数功能:按默认值初始化串口n的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验,波特率115200。
** 入口参数:n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
** 出口参数:无
**********************************************************************************************************/
void UARTn_IniDft (uint8 n)
{
	uint32 	Fdiv = 0;

	/* 初始化相关的IO */
	UARTnIO_Ini(n);

	/* 初始化串口通讯参数 */
	UnLCR 	= 0x83;							// 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
	Fdiv 	= (Fpclk / 16) / 115200;		// 设置波特率
	UnDLM 	= Fdiv / 256;
	UnDLL 	= Fdiv % 256;
	UnLCR 	= 0x03;							// 令DLAB位为0
	UnFCR 	&= ~0x07;						// 禁用FIFO
    UnIER 	&= ~0x07;						// 禁止UART产生中断
}

/*********************************************************************************************************
** 函数名称: uint8 UARTn_Init(uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8 INT_En)
** 功能描述: 对UARTn的通讯参数进行初始化
** 入口参数: n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
**         	 baud 	串口通信波特率
**         	 datab	数据位个数,有效值为:5,6,7,8
**			 stopb	停止位个数,有效值为:1,2
**			 parity	奇偶校验位,0-无校验,1-奇校验,2-偶校验,3-强制为1,4-强制为0
**			 INT_En	中断控制字节,按位操作
**					bit0	1--RBR中断使能,0--RBR中断禁止
**					bit1	1--THRE中断使能,0--THRE中断禁止
**					bit2	1--RX线状态中断使能,0--RX线状态中断禁止

** 出口参数:为0时表示函数出错
**********************************************************************************************************/
uint8 UARTn_Init (uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8 INT_En)
{
	uint32 bak = 0;					
	
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);		// 波特率:1~115200,否则出错
	if ((datab <5) || (datab > 8))		return (0);		// 数据位数:1~8,否则出错
	if ((stopb == 0) || (stopb > 2)) 	return (0);		// 停止位:1、2,否则出错
	if (parity > 4)	return (0);							// 奇偶校验位有错
	
	/* 设置串口波特率 */
	UnLCR = 0x80;										// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	UnDLM = bak >> 8;
	UnDLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = datab - 5;									// 设置字长
	if (stopb == 2)	bak |= 0x04;						// 判断是否为2位停止位
	
	/* 设置奇偶校验 */
	if (parity != 0)
	{
		parity = parity - 1;
		bak |= 0x08;
	}
	bak |= parity << 4;				
	UnLCR = bak;

	/* 配置中断 */
	UnIER = INT_En & 0x07;								// 设置中断使能寄存器

	return (1);
}

/*********************************************************************************************************
** 函数名称: uint8 Set_FIFO(uint8 n,uint8 data)
** 功能描述: 设置FIFO
** 入口参数: n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
**			 data:FIFO触发字节设定,只能为1,4,8、14个字节
** 出口参数: 0 :初始化失败
**         	 1 :初始化成功
********************************************************************************************************/
uint8 Set_FIFO(uint8 n,uint8 data)
{
	switch(data)
	{
		case  1:
			UnFCR = 0x01;	// 缓冲区为1个字节
			return(1);
		case  4:
			UnFCR = 0x41;	// 缓冲区为4个字节
			return(1);	
		case  8:
			UnFCR = 0x81;	// 缓冲区为8个字节
			return(1);
		case  14:
			UnFCR = 0xc1;	// 缓冲区为14个字节
			return(1);
		default:
			return(0);
	}
}

/*********************************************************************************************************
** 函数名称: void UARTn_SendByte(uint8 n,uint8 data)
** 功能描述: 从串口n发送数据
** 入口参数: n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
**			 data:发送的数据
** 出口参数: 无
********************************************************************************************************/
void UARTn_SendByte(uint8 n,uint8 data)
{
	UnTHR = data;
	while ( UARTSND_END == 0 );	
}

/*********************************************************************************************************
** 函数名称: void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)
** 功能描述: 从串口发送数据
** 入口参数: n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
**			 data_buf:发送数据缓冲区首地址
**			 count	:发送字节数
** 出口参数:	无
********************************************************************************************************/
void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)
{
	uint8 i;
	for(i=0;i<count;i++) UARTn_SendByte(n,data_buf[i]);		//发送数据
}
/*********************************************************************************************************
** 函数名称 :UARTn_SendStr()
** 函数功能 :通过串口n发送一个字符串
** 入口参数	: n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
**			  str	要发送的字符串的指针
** 出口参数:	无
*********************************************************************************************************/
void UARTn_SendStr (uint8 n,uint8 const *str)
{
	while (1)
	{
		if (*str == '\0')	break;		// 遇到结束符则退出
		UARTn_SendByte(n,*str++);		// 发送数据
	}
}

/*********************************************************************************************************
** 函数名称 :UARTn_RcvByte()
** 函数功能 :从串口n接收1字节数据,使用查询方式接收。
** 入口参数	: n	:0-UART0	1-UART1  	2-UART2 	3-UART3 
** 出口参数 :接收到的字节数据
*********************************************************************************************************/
uint8 UARTn_RcvByte (uint8 n)
{
	uint8 rcv_dat;
	
	while (UARTRCV_END == 0);
	rcv_dat = UnRBR;
	
	return (rcv_dat);	
}

/*********************************************************************************************************
** 函数名称: void UARTn_RcvData()
** 功能描述: 从串口n接收count个数据到缓存data_buf中
** 入口参数  : n		:0-UART0	1-UART1		2-UART2		3-UART3			  
**			 data_buf:接收数据缓冲区首地址
**			 count	:接收字节数
** 出口参数  :	无
********************************************************************************************************/
void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)
{	
	uint8 i;
	for(i = 0;i < count;i++)
	{
		data_buf[i] = UARTn_RcvByte(n);		// 保存接收到的数据
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -