uart.c 4.8 KB

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