You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
4.0 KiB

  1. /**
  2. * @file uart.c
  3. * @author 1722451300@qq.com
  4. * @brief
  5. * @version 0.1
  6. * @date 2021-12-14
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. #include <hic.h>
  12. #include "t21_t8.h"
  13. #include "io_config.h"
  14. #include "uart.h"
  15. #include "motor.h"
  16. #include "lcd.h"
  17. #if 0
  18. #endif
  19. #define IT_SR //中断发送接收,注释此宏定义则使用查询方式发送接收
  20. #define CLRWDT() \
  21. { \
  22. __Asm CWDT; \
  23. } //宏定义清狗指令
  24. void uart0_config(void)
  25. {
  26. /**
  27. * @brief
  28. * PAT1 = 0; //TX输出
  29. * PAT2 = 1; //RX输入
  30. */
  31. uart0_tx_io = 0; //TX输出
  32. uart0_rx_io = 1; //RX输入
  33. RX0LEN = 0; //8位数据接收格式
  34. TX0LEN = 0; //8位数据发送格式
  35. /*
  36. BJT0EN = 0; //波特率去抖
  37. BRGH0 = 0; //波特率低速模式:波特率=Fosc/(64*(BRR<7:0>+1))
  38. BR0R = 0x33; //波特率=32MHz/(64*(51+1))≈9600bps = 9615.38
  39. */
  40. BJT0EN = 1; //波特率去抖
  41. BRGH0 = 1; //串口处于高速模式
  42. BR0R = 17;
  43. BR0FRA = 6;
  44. #ifdef IT_SR
  45. RX0IE = 1;
  46. GIE = 1;
  47. #endif
  48. RX0EN = 1; //打开接收
  49. TX0EN = 1; //打开发送
  50. }
  51. void uart1_config(void)
  52. {
  53. /**
  54. * @brief 1
  55. *
  56. */
  57. uart1_tx_io = 0; //TX输出
  58. uart1_rx_io = 1; //RX输入
  59. RX1LEN = 0; //8位数据接收格式
  60. TX1LEN = 0; //8位数据发送格式
  61. /*
  62. BJT1EN = 1; //波特率去抖
  63. BRGH0 = 0; //波特率低速模式:波特率=Fosc/(64*(BRR<7:0>+1))
  64. BR1R = 0x33; //波特率=32MHz/(64*(51+1))≈9600bps = 9615.38
  65. */
  66. BJT1EN = 1; //波特率去抖
  67. BRGH1 = 1; //串口处于高速模式
  68. BR1R = 17;
  69. BR1FRA = 6;
  70. #ifdef IT_SR
  71. RX1IE = 1;
  72. GIE = 1;
  73. #endif
  74. RX1EN = 1; //打开接收
  75. TX1EN = 1; //打开发送
  76. }
  77. void uart0_send_byte(char data)
  78. {
  79. /**
  80. * @brief 0
  81. * @param
  82. */
  83. while (!TRMT0)
  84. ;
  85. TX0B = data;
  86. }
  87. void uart0_send_buff(char *data)
  88. {
  89. /**
  90. * @brief 0
  91. * @param
  92. */
  93. while (*data)
  94. {
  95. while (!TRMT0)
  96. ;
  97. TX0B = *data;
  98. data++;
  99. }
  100. }
  101. void uart1_send_byte(char data)
  102. {
  103. /**
  104. * @brief 1
  105. * @param
  106. */
  107. while (!TRMT1)
  108. ;
  109. TX1B = data;
  110. }
  111. void uart1_send_buff(char *data)
  112. {
  113. /**
  114. * @brief 1
  115. * @param
  116. */
  117. while (*data)
  118. {
  119. while (!TRMT1)
  120. ;
  121. TX1B = *data;
  122. data++;
  123. }
  124. }
  125. void uart1_irq_interrupt(void)
  126. {
  127. /**
  128. * @brief 1
  129. *
  130. */
  131. if (RX1IE == 1)
  132. {
  133. //帧格式出错
  134. if (FERR1 == 1) {
  135. }
  136. //接收溢出
  137. if (OERR1 == 1) {
  138. //重启串口
  139. RX1EN = 0;
  140. RX1EN = 1;
  141. }
  142. if ( RX1IF == 1)
  143. {
  144. uint8_t rx232data = RX1B;
  145. recv_from_lcd_data(rx232data);
  146. }
  147. }
  148. }
  149. #ifdef IT_SR
  150. void isr(void) interrupt
  151. {
  152. /**
  153. * @brief
  154. *
  155. */
  156. if (RX0IE == 1)
  157. {
  158. //帧格式出错
  159. if (FERR0 == 1) {
  160. }
  161. //接收溢出
  162. if (OERR0 == 1) {
  163. //重启串口
  164. RX0EN = 0;
  165. RX0EN = 1;
  166. }
  167. if ( RX0IF == 1)//串口0(电机数据接收)
  168. {
  169. uint8_t rx485data = RX0B;
  170. recv_from_motor_data(rx485data);
  171. }
  172. }
  173. uart1_irq_interrupt();//屏幕数据接收
  174. system_module_process_interrupt();//定时器中断
  175. }
  176. #endif
  177. void urat0_text(void)
  178. {
  179. /**
  180. * @brief
  181. *
  182. */
  183. volatile unsigned char str[] = "urat0";
  184. volatile unsigned char buf[] = "uart1";
  185. //send_cmd_to_motor(str, 5); //发送一串字符测试
  186. send_cmd_to_lcd(buf, 5); //发送一串字符测试
  187. }