uart_agm.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #include "uart_agm.h"
  2. #include "delay.h"
  3. #include "app/public.h"
  4. #include "app/air780e.h"
  5. uint32_t uart_delay[UART_MAX];
  6. //根据波特率计算延时时间
  7. void uart_baud_delay(uint8_t uartid, uint32_t baud)
  8. {
  9. uint32_t delay,temp;
  10. if(uartid >= UART_MAX)
  11. return;
  12. temp = 1000000/baud;
  13. delay = temp*10 + temp*1;
  14. uart_delay[uartid] = delay;
  15. // printf("uart%d,delay:%u\n",uartid,uart_delay[uartid]);
  16. }
  17. void uart_0_debug_init(void)
  18. {
  19. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTRXD));
  20. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTTXD));
  21. SYS_EnableAPBClock(APB_MASK_UART0);
  22. UART_Init(UART0, 115200, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_1);
  23. UART_EnableInt(UART0, UART_INT_RX);
  24. UART_SetRxIntFifoLevel(UART0, UART_INT_FIFO_HALF);
  25. INT_EnableIRQ(UART0_IRQn, UART_PRIORITY);
  26. }
  27. void data_dump(const char *name, uint8_t *data, uint16_t length)
  28. {
  29. int index = 0;
  30. printf("%s Data Info: \r\n ", name);
  31. for (index = 0; index < length; index++)
  32. {
  33. if ((index % 4 == 0) && index)
  34. {
  35. if ((index % 16 == 0) && index)
  36. {
  37. printf("\r\n ");
  38. }
  39. else
  40. {
  41. printf(" ");
  42. }
  43. }
  44. printf("%02x ", *(data + index));
  45. }
  46. printf("\r\n");
  47. }
  48. uint8_t uartDeal[1024] = {0};
  49. uart_rcv_info g_u4ginfo;
  50. uint8_t _tempstr[512],netrcvdata[512];
  51. void UART1_isr(void)
  52. {
  53. char val;
  54. volatile static uint16_t dalen = 0;
  55. volatile static uint8_t flag = 0;
  56. char *str = NULL, *str1 = NULL,*str2 = NULL;
  57. char *msg = NULL;
  58. int slen;
  59. volatile uint32_t net_rcv_len;
  60. if (UART_IsRawIntActive(UART1, UART_INT_RX))
  61. {
  62. UART_ClearInt(UART1, UART_INT_RX);
  63. UART_ReceiveCh(UART1, &val, 0);
  64. g_u4ginfo.rcvBuf[g_u4ginfo.tail] = val;
  65. if(val == '+'){
  66. dalen = 0;
  67. }
  68. if(dalen > 1023) dalen = 0;
  69. uartDeal[dalen++] = val;
  70. if((dalen>6) && (WORK_UPDATE != g_devMsg.workMode)){
  71. if(strncmp((char*)uartDeal,"+MSUB:",6)==0){ //
  72. if(uartDeal[dalen-2] =='\r' && uartDeal[dalen-1]=='\n'){
  73. flag = 1;
  74. }
  75. }
  76. }
  77. if((flag == 1) ) {
  78. str = strstr(uartDeal,"+MSUB:");
  79. if(str) {
  80. str1 = strstr(uartDeal,"byte");
  81. str2 = strstr(str1,"\r\n");
  82. if(str1 && str2 ){//&&( ucnt-datalen>=(len+2))
  83. memset(_tempstr, 0, sizeof(_tempstr));
  84. slen = net_data_copy(str1+5,(uint8_t *)_tempstr);
  85. net_rcv_len = net_rcvdata_ch((char *)_tempstr,netrcvdata,slen);
  86. fifo_write(&g_4Grxfifo,netrcvdata,net_rcv_len);
  87. //data_dump("NET RECB", netrcvdata, net_rcv_len);
  88. memset(str,0xFF,str2-str1);
  89. g_u4ginfo.tail = 0;
  90. g_u4ginfo.head = 0;
  91. }
  92. }
  93. dalen = 0;
  94. flag = 0;
  95. }
  96. g_u4ginfo.tail = (g_u4ginfo.tail+1)%UART_RCV_PROCBUF_LEN;
  97. if(g_u4ginfo.head == g_u4ginfo.tail){ // 前面的已经覆盖
  98. g_u4ginfo.head = (g_u4ginfo.head+1)%UART_RCV_PROCBUF_LEN;
  99. }
  100. timeout_setValue(&g_u4ginfo.ttUart, UART_RCV_TIMEOUT);
  101. timeout_start(&g_u4ginfo.ttUart);
  102. }
  103. }
  104. /*--------------------------------------------------------------------------------
  105. * 串口fifo 的初始化函数
  106. * uartid: 串口号 rcv: 信息接收函数
  107. *--------------------------------------------------------------------------------*/
  108. int uart_rs232_fifo_init(void)
  109. {
  110. g_u4ginfo.head = 0;
  111. g_u4ginfo.tail = 0;
  112. g_u4ginfo.readpos = 0;
  113. memset(g_u4ginfo.rcvBuf,0,UART_RCV_PROCBUF_LEN);
  114. return 0;
  115. }
  116. void uart1_4g_init(uint32_t baud)
  117. {
  118. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, 1, UARTRXD));
  119. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, 1, UARTTXD));
  120. SYS_EnableAPBClock(APB_MASK_UART1);
  121. UART_Init(UART1, baud, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_1);
  122. UART_EnableInt(UART1, UART_INT_RX);
  123. //UART_SetRxIntFifoLevel(UART1, UART_INT_FIFO_HALF); //
  124. INT_EnableIRQ(UART1_IRQn, UART_PRIORITY);
  125. uart_baud_delay(1,baud);
  126. uart_rs232_fifo_init();
  127. }
  128. uart485Info_t g_uart485;
  129. uart_com_rcv_info g_uComInfo[3];
  130. uint8_t usart485TX_Buffer[USART3_TX_SIZE];
  131. void read_485_data(void)
  132. {
  133. static uint8_t tempbuf[256];
  134. uint8_t strlen = 0;
  135. static uint16_t len = 0;
  136. //len = 0;
  137. if(timeout_isOut(&g_uComInfo[0].ttUart)&& g_uComInfo[0].ttUart.endMode==3){
  138. timeout_stop(&g_uComInfo[0].ttUart);
  139. //printf("head = %d, tail=%d\n",g_uComInfo[0].head,g_uComInfo[0].tail);
  140. while(g_uComInfo[0].head != g_uComInfo[0].tail){
  141. tempbuf[len++] = g_uComInfo[0].rcvBuf[g_uComInfo[0].head];
  142. g_uComInfo[0].head = (g_uComInfo[0].head+1)%UART_COM_RCVBUF_LEN;
  143. }
  144. if(strstr(tempbuf,"AT+PTMOD=ON\r\n") && (g_devMsg.workMode != WORK_UPDATE)){
  145. //fifo_write(&g_rxfifo,tempbuf,len);// 数据加入到fifo中
  146. printf("jum to pt\n");
  147. len = 0;
  148. memset(tempbuf,0,256);
  149. run_app();
  150. }
  151. if(len >= 12)
  152. {
  153. //printf("head = %d, tail=%d\n",g_uComInfo[0].head,g_uComInfo[0].tail);
  154. //data_dump("收到 ~~~~~~~~: ",tempbuf,len);
  155. strlen = (tempbuf[11]<<8)| tempbuf[10];
  156. if(len >= (strlen+12)) {
  157. fifo_write(&g_rxfifo,tempbuf,len);// 数据加入到fifo中
  158. len = 0;
  159. memset(tempbuf,0,256);
  160. }
  161. if(len >= 256) len = 0;
  162. }
  163. }
  164. }
  165. void UART2_isr(void)
  166. {
  167. char data;
  168. uart_com_rcv_info *uinfo;
  169. uinfo = &g_uComInfo[0];
  170. if (UART_IsRawIntActive(UART2, UART_INT_RX))
  171. {
  172. UART_ReceiveCh(UART2, &data, 0);
  173. uinfo->rcvBuf[uinfo->tail] = data;
  174. uinfo->tail = (uinfo->tail + 1)%UART_COM_RCVBUF_LEN;
  175. timeout_setValue(&uinfo->ttUart,UART_RCV_TIMEOUT);
  176. timeout_start(&uinfo->ttUart);
  177. UART_ClearInt(UART2, UART_INT_RX);
  178. }
  179. }
  180. void uart2_485_init(uint32_t baud)
  181. {
  182. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, 2, UARTRXD));
  183. GPIO_AF_ENABLE(GPIO_AF_PIN(UART, 2, UARTTXD));
  184. SYS_EnableAPBClock(APB_MASK_UART2);
  185. UART_Init(UART2, baud, UART_LCR_DATABITS_8, UART_LCR_STOPBITS_1, UART_LCR_PARITY_NONE, UART_LCR_FIFO_1);
  186. UART_EnableInt(UART2, UART_INT_RX);
  187. UART_SetRxIntFifoLevel(UART2, UART_INT_FIFO_HALF);
  188. INT_EnableIRQ(UART2_IRQn, UART_PRIORITY);
  189. // 485 CTL
  190. SYS_EnableAPBClock(APB_MASK_GPIO1);
  191. GPIO_SetOutput(GPIO1, GPIO_BIT2);
  192. RS485_RX();
  193. g_uComInfo[0].head = 0;
  194. g_uComInfo[0].tail = 0;
  195. uart_baud_delay(2,baud);
  196. }
  197. // 串口发送函数
  198. UART_TypeDef *uart_choice(uint8_t uartid)
  199. {
  200. UART_TypeDef *USARTx;
  201. switch (uartid)
  202. {
  203. case UART0_ID:
  204. USARTx = UART0;
  205. break;
  206. case UART1_ID:
  207. USARTx = UART1;
  208. break;
  209. case UART2_ID:
  210. USARTx = UART2;
  211. break;
  212. case UART3_ID:
  213. USARTx = UART3;
  214. break;
  215. case UART4_ID:
  216. USARTx = UART4;
  217. break;
  218. default:
  219. break;
  220. }
  221. return USARTx;
  222. }
  223. /*******************************************************************************
  224. *uart1_msg_send 发送报文处理
  225. *Input:
  226. * buf --需要发送的数据指针
  227. * buflen --发送的数据长度
  228. *Output:
  229. * None
  230. *Return:
  231. * OK/ERROR,表示执行成功和失败
  232. */
  233. ReturnCodeTypedef UART_Send_t(uint8_t uartid, UART_TypeDef *uart, const unsigned char *p, unsigned int num)
  234. {
  235. for (unsigned int i = 0; i < num; ++i)
  236. {
  237. // UART_SendCh(uart,*p);
  238. // p++;
  239. // delay_us(90);
  240. while (UART_IsTxFifoFull(uart))
  241. ;
  242. uart->DR = *p++;
  243. delay_us(uart_delay[uartid]);
  244. }
  245. return RET_OK;
  246. }
  247. int uart_msg_send(uint8_t uartid, const char *buf, uint32_t buflen)
  248. {
  249. uint32_t t = 0;
  250. UART_TypeDef *USARTx;
  251. if (uartid >= UART_MAX)
  252. return -1;
  253. if (uartid == UART2_ID)
  254. RS485_TX();
  255. USARTx = uart_choice(uartid);
  256. UART_Send_t(uartid, USARTx, buf, buflen);
  257. // UART_Send(USARTx, buf, buflen);
  258. if (uartid == UART2_ID)
  259. {
  260. // delay_us(60);
  261. RS485_RX();
  262. }
  263. return 0;
  264. }