📄 uart.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 + -