uart.c
上传用户:dongxin
上传日期:2022-06-22
资源大小:370k
文件大小:8k
源码类别:

uCOS

开发平台:

Others

  1. //-------------------------------------------------------------------------*
  2. //文件名:  Uart.c (串行通信)                                               *
  3. //-------------------------------------------------------------------------*
  4. #include "includes.h"  //头文件
  5. //-------------------------------------------------------------------------*
  6. //函数名: UartInit                                                         *
  7. //功  能: 初始化UARTx模块。x代表0,1,2                                    *
  8. //参  数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2        *
  9. //                      如果uatch大于2,则认为是2                          *
  10. //        int32 sysclk: 系统总线时钟,以MHz为单位                          *
  11. //        int32 baud:   波特率,如 4800,9600,19200,38400,57600,115200 *
  12. //                      其他的波特率在MCF52233的评估板上没有测试过,若要使 *
  13. //                      用该函数,请自行测试,一般来说,速度慢一点,通信会 *
  14. //                      更稳定                                             *
  15. //        uint8 intstatusInit: 初始化中断的状态 1表示开中断 其他表示不开   *
  16. //返  回: 无                                                               *
  17. //说  明: uartNo=0表示使用UART0模块,以此类推。                            *
  18. //-------------------------------------------------------------------------*
  19. //#define TASK_STK_SIZE 128
  20. // mcf52233 只有一个UART口
  21. void UartInit(uint8 uartNo, int32 sysclk, int32 baud, uint8 intstatusInit)
  22. {
  23.     register uint16 ubgs;
  24.     uartNo = uartNo;
  25.     //1、将UA口初始化为UART功能
  26.     MCF_GPIO_PUAPAR = 0
  27.         | MCF_GPIO_PUAPAR_URXD0_URXD0
  28.         | MCF_GPIO_PUAPAR_UTXD0_UTXD0;
  29.     //2、复位接收器和发送器以及模式寄存器
  30.     MCF_UART0_UCR = MCF_UART_UCR_RESET_TX; //复位发送器
  31.     MCF_UART0_UCR = MCF_UART_UCR_RESET_RX; //复位接收器
  32.     MCF_UART0_UCR = MCF_UART_UCR_RESET_MR; //复位模式寄存器
  33.     //3、配置UART模式:无奇偶校验、8位数据、正常通道模式、1停止位    
  34.     MCF_UART0_UMR1 = (0
  35. | MCF_UART_UMR_PM_NONE
  36. | MCF_UART_UMR_BC_8 );
  37.     MCF_UART0_UMR2 = (0
  38. | MCF_UART_UMR_CM_NORMAL
  39. | MCF_UART_UMR_SB_STOP_BITS_1);
  40.     
  41.     //4、选择预分频后的内部总线时钟作为收发器的时钟源
  42. MCF_UART0_UCSR = (0
  43. | MCF_UART_UCSR_RCS_SYS_CLK
  44. | MCF_UART_UCSR_TCS_SYS_CLK);
  45.     //5、屏蔽所有的UART中断
  46.     MCF_UART0_UIMR = 0;
  47.     //6、计算波特率并设置:UBG = fsys/(波特率*32)
  48.     ubgs = (uint16)((sysclk*1000000)/(baud * 32));    
  49.     
  50.     MCF_UART0_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
  51. MCF_UART0_UBG2 = (uint8)(ubgs & 0x00FF);
  52.     //7、使能接收器和发送器
  53.     MCF_UART0_UCR = (0
  54. | MCF_UART_UCR_TX_ENABLED
  55. | MCF_UART_UCR_RX_ENABLED);
  56.     //8、开放UARTx接收中断
  57.     if(1 == intstatusInit)
  58.     {
  59.         MCF_INTC0_ICR13 = 0x2F; //UART的中断控制器寄存器
  60.         MCF_UART0_UIMR = 0x02; //UART的中断掩码寄存器
  61.         MCF_INTC0_IMRL  &= ~MCF_INTC_IMRL_INT_MASK13; //中断掩码控制器中UART的掩码设置
  62.     }
  63.     else
  64.     {
  65.         MCF_INTC0_ICR13 = 0x00; //UART的中断控制器寄存器
  66.         MCF_UART0_UIMR = 0x00; //UART的中断掩码寄存器
  67.         MCF_INTC0_IMRL  |=  MCF_INTC_IMRL_INT_MASK13; //中断掩码控制器中UART的掩码设置
  68.     }
  69. }
  70. //-------------------------------------------------------------------------*
  71. //函数名: UartSend1                                                        *
  72. //功  能: 串行发送1个字节                                                  *
  73. //参  数: uint8 uartNo: 第uartNo个UART模块,其中uartNo取值为0,1,2        *
  74. //        uint8 ch:     要发送的字节                                       *
  75. //返  回: 无                                                               *
  76. //说  明: uartNo=0表示使用UART0模块,以此类推                              *
  77. //-------------------------------------------------------------------------*
  78. void UartSend1(uint8 uartNo, char ch)
  79. {
  80.     if(uartNo > 2)
  81.     {  //若传进的通道号大于2,则按照2来接受
  82.         uartNo = 2;
  83.     }
  84.     //等待FIFO中有空闲缓冲区可用
  85.     while (!(MCF_UART_USR(uartNo) & MCF_UART_TX_TEST));
  86.     //发送数据
  87.     MCF_UART_UTB(uartNo) = ch;
  88. }
  89. //-------------------------------------------------------------------------*
  90. //函数名: UartSendN                                                        *
  91. //功  能: 串行发送N个字节                                                  *
  92. //参  数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2        *
  93. //        uint8 n:      发送的字节数                                       *
  94. //        uint8 ch[]:   待发送的数据                                       *
  95. //返  回: 无                                                               *
  96. //说  明: uartNo=0表示使用UART0模块,以此类推。                            *
  97. //        调用了UartSend1函数                                              *
  98. //-------------------------------------------------------------------------*
  99. void UartSendN(uint8 uartNo, uint8 n, char ch[])
  100. {
  101.     uint8 i;
  102.     if(uartNo > 2)
  103.     {  //若传进的通道号大于2,则按照2来接受
  104.         uartNo = 2;
  105.     }
  106.     for(i=0; i<n; i++)
  107.     {  //发送n个字节
  108.      UartSend1(uartNo, ch[i]);
  109.     }
  110. }
  111. //-------------------------------------------------------------------------*
  112. //函数名: UartRe1                                                          *
  113. //功  能: 从串口接收1个字节的数据                                          *
  114. //参  数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2        *
  115. //返  回: 接收到的数据(若接收失败,返回0xff)                             *
  116. //        uint8 *p:     接收成功标志的指针(0表示成功,1表示不成功)       *
  117. //说  明: 参数*p带回接收标志,*p = 0,收到数据;*p = 1,未收到数据         *
  118. //        uartNo=0表示使用UART0模块,以此类推。                            *
  119. //-------------------------------------------------------------------------*
  120. uint8 UartRe1 (uint8 uartNo, char *p)
  121. {
  122.     uint16 k;
  123.     uint8  i;
  124.     if(uartNo > 2)
  125.     {  //若传进的通道号大于2,则按照2来接受
  126.         uartNo = 2;
  127.     }
  128.     //等待接收数据
  129.     for(k=0; k < 0xfbbb; k++)
  130.         if (MCF_UART_USR(uartNo) & MCF_UART_RX_TEST)
  131.         {
  132.             i  = MCF_UART_URB(uartNo);
  133.             *p = 0x00;
  134.             break;
  135.         }
  136.     //接收错误
  137.     if (k >= 0xfbbb)
  138.     {
  139.         i  = 0xff;
  140.         *p = 0x01;
  141.     }
  142.     return i;
  143. }
  144. //-------------------------------------------------------------------------*
  145. //函数名: UartReN                                                          *
  146. //功  能: 从串口接收N个字节的数据                                          *
  147. //参  数: uint8 uartNo: 第uartNo个UART模块。其中uartNo取值为0,1,2        *
  148. //        uint8 n:      要接收的字节数                                     *
  149. //        uint8 ch[]:   存放接收数据的数组                                 *
  150. //返  回: 接收标志= 0 接收成功,= 1 接收失败                               *
  151. //说  明: uartNo=0表示使用UART0模块,以此类推。                            *
  152. //        调用了UartRe1函数                                                *
  153. //-------------------------------------------------------------------------*
  154. uint8 UartReN(uint8 uartNo, uint8 n, char ch[])
  155. {
  156.     char m,fp;
  157.     m = 0;
  158.     if(uartNo > 2)
  159.     {  //若传进的通道号大于2,则按照2来接受
  160.         uartNo = 2;
  161.     }
  162.     while (m < n)
  163.     {  //接收n个字节,若任一字节接收失败,即返回接收失败
  164.         ch[m] = UartRe1(uartNo, &fp);
  165.         if (fp == 1)
  166.         {
  167.             return 1;
  168.         }
  169.         m++;
  170.     }
  171.     return 0;
  172. }
  173. //-------------------------------------------------------------------------*
  174. //函数名: UartSendString                                                   *
  175. //功  能: 串口传输字符串                                                   *
  176. //参  数: uint8 uartNo: 第uartNo个UART模块; p: 要传输的字符串              *
  177. //返  回: 无                                                               *
  178. //内部调用: UartSend1                                                      *
  179. //-------------------------------------------------------------------------*
  180. void UartSendString(uint8 uartNo,char *p)
  181. {
  182. uint32 k;
  183. if(p == 0)
  184. return;
  185. for(k = 0; p[k] != ''; ++k)
  186. {
  187. UartSend1(uartNo,p[k]);
  188. }
  189. }