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