📄 uart.c
字号:
//-------------------------------------------------------------------------*
//文件名: Uart.c (串行通信) *
//-------------------------------------------------------------------------*
#include "Uart.h" //头文件
//-------------------------------------------------------------------------*
//函数名: UartInit *
//功 能: 初始化UARTx模块。x代表0,1,2 *
//参 数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2 *
// 如果uatch大于2,则认为是2 *
// int32 sysclk: 系统总线时钟,以MHz为单位 *
// int32 baud: 波特率,如 4800,9600,19200,38400,57600,115200 *
// 其他的波特率在MCF52233的评估板上没有测试过,若要使 *
// 用该函数,请自行测试,一般来说,速度慢一点,通信会 *
// 更稳定 *
// uint8 intStatusInit: 初始化中断的状态 1表示开中断 其他表示不开 *
//返 回: 无 *
//说 明: uartNo=0表示使用UART0模块,依此类推。 *
//-------------------------------------------------------------------------*
void UartInit(uint8 uartNo, int32 sysclk, int32 baud, uint8 intStatusInit)
{
register uint16 ubgs;
if(uartNo > 2)
{ //若传进的通道号大于2,则按照2来接受
uartNo = 2;
}
//1.将Ux口初始化为UART功能
MCF_GPIO_PUPAR(uartNo) |= (0
| MCF_UART_RXD_MASK
| MCF_UART_TXD_MASK);
//2.复位接收器和发送器以及模式寄存器
MCF_UART_UCR(uartNo) = MCF_UART_RESET_TX; //复位发送器
MCF_UART_UCR(uartNo) = MCF_UART_RESET_RX; //复位接收器
MCF_UART_UCR(uartNo) = MCF_UART_RESET_MR; //复位模式寄存器
//3.配置UART模式:无奇偶校验、8位数据、正常通道模式、1停止位
MCF_UART_UMR(uartNo) = (0
| MCF_UART_NONE_PARITY
| MCF_UART_BIT_8 );
MCF_UART_UMR(uartNo) = (0
| MCF_UART_CM_NORMAL
| MCF_UART_STOP_BITS_1);
//4.选择预分频后的内部总线时钟作为收发器的时钟源
MCF_UART_UCSR(uartNo) = (0
| MCF_UART_RCS_SYSCLK
| MCF_UART_TCS_SYSCLK);
//5.屏蔽所有的UART中断
MCF_UART_UIMR(uartNo) = 0;
//6.计算波特率并设置:UBG = fsys/(波特率*32)
ubgs = (uint16)((sysclk*1000000)/(baud * 32));
MCF_UART_UBG1(uartNo) = (uint8)((ubgs & 0xFF00) >> 8);
MCF_UART_UBG2(uartNo) = (uint8) (ubgs & 0x00FF);
//7.使能接收器和发送器
MCF_UART_UCR(uartNo) = (0
| MCF_UART_RX_ENABLED
| MCF_UART_TX_ENABLED);
//8.开放UARTx接收中断
if(1 == intStatusInit)
{ //开串行接收中断
MCF_UART_ICR_LEVEL(uartNo) = 0x3F;
MCF_UART_UIMR(uartNo) = 0x02;
MCF_UART_IMRL &= ~MCF_UART_IMRL_MASK(uartNo);
}
else
{ //禁串行接收中断
MCF_UART_ICR_LEVEL(uartNo) = 0x00;
MCF_UART_UIMR(uartNo) = 0x00;
MCF_UART_IMRL |= MCF_UART_IMRL_MASK(uartNo);
}
}
//-------------------------------------------------------------------------*
//函数名: UartSend1 *
//功 能: 串行发送1个字节 *
//参 数: uint8 uartNo: 第uartNo个UART模块,其中uartNo取值为0,1,2 *
// uint8 ch: 要发送的字节 *
//返 回: 无 *
//说 明: uartNo=0表示使用UART0模块,依此类推 *
//-------------------------------------------------------------------------*
void UartSend1(uint8 uartNo, uint8 ch)
{
if(uartNo > 2)
{ //若传进的通道号大于2,则按照2来接受
uartNo = 2;
}
//等待FIFO中有空闲缓冲区可用
while (!(MCF_UART_USR(uartNo) & MCF_UART_TX_TEST));
//发送数据
MCF_UART_UTB(uartNo) = ch;
}
//-------------------------------------------------------------------------*
//函数名: UartSendN *
//功 能: 串行发送N个字节 *
//参 数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2 *
// uint8 n: 发送的字节数 *
// uint8 ch[]: 待发送的数据 *
//返 回: 无 *
//说 明: uartNo=0表示使用UART0模块,依此类推。 *
// 调用了UartSend1函数 *
//-------------------------------------------------------------------------*
void UartSendN(uint8 uartNo, uint8 n, uint8 ch[])
{
uint8 i;
if(uartNo > 2)
{ //若传进的通道号大于2,则按照2来接受
uartNo = 2;
}
for(i=0; i<n; i++)
{ //发送n个字节
UartSend1(uartNo, ch[i]);
}
}
//-------------------------------------------------------------------------*
//函数名: UartRe1 *
//功 能: 从串口接收1个字节的数据 *
//参 数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2 *
//返 回: 接收到的数(若接收失败,返回0xff) *
// uint8 *p: 接收成功标志的指针(0表示成功,1表示不成功) *
//说 明: 参数*p带回接收标志,*p = 0,收到数据;*p = 1,未收到数据 *
// uartNo=0表示使用UART0模块,依此类推。 *
//-------------------------------------------------------------------------*
uint8 UartRe1 (uint8 uartNo, uint8 *p)
{
uint16 k;
uint8 i;
if(uartNo > 2)
{ //若传进的通道号大于2,则按照2来接受
uartNo = 2;
}
//等待接收数据
for(k=0; k < 0xfbbb; k++)
if (MCF_UART_USR(uartNo) & MCF_UART_RX_TEST)
{
i = MCF_UART_URB(uartNo);
*p = 0x00;
break;
}
//接收错误
if (k >= 0xfbbb)
{
i = 0xff;
*p = 0x01;
}
return i;
}
//-------------------------------------------------------------------------*
//函数名: UartReN *
//功 能: 从串口接收N个字节的数据 *
//参 数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2 *
// uint8 n: 要接收的字节数 *
// uint8 ch[]: 存放接收数据的数组 *
//返 回: 接收标志= 0 接收成功,= 1 接收失败 *
//说 明: uartNo=0表示使用UART0模块,依此类推。 *
// 调用了UartRe1函数 *
//-------------------------------------------------------------------------*
uint8 UartReN(uint8 uartNo, uint8 n, uint8 ch[])
{
uint8 m,fp;
m = 0;
if(uartNo > 2)
{ //若传进的通道号大于2,则按照2来接受
uartNo = 2;
}
while (m < n)
{ //接收n个字节,若任一字节接收失败,即返回接收失败
ch[m] = UartRe1(uartNo, &fp);
if (fp == 1)
{
return 1;
}
m++;
}
return 0;
}
//-------------------------------------------------------------------------*
//函数名: UartSendString *
//功 能: 串口传输字符串 *
//参 数: uint8 uartNo: 第uartNo个UART模块; p: 要传输的字符串的指针 *
//返 回: 无 *
//说 明: 字符串以'\0'结束 *
// 调用了UartSend1函数 *
//-------------------------------------------------------------------------*
void UartSendString(uint8 uartNo,char *p)
{
uint32 k;
if(p == 0) return;
for(k = 0; p[k] != '\0'; ++k)
{
UartSend1(uartNo,p[k]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -