uart.c
上传用户:dongxin
上传日期:2022-06-22
资源大小:370k
文件大小:8k
- //-------------------------------------------------------------------------*
- //文件名: Uart.c (串行通信) *
- //-------------------------------------------------------------------------*
- #include "includes.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模块,以此类推。 *
- //-------------------------------------------------------------------------*
- //#define TASK_STK_SIZE 128
- // mcf52233 只有一个UART口
- void UartInit(uint8 uartNo, int32 sysclk, int32 baud, uint8 intstatusInit)
- {
- register uint16 ubgs;
- uartNo = uartNo;
- //1、将UA口初始化为UART功能
- MCF_GPIO_PUAPAR = 0
- | MCF_GPIO_PUAPAR_URXD0_URXD0
- | MCF_GPIO_PUAPAR_UTXD0_UTXD0;
- //2、复位接收器和发送器以及模式寄存器
- MCF_UART0_UCR = MCF_UART_UCR_RESET_TX; //复位发送器
- MCF_UART0_UCR = MCF_UART_UCR_RESET_RX; //复位接收器
- MCF_UART0_UCR = MCF_UART_UCR_RESET_MR; //复位模式寄存器
- //3、配置UART模式:无奇偶校验、8位数据、正常通道模式、1停止位
- MCF_UART0_UMR1 = (0
- | MCF_UART_UMR_PM_NONE
- | MCF_UART_UMR_BC_8 );
- MCF_UART0_UMR2 = (0
- | MCF_UART_UMR_CM_NORMAL
- | MCF_UART_UMR_SB_STOP_BITS_1);
-
- //4、选择预分频后的内部总线时钟作为收发器的时钟源
- MCF_UART0_UCSR = (0
- | MCF_UART_UCSR_RCS_SYS_CLK
- | MCF_UART_UCSR_TCS_SYS_CLK);
- //5、屏蔽所有的UART中断
- MCF_UART0_UIMR = 0;
- //6、计算波特率并设置:UBG = fsys/(波特率*32)
- ubgs = (uint16)((sysclk*1000000)/(baud * 32));
-
- MCF_UART0_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
- MCF_UART0_UBG2 = (uint8)(ubgs & 0x00FF);
- //7、使能接收器和发送器
- MCF_UART0_UCR = (0
- | MCF_UART_UCR_TX_ENABLED
- | MCF_UART_UCR_RX_ENABLED);
-
- //8、开放UARTx接收中断
- if(1 == intstatusInit)
- {
- MCF_INTC0_ICR13 = 0x2F; //UART的中断控制器寄存器
- MCF_UART0_UIMR = 0x02; //UART的中断掩码寄存器
- MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_INT_MASK13; //中断掩码控制器中UART的掩码设置
- }
- else
- {
- MCF_INTC0_ICR13 = 0x00; //UART的中断控制器寄存器
- MCF_UART0_UIMR = 0x00; //UART的中断掩码寄存器
- MCF_INTC0_IMRL |= MCF_INTC_IMRL_INT_MASK13; //中断掩码控制器中UART的掩码设置
- }
- }
- //-------------------------------------------------------------------------*
- //函数名: UartSend1 *
- //功 能: 串行发送1个字节 *
- //参 数: uint8 uartNo: 第uartNo个UART模块,其中uartNo取值为0,1,2 *
- // uint8 ch: 要发送的字节 *
- //返 回: 无 *
- //说 明: uartNo=0表示使用UART0模块,以此类推 *
- //-------------------------------------------------------------------------*
- void UartSend1(uint8 uartNo, char 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, char 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, char *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, char ch[])
- {
- char 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: 要传输的字符串 *
- //返 回: 无 *
- //内部调用: UartSend1 *
- //-------------------------------------------------------------------------*
- void UartSendString(uint8 uartNo,char *p)
- {
- uint32 k;
- if(p == 0)
- return;
- for(k = 0; p[k] != ' '; ++k)
- {
- UartSend1(uartNo,p[k]);
- }
- }