uart2.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /******************************************************************************************************
  2. IC : TM52F1386
  3. 演示效果 :
  4. 通过USB将开发板与电脑,打开电脑中的串口助手,设置对应端口,
  5. 9600波特率,8位数据位,无校验位,1位停止位。向学习板发送任
  6. 意1个字节数据,学习板会回传1个相同字节数据。
  7. 注意:
  8. 需要将底板的OP4端子的TX与RX跳线帽接好
  9. 时钟 :
  10. 快时钟系统主频为 18.432M/2 = 9.216M
  11. 分给定时器的时钟频率为9.216M/2 = 4.608M
  12. *********************************************************************************************************/
  13. #include <REGtenxTM52F1386.h>
  14. #include "TM52F1386_bsp.h"
  15. #include <intrins.h>
  16. #include "uart2.h"
  17. // 波特率=(SMOD+1) x F SYSCLK /(32 x 2 x (256 – TH1))
  18. #define SMOD_PRICE 1
  19. #define FRC_HZ 18432000
  20. #define FRC_DIV 2
  21. #define BAUD4800 4800
  22. #define BAUD9600 9600
  23. #define BAUD19200 19200
  24. #define BAUD38400 38400
  25. #define BAUD57600 57600
  26. #define BAUD115200 115200 // 必须在系统一分频下
  27. #define UART2BRP (unsigned int)(FRC_HZ/FRC_DIV/32/BAUD9600) //计算不同波特率下的UART2BRP
  28. /**********************************************************************************************************
  29. **函数名称 :uart1_gpio_init
  30. **函数描述 :串口IO初始化
  31. **输 入 :None
  32. **输 出 :None
  33. **********************************************************************************************************/
  34. void uart2_gpio_init()
  35. {
  36. PORTIDX = PORT1;
  37. PINMOD10 = PINMOD10&0x00 | PIN_L_MODE_OD_IPU | PIN_H_MODE_PP;
  38. P1_1 = 1; // tx
  39. P1_0 = 1; // rx
  40. // p55,54
  41. SET_REG(PORTIDX, 5);
  42. SET_REG_BITS(PINMOD54, PINMOD5, PIN_MODE_PP); // 配置为CMOS推挽输出
  43. P5_5 = 0;
  44. SET_REG(PORTIDX, 5);
  45. SET_REG_BITS(PINMOD54, PINMOD4, PIN_MODE_PP); // 配置为CMOS推挽输出
  46. P5_5 = 0;
  47. }
  48. /******************************************************************************************
  49. ** 函数名称: uart2_init
  50. ** 函数描述: uart初始化函数 9600-8-1 无校验(轮询接收)
  51. ** 输入参数: 无
  52. ** 输出参数: 无
  53. *******************************************************************************************/
  54. void uart2_init(void)
  55. {
  56. uart2_gpio_init();
  57. UART2_8Bits;
  58. SCON2 = (SCON2&~SCON2_REN2_MASK) | 1 <<SCON2_REN2_POS; //允许接收,REN2=1
  59. UART2CON = (UART2CON &~ UART2CON_UART2BRP_MASK) | (UART2BRP << UART2CON_UART2BRP_POS);
  60. SCON2 = (SCON2 & ~RI2); //UART2 接收中断标志
  61. SCON2 = (SCON2 & ~TI2); // UART2 发送中断标志
  62. UART2_RECEPTION_ENABLE; //UART接收使能
  63. INTE1 = (INTE1 &~ INTE1_ES2_MASK) | 1 <<INTE1_ES2_POS; //ES2=1
  64. }
  65. /******************************************************************************************
  66. ** 函数名称: uart_recv
  67. ** 函数描述: uart2接收函数
  68. ** 输入参数: 无
  69. ** 输出参数: 无
  70. *******************************************************************************************/
  71. /*void uart_recv (unsigned char *buf, unsigned char len)
  72. {
  73. unsigned char i;
  74. for (i = 0; i < len; i++)
  75. {
  76. while ( (SCON2 & RI2) == 0);
  77. *buf = SBUF2;
  78. SCON2 = SCON2 & ~RI2; //清除标志位
  79. buf++;
  80. }
  81. }*/
  82. /******************************************************************************************
  83. ** 函数名称: uart_send
  84. ** 函数描述: uart2发送函数
  85. ** 输入参数: 无
  86. ** 输出参数: 无
  87. *******************************************************************************************/
  88. /*void uart_send (unsigned char *buf, unsigned char len)
  89. {
  90. unsigned char i;
  91. for (i = 0; i < len; i++)
  92. {
  93. SBUF2 = *buf;
  94. buf++;
  95. while ((SCON2 & TI2) == 0);
  96. SCON2 = SCON2 & ~TI2; //清除标志位
  97. }
  98. }*/
  99. /**********************************************************************************************************
  100. **函数名称 :uart1_irq
  101. **函数描述 :uart1中断入口
  102. **输 入 :None
  103. **输 出 :None
  104. **********************************************************************************************************/
  105. void uart2_irq() interrupt 12
  106. {
  107. unsigned char temp;
  108. if(SCON2&RI2)
  109. {
  110. temp = SBUF2;
  111. //uart_receive_input(temp); // zigbee函数
  112. SCON2 = SCON2&~SCON2_RI2_MASK;
  113. }
  114. /* if (TI)
  115. {
  116. TI = 0;
  117. busy = 0; // 清除忙标志
  118. }*/
  119. // 不是方式0,不采用中断请标志位
  120. }
  121. /**********************************************************************************************************
  122. **函数名称 UART1_send
  123. **函数描述 :uart1发送单字节数据
  124. **输 入 char
  125. **输 出 :None
  126. **********************************************************************************************************/
  127. void UART2_send(unsigned char c) // 发送单字节
  128. {
  129. // while (busy)
  130. // ;
  131. // busy = 1;
  132. SBUF2 = c; // 发送单字节
  133. while((SCON2&TI2) == 0);// 等待发送完成
  134. SCON2 = SCON2&~SCON2_TI2_MASK;
  135. }
  136. /**********************************************************************************************************
  137. **函数名称 UART1_send_buf
  138. **函数描述 :uart1发送字符串
  139. **输 入 char
  140. **输 出 :None
  141. **********************************************************************************************************/
  142. void UART2_send_buf(char *s) // 发送字符串
  143. {
  144. while (*s)
  145. {
  146. UART2_send(*s++);
  147. }
  148. }
  149. /******************************************************************************************
  150. ** 函数名称: main
  151. ** 函数描述: main函数
  152. ** 输入参数: 无
  153. ** 输出参数: 无
  154. *******************************************************************************************/
  155. /*void main (void)
  156. {
  157. bsp_clock_init(); // 系统快钟18.432 div 2 = 9.216Mhz
  158. uart2_init();
  159. while (1)
  160. {
  161. uart_recv (txrx_buf, 1);
  162. uart_send (txrx_buf, 1);
  163. // bsp_delay_ms(1000);
  164. }
  165. }*/