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

📄 uart.c

📁 周立公开发板
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: 
**创   建   人: 
**最后修改日期: 
**描        述: 
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"

#define 	TXD0 	1			//TXD0是引脚P0.0的第2功能
#define 	RXD0 	(1<<2)		//RXD0是引脚P0.1的第2功能
#define 	TXD1 	(1<<16)		//TXD1是引脚P0.8的第2功能
#define 	RXD1 	(1<<18)		//RXD1是引脚P0.9的第2功能

/*********************************************************************************************************
** 函数名称: uint8 UARTn_Init(uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8  INT_En)
** 功能描述: 对UARTn进行初始化
** 输 入: 	n		0-UART0	1-UART1
**         	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中断禁止
**					bit3	1--RX线状态中断使能,0--RX线状态中断禁止
** 输 出: 0 :初始化失败
**         1 :初始化成功
** 全局变量:
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 UARTn_Init(uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8  INT_En)
{
	uint32	bak;
	/*检查参数的合理性*/
	if((n != 0)&&(n != 1))			return(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);		//奇偶校验位有错
	
	//设置UART引脚,且不影响其它引脚
	if(n == 0)	PINSEL0 = (PINSEL0 & (~0x0f)) | TXD0 | RXD0;		//设置UART0
	else		PINSEL0 = (PINSEL0 & (~(0x0f<<16))) | TXD1 | RXD1;	//设置UART1
	
	/*设置串口波特率*/
	*(volatile uint8 *)((&U0LCR) + n * 0x4000) = 0x80;				//DLAB=1
	*(volatile uint8 *)((&U0DLM) + n * 0x4000) = ((Fpclk/16)/baud)/256;
	*(volatile uint8 *)((&U0DLL) + n * 0x4000) = ((Fpclk/16)/baud)%256;
	/*设置串口模式*/
	bak = datab - 5;		//设置字长
	if(stopb==2)
		bak |= 0x04;		//判断是否为2位停止位
	if(parity != 0)
	{
		parity -= 1;
		bak |= 0x08;
	}
	bak |= parity<<4;		//设置奇偶校验位	
	*(volatile uint8 *)((&U0LCR) + n * 0x4000) = bak;	
	*(volatile uint8 *)((&U0IER) + n * 0x4000) = INT_En & 0x07;		//设置中断使能寄存器
		
	return(1);		
}
/*********************************************************************************************************
** 函数名称: void Set_FIFO(uint8 n,uint8 data)
** 功能描述: 设置FIFO
** 输 入: 	 n	:0-UART0	1-UART1
**			 data:FIFO缓冲区的大小,只能为1,2,8、14个字节
** 输 出: 	 0 :初始化失败
**         	 1 :初始化成功
********************************************************************************************************/
uint8 Set_FIFO(uint8 n,uint8 data)
{
	if(n == 0)					//UART0
	{
		switch(data)
		{
			case  1:
				U0FCR = 0x01;	//缓冲区为1个字节
				return(1);
			case  4:
				U0FCR = 0x41;	//缓冲区为4个字节
				return(1);	
			case  8:
				U0FCR = 0x81;	//缓冲区为8个字节
				return(1);
			case  14:
				U0FCR = 0xc1;	//缓冲区为14个字节
				return(1);
			default:
				return(0);
		}
	}
	if(n == 1)					//UART1
	{
		switch(data)
		{
			case  1:
				U1FCR = 0x01;	//缓冲区为1个字节
				return(1);
			case  4:
				U1FCR = 0x41;	//缓冲区为4个字节
				return(1);	
			case  8:
				U1FCR = 0x81;	//缓冲区为8个字节
				return(1);
			case  14:
				U1FCR = 0xc1;	//缓冲区为14个字节
				return(1);
			default:
				return(0);
		}
	}	
	return(0);
}
/*********************************************************************************************************
** 函数名称: void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)
** 功能描述: 从串口发送数据
** 输 入: 	n		:0-UART0	1-UART1
**			data_buf:发送数据缓冲区首地址
**			count	:发送字节数
** 输 出:	无
** 全局变量:
** 调用模块: 程序采用查询方式,并且没有使用FIFO
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)
{
	uint8 i;
	for(i=0;i<count;i++)
	{
		*(volatile uint8 *)((&U0THR) + n * 0x4000) = data_buf[i];		//发送数据
		//等待数据发送完毕
		while(((*(volatile uint8 *)((&U0LSR) + n * 0x4000)) & 0x20)==0);	
	}
}
/*********************************************************************************************************
** 函数名称: void UARTn_SendByte(uint8 n,uint8 data)
** 功能描述: 从串口发送数据
** 输 入: 	n	:0-UART0	1-UART1
**			data:发送的数据
** 输 出:	无
** 全局变量:
** 调用模块: 程序采用查询方式,并且没有使用FIFO
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UARTn_SendByte(uint8 n,uint8 data)
{
	*(volatile uint8 *)((&U0THR) + n * 0x4000) = data;				//发送数据
	while(((*(volatile uint8 *)((&U0LSR) + n * 0x4000)) & 0x20)==0);	//等待数据发送完毕
}
/*********************************************************************************************************
** 函数名称: void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)
** 功能描述: 从串口接收数据
** 输 入: 	n		:0-UART0	1-UART1
**			data_buf:接收数据缓冲区首地址
**			count	:接收字节数
** 输 出:	无
** 全局变量:
** 调用模块: 程序采用查询方式,存在死等待,没有使用FIFO
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)
{	
	uint8 i;
	for(i=0;i<count;i++)
	{
		while(((*(volatile uint8 *)((&U0LSR) + n * 0x4000)) & 0x01) == 0);	//等待接收标志置位
		data_buf[i] = (*(volatile uint8 *)((&U0RBR) + n * 0x4000));	//保存接收到的数据
	}
}

⌨️ 快捷键说明

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