uart.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. /*uart1_gpio_init();
  60. SM0 = 0;
  61. SM1 = 1; // SM0\SM1=01 UART mode=1;8位数据传送
  62. SM2 = 0; // Mode 1, 3 波特率采用9600 = (SMOD+1) x Fsysclk / (32 x 2 x (256-TH1)) --- 若使用Timer1 自动重载模式
  63. SET_REG_BITS(PCON, SMOD, 1); // SMOD=1允许UART1双波特率控制
  64. SET_REG_BITS(OPTION, UART1W, 0); // UART1禁止一线UART模式
  65. // Mode 1 波特率采用115200 = Fsysclk / (32 x (65536-TH1)) --- 若使用Timer1 自动重载模式
  66. // 假如我用7.3728MHZ晶体通过计算 65536-TH1应等于2,
  67. SET_REG_BITS(TMOD, TMOD1, 2); // 选择8位自动重载计数器/定时器
  68. TL1 = 256 - 24;
  69. TH1 = 256 - 24; // 9600
  70. TCLK = 0; // UART1模式1&3发送时钟源:0-timer1 1-timer2
  71. RCLK = 0; // UART1模式1&3接收时钟源:0-timer1 1-timer2
  72. TR1 = 1;
  73. REN = 1; // UART1接收收据使能
  74. ES = 1; // 允许串口Uart1中断*/
  75. SET_REG_BITS(PCON, SMOD, SMOD_PRICE); // 双波特率控制位
  76. /*SET_REG(PORTIDX, PORT3);
  77. SET_REG_BITS(PINMOD10, PINMOD1, PIN_MODE_PP);
  78. SET_REG_BITS(PINMOD10, PINMOD0, PIN_MODE_OD_IPU);*/
  79. uart0_gpio_init();
  80. SM0 = 0;
  81. SM1 = 1; // 模式1
  82. SM2 = 0;
  83. REN = 1; // 允许接收
  84. SET_REG_BITS(TMOD, TMOD1, 2); // 8 位自动重载定时器/计数器(TL1),溢出时从 TH1 重新装载。
  85. TL1 = TIM_NUM;
  86. TH1 = TIM_NUM;
  87. TI = 0; // 先清发送中断 标志
  88. RI = 0; // 先清接收中断 标志
  89. TR1 = 1; // TIMER1 运行
  90. REN = 1; // UART接收收据使能
  91. ES = 1; // 允许串口Uart1中断
  92. busy = 0; // 初始化
  93. }
  94. /**********************************************************************************************************
  95. **函数名称 :uart1_irq
  96. **函数描述 :uart1中断入口
  97. **输 入 :None
  98. **输 出 :None
  99. **********************************************************************************************************/
  100. void uart0_irq() interrupt 4
  101. {
  102. unsigned char temp;
  103. if (RI)
  104. {
  105. temp = SBUF;
  106. uart_receive_input(temp); // zigbee函数
  107. RI = 0;
  108. }
  109. /* if (TI)
  110. {
  111. TI = 0;
  112. busy = 0; // 清除忙标志
  113. }*/
  114. // 不是方式0,不采用中断请标志位
  115. }
  116. /**********************************************************************************************************
  117. **函数名称 UART1_send
  118. **函数描述 :uart1发送单字节数据
  119. **输 入 char
  120. **输 出 :None
  121. **********************************************************************************************************/
  122. void UART1_send(unsigned char c) // 发送单字节
  123. {
  124. // while (busy)
  125. // ;
  126. // busy = 1;
  127. SBUF = c; // 发送单字节
  128. while (TI == 0)
  129. ; // 等待发送完成
  130. TI = 0; //
  131. }
  132. /**********************************************************************************************************
  133. **函数名称 UART1_send_buf
  134. **函数描述 :uart1发送字符串
  135. **输 入 char
  136. **输 出 :None
  137. **********************************************************************************************************/
  138. void UART1_send_buf(char *s) // 发送字符串
  139. {
  140. while (*s)
  141. {
  142. UART1_send(*s++);
  143. }
  144. }