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

📄 uart.c

📁 基于32位ColdFire构建嵌入式系统书本原程序.rar
💻 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 + -