uart.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /***********************************************************************************************************
  2. 功能:
  3. Uart1(9600)Uart2(9600),采用time1定时器
  4. Uart1选用P30,P31作为通信口,Uart2选用P17,P36作为通信口
  5. 8位数据位,无校验位,1位停止位。
  6. ***********************************************************************************************************/
  7. #include <REGtenxTM52F1386.h>
  8. #include "TM52F1386_bsp.h"
  9. #include <intrins.h>
  10. #include "uart.h"
  11. #include "zigbee.h"
  12. // 波特率=(SMOD+1) x F SYSCLK /(32 x 2 x (256 – TH1))
  13. #define SMOD_PRICE 1
  14. #define FRC_HZ 18432000
  15. #define FRC_DIV 2
  16. #define BAUD4800 4800
  17. #define BAUD9600 9600
  18. #define BAUD19200 19200
  19. #define BAUD38400 38400
  20. #define BAUD57600 57600
  21. #define BAUD115200 115200 // 必须在系统一分频下
  22. #define UART0_BAUD_RATE BAUD9600
  23. #define TIM_NUM (unsigned int)(256 - ((((FRC_HZ / FRC_DIV) * (SMOD_PRICE + 1)) / 2) / 32 / BAUD9600)); // 计算不同波特率下的定时器值
  24. /*
  25. 系统频率设置为二分频
  26. */
  27. unsigned char txrx_buf[8] = {0x55};
  28. char busy;
  29. char setuart;
  30. /**********************************************************************************************************
  31. **函数名称 :uart1_gpio_init
  32. **函数描述 :串口IO初始化
  33. **输 入 :None
  34. **输 出 :None
  35. **********************************************************************************************************/
  36. void uart0_gpio_init()
  37. {
  38. // RXD p30 --p4.4
  39. // TXD p31 --p4.5
  40. /*SET_REG(PORTIDX, PORT3);
  41. SET_REG_BITS(PINMOD10, PINMOD1, PIN_MODE_PP);
  42. SET_REG_BITS(PINMOD10, PINMOD0, PIN_MODE_OD_IPU);*/
  43. ////modified by zzw 修改串口为P4.4和P4.5
  44. SET_REG(PORTIDX, PORT4);
  45. SET_REG_BITS(PINMOD54, PINMOD5, PIN_MODE_PP);
  46. SET_REG_BITS(PINMOD54, PINMOD4, PIN_MODE_OD_IPU);
  47. setuart = GET_REG(PINMODE) | 0x02;
  48. SET_REG(PINMODE, setuart); // 设置UART0PS为10,将P4.4/P4.5用作RXD0/TXD0
  49. ////modified by zzw 修改串口为P4.4和P4.5
  50. }
  51. /**********************************************************************************************************
  52. **函数名称 :uart1_timer2_init
  53. **函数描述 :uart1在timer2下配置
  54. **输 入 :None
  55. **输 出 :None
  56. **********************************************************************************************************/
  57. void uart0_timer1_init()
  58. {
  59. /*SET_REG(PORTIDX, PORT3);
  60. SET_REG_BITS(PINMOD10, PINMOD1, PIN_MODE_PP);
  61. SET_REG_BITS(PINMOD10, PINMOD0, PIN_MODE_OD_IPU);*/
  62. uart0_gpio_init();
  63. SET_REG_BITS(PCON, SMOD, SMOD_PRICE); // 双波特率控制位
  64. SM0 = 0;
  65. SM1 = 1; // 模式1
  66. SM2 = 0;
  67. REN = 1; // 允许接收
  68. SET_REG_BITS(TMOD, TMOD1, 2); // 8 位自动重载定时器/计数器(TL1),溢出时从 TH1 重新装载。
  69. TL1 = TIM_NUM;
  70. TH1 = TIM_NUM;
  71. TI = 0; // 先清发送中断 标志
  72. RI = 0; // 先清接收中断 标志
  73. TR1 = 1; // TIMER1 运行
  74. REN = 1; // UART接收收据使能
  75. ES = 1; // 允许串口Uart1中断
  76. ////boot uart,前提一倍频下计算////
  77. /*UART0CON = UART0CON & ~0x80; // UART0BRS清零,波特率设置同标准 8051
  78. SM0 = 0;
  79. SM1 = 1; // SM0\SM1=01 UART mode=1;8位数据传送 ,01:模式 1:8 位 UART0,波特率可变
  80. SM2 = 0; // Mode 1, 3 波特率采用9600 = (SMOD+1) x Fsysclk / (32 x 2 x (256-TH1)) --- 若使用Timer1 自动重载模式
  81. PCON = (PCON & 0x7F) | 0x80; // SMOD=1允许UART双波特率控制//波特率= (SMOD + 1) x F SYSCLK / (32 x 2 x (256 – TH1))
  82. // Fsysclk = 波特率 * 32 * (256 - TH1)
  83. // TH1 = 256-Fsysclk/(波特率*32)
  84. // 115200 :TH1 =256- 18432000/115200/32=256-5
  85. // 9600 : TH1 =256- 18432000/9600/32=256- 60
  86. TMOD = TMOD & ~0X30 | 0x20;
  87. TL1 = 256 - 5;
  88. TH1 = 256 - 5; // 115200
  89. //TL1 = 256 - 60;
  90. //TH1 = 256 - 60; // 9600
  91. TCLK = 0; // UART1模式1&3发送时钟源:0-timer1 1-timer2
  92. RCLK = 0; // UART1模式1&3接收时钟源:0-timer1 1-timer2
  93. ES = 1; // 允许串口Uart中断
  94. TI = 0; // 先清发送中断 标志
  95. RI = 0; // 先清接收中断 标志
  96. TR1 = 1; // TIMER1 运行
  97. REN = 1; // UART接收使能*/
  98. ////boot uart///
  99. busy = 0; // 初始化
  100. }
  101. /**********************************************************************************************************
  102. **函数名称 :uart1_irq
  103. **函数描述 :uart1中断入口
  104. **输 入 :None
  105. **输 出 :None
  106. **********************************************************************************************************/
  107. void uart0_irq() interrupt 4
  108. {
  109. unsigned char temp;
  110. if (RI)
  111. {
  112. temp = SBUF;
  113. uart_receive_input(temp); // zigbee函数
  114. RI = 0;
  115. }
  116. /* if (TI)
  117. {
  118. TI = 0;
  119. busy = 0; // 清除忙标志
  120. }*/
  121. // 不是方式0,不采用中断请标志位
  122. }
  123. /**********************************************************************************************************
  124. **函数名称 UART1_send
  125. **函数描述 :uart1发送单字节数据
  126. **输 入 char
  127. **输 出 :None
  128. **********************************************************************************************************/
  129. void UART0_send(unsigned char c) // 发送单字节
  130. {
  131. // while (busy)
  132. // ;
  133. // busy = 1;
  134. SBUF = c; // 发送单字节
  135. while (TI == 0)
  136. ; // 等待发送完成
  137. TI = 0; //
  138. }
  139. /**********************************************************************************************************
  140. **函数名称 UART1_send_buf
  141. **函数描述 :uart1发送字符串
  142. **输 入 char
  143. **输 出 :None
  144. **********************************************************************************************************/
  145. void UART0_send_buf(char *s) // 发送字符串
  146. {
  147. while (*s)
  148. {
  149. UART0_send(*s++);
  150. }
  151. }