uart.c
上传用户:pudewen666
上传日期:2007-06-08
资源大小:75k
文件大小:4k
源码类别:

微处理器开发

开发平台:

Windows_Unix

  1. #include "config.h"
  2. #include "uart.h"
  3. uint8 rcv_buf[8]; // UART0数据接收缓冲区
  4. volatile uint8 rcv_new; // 接收新数据标志
  5. /*
  6. *********************************************************************************************************
  7. ** 函数名称 : Uart_Initialize()
  8. ** 函数功能 : 初始化Uart的相关工作,包括初始Uart0端口,设置波特率和Uart0中断向量地址等
  9. ** 入口参数 : uint32 baudrate: Uart0 波特率
  10. ** 出口参数 : 无
  11. *********************************************************************************************************
  12. */
  13. void Uart_Initialize(uint32 baudrate)
  14. {
  15. UARTMODE set;
  16. set.datab  = 8;
  17. set.stopb  = 1;
  18. set.parity = 0;
  19. rcv_new = 0;
  20. PINSEL0 &= 0xFFFFFFF0;
  21. PINSEL0 |= 0x00000005; // 设置I/O连接到UART0
  22. UART0_Init(baudrate, set); // 串口初始化
  23. U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节
  24. U0IER = 0x01; // 允许RBR中断,即接收中断
  25. IRQEnable(); // 使能IRQ中断
  26. /* 使能UART0中断 */
  27. VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
  28. VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级
  29. VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址
  30. VICIntEnable = 1 << 0x06; // 使能UART0中断
  31. }
  32. /*
  33. *********************************************************************************************************
  34. ** 函数名称 :IRQ_UART0()
  35. ** 函数功能 :串口0接收中断服务程序
  36. ** 入口参数 :无
  37. ** 出口参数 :无
  38. *********************************************************************************************************
  39. */
  40. void __irq IRQ_UART0 (void)
  41. {
  42. uint8 i;
  43. if ((U0IIR & 0x0F) == 0x04)
  44. rcv_new = 1; // 设置接收到新的数据标志
  45. for (i = 0; i < 8; i++)
  46. {
  47. rcv_buf[i] = U0RBR; // 读取FIFO的数据,并清除中断
  48. }
  49. VICVectAddr = 0x00; // 中断处理结束
  50. }
  51. /*
  52. *********************************************************************************************************
  53. ** 函数名称 :UART0_SendByte()
  54. ** 函数功能 :向串口0发送1字节数据
  55. ** 入口参数 :dat 要发送的数据
  56. ** 出口参数 :无
  57. *********************************************************************************************************
  58. */
  59. void UART0_SendByte (uint8 dat)
  60. {
  61. U0THR = dat; // 要发送的数据
  62. }
  63. /*
  64. *********************************************************************************************************
  65. ** 函数名称 :UART0_SendBuf()
  66. ** 函数功能 :向串口发送8字节数据
  67. ** 入口参数 :dat 要发送的数据
  68. ** 出口参数 :无
  69. *********************************************************************************************************
  70. */
  71. void UART0_SendBuf (void)
  72. {
  73. uint8 i;
  74. for (i=0; i<8; i++)
  75. UART0_SendByte(rcv_buf[i]);
  76. while ((U0LSR & 0x20) == 0); // 等待数据发送完毕
  77. }
  78. /*
  79. *********************************************************************************************************
  80. ** 函数名称 :UART0_Init()
  81. ** 函数功能 :串口初始化,设置工作模式和波特率。
  82. ** 入口参数 :baud 波特率
  83. **   set 模式设置(UARTMODE数据结构)
  84. ** 出口参数 :1-初始化成功,  0-初始化失败
  85. *********************************************************************************************************
  86. */
  87. int8 UART0_Init (uint32 baud, UARTMODE set)
  88. {
  89. uint32 bak;
  90. /* 参数过滤 */
  91. if ((baud ==0 ) || (baud > 115200)) return (0);
  92. if ((set.datab <5) || (set.datab > 8)) return (0);
  93. if ((set.stopb == 0) || (set.stopb > 2))  return (0);
  94. if (set.parity > 4) return (0);
  95. /* 设置串口波特率 */
  96. U0LCR = 0x80; // DLAB = 1
  97. bak   = (Fpclk >> 4) / baud;
  98. U0DLM = bak >> 8;
  99. U0DLL = bak & 0xFF;
  100. /* 设置串口模式 */
  101. bak   = set.datab - 5; // 设置字长
  102. if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位
  103. if (set.parity != 0)
  104. {
  105. set.parity = set.parity - 1;
  106. bak |= 0x08;
  107. }
  108. bak |= set.parity << 4; // 设置奇偶校验
  109. U0LCR = bak;
  110. return (1);
  111. }