Uart.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. #include "includes.h"
  2. #include "Uart.h"
  3. //#include "bsp.h"
  4. //extern int rs485_send_flag;
  5. uart_info g_uart_info[UART_MAX];
  6. uart_rcv_buf_t g_uart_rcv_buf;
  7. uart_config_struct g_uart_cfg[] = {
  8. {GPIOA, GPIO_PIN_10,GPIOA, GPIO_PIN_9, 0, USART0_IRQn, USART0, RCU_USART0, RCU_GPIOA, 0, 0},
  9. {GPIOA, GPIO_PIN_3, GPIOA, GPIO_PIN_2, 0, USART1_IRQn, USART1, RCU_USART1, RCU_GPIOA, 0, 0},
  10. {GPIOD, GPIO_PIN_9, GPIOD, GPIO_PIN_8, GPIO_USART2_FULL_REMAP, USART2_IRQn, USART2, RCU_USART2, RCU_GPIOD, RCU_AF, 0},
  11. {GPIOC, GPIO_PIN_11,GPIOC, GPIO_PIN_10, 0, UART3_IRQn, UART3, RCU_UART3, RCU_GPIOC, RCU_AF, 0},
  12. {GPIOD, GPIO_PIN_2, GPIOC, GPIO_PIN_12, 0, UART4_IRQn, UART4, RCU_UART4, RCU_GPIOC, RCU_GPIOD, RCU_AF},
  13. };
  14. int uart_msg_send(uint8_t uartid, const char *buf, uint32_t buflen);
  15. int fputc(int ch, FILE *f)
  16. {
  17. uint32_t uart_def = g_uart_cfg[UART_DEBUG].uart_def;
  18. usart_data_transmit(uart_def, (uint8_t)ch);
  19. while(RESET == usart_flag_get(uart_def, USART_FLAG_TC));
  20. return ch;
  21. }
  22. void data_dump(const char *name, uint8_t *data, uint16_t length)
  23. {
  24. int index = 0;
  25. printf("%s Data Info: \r\n ", name);
  26. for(index = 0;index < length;index++) {
  27. if((index%4 == 0)&&index) {
  28. if((index%16 == 0)&&index) {
  29. printf("\r\n ");
  30. } else {
  31. printf(" ");
  32. }
  33. }
  34. printf("%02x ", *(data + index));
  35. }
  36. printf("\r\n");
  37. }
  38. void uart_init(uint8_t uartid, uint32_t baud, uint32_t wordlen, uint32_t parity)
  39. {
  40. uart_config_struct *p_uart = NULL;
  41. uint32_t USARTx;
  42. p_uart = &g_uart_cfg[uartid];
  43. USARTx = p_uart->uart_def;
  44. if(p_uart->gpio_clk)
  45. rcu_periph_clock_enable((rcu_periph_enum)p_uart->gpio_clk);
  46. if(p_uart->gpio_clk1)
  47. rcu_periph_clock_enable((rcu_periph_enum)p_uart->gpio_clk1);
  48. if(p_uart->gpio_clk2)
  49. rcu_periph_clock_enable((rcu_periph_enum)p_uart->gpio_clk2);
  50. rcu_periph_clock_enable((rcu_periph_enum)p_uart->uart_clk);
  51. //USART1_TX GPIOA.9初始化
  52. gpio_init(p_uart->tx_port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, p_uart->tx_pin);
  53. //USART1_RX GPIOA.10初始化
  54. gpio_init(p_uart->rx_port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, p_uart->rx_pin);
  55. if(p_uart->remap) {
  56. gpio_pin_remap_config(p_uart->remap, ENABLE);
  57. }
  58. //USART 初始化设置
  59. usart_deinit(USARTx);
  60. usart_word_length_set(USARTx, wordlen);
  61. usart_stop_bit_set(USARTx, USART_STB_1BIT);
  62. usart_parity_config(USARTx, parity);
  63. usart_baudrate_set(USARTx, baud);
  64. usart_receive_config(USARTx, USART_RECEIVE_ENABLE);
  65. usart_transmit_config(USARTx, USART_TRANSMIT_ENABLE);
  66. usart_enable(USARTx);
  67. // //Usart1 NVIC 配置
  68. // nvic_irq_enable(p_uart->irq_no, 0, uartid);
  69. //
  70. // // 使能串口接收中断
  71. // usart_interrupt_enable(USARTx, USART_INT_RBNE);
  72. }
  73. uint8_t uart_rcv_buf_wr_rd(uint8_t uartid, uint8_t wr_rd, uint8_t state, uint16_t index, uint8_t val)
  74. {
  75. uint8_t p_data = 0;
  76. if(state == P_BUF)
  77. {
  78. switch(uartid)
  79. {
  80. case UART1_ID:
  81. if(wr_rd == P_WRITE)
  82. g_uart_rcv_buf.uart1_buf[index] = val;
  83. else if(wr_rd == P_READ)
  84. p_data = g_uart_rcv_buf.uart1_buf[index];
  85. break;
  86. case UART2_ID:
  87. if(wr_rd == P_WRITE)
  88. g_uart_rcv_buf.uart2_buf[index] = val;
  89. else if(wr_rd == P_READ)
  90. p_data = g_uart_rcv_buf.uart2_buf[index];
  91. break;
  92. case UART3_ID:
  93. if(wr_rd == P_WRITE)
  94. g_uart_rcv_buf.uart3_buf[index] = val;
  95. else if(wr_rd == P_READ)
  96. p_data = g_uart_rcv_buf.uart3_buf[index];
  97. break;
  98. case UART4_ID:
  99. if(wr_rd == P_WRITE)
  100. g_uart_rcv_buf.uart4_buf[index] = val;
  101. else if(wr_rd == P_READ)
  102. p_data = g_uart_rcv_buf.uart4_buf[index];
  103. break;
  104. case UART5_ID:
  105. if(wr_rd == P_WRITE)
  106. g_uart_rcv_buf.uart5_buf[index] = val;
  107. else if(wr_rd == P_READ)
  108. p_data = g_uart_rcv_buf.uart5_buf[index];
  109. break;
  110. default:
  111. break;
  112. }
  113. }
  114. else if(state == P_DATA)
  115. {
  116. switch(uartid)
  117. {
  118. case UART1_ID:
  119. if(wr_rd == P_WRITE)
  120. g_uart_rcv_buf.uart1_pdata[index] = val;
  121. else if(wr_rd == P_READ)
  122. p_data = g_uart_rcv_buf.uart1_pdata[index];
  123. break;
  124. case UART2_ID:
  125. if(wr_rd == P_WRITE)
  126. g_uart_rcv_buf.uart2_pdata[index] = val;
  127. else if(wr_rd == P_READ)
  128. p_data = g_uart_rcv_buf.uart2_pdata[index];
  129. break;
  130. case UART3_ID:
  131. if(wr_rd == P_WRITE)
  132. g_uart_rcv_buf.uart3_pdata[index] = val;
  133. else if(wr_rd == P_READ)
  134. p_data = g_uart_rcv_buf.uart3_pdata[index];
  135. break;
  136. case UART4_ID:
  137. if(wr_rd == P_WRITE)
  138. g_uart_rcv_buf.uart4_pdata[index] = val;
  139. else if(wr_rd == P_READ)
  140. p_data = g_uart_rcv_buf.uart4_pdata[index];
  141. break;
  142. case UART5_ID:
  143. if(wr_rd == P_WRITE)
  144. g_uart_rcv_buf.uart5_pdata[index] = val;
  145. else if(wr_rd == P_READ)
  146. p_data = g_uart_rcv_buf.uart5_pdata[index];
  147. break;
  148. default:
  149. break;
  150. }
  151. }
  152. return p_data;
  153. }
  154. /****************************************************************************
  155. * --uart_interrupt() UART0中断服务程序。
  156. * Input:
  157. * uid --串口编号
  158. * pinfo --串口信息处理结构指针
  159. *Output:
  160. * None
  161. *Return:
  162. * None
  163. */
  164. void uart_interrupt(uint8_t uartid)
  165. {
  166. uint16_t index = 0;
  167. uint8_t val =0;
  168. uart_info *pinfo = NULL;
  169. uart_config_struct *p_uart = NULL;
  170. uint32_t USARTx = NULL;
  171. pinfo = &g_uart_info[uartid];
  172. p_uart = &g_uart_cfg[uartid];
  173. USARTx = p_uart->uart_def;
  174. if(RESET != usart_interrupt_flag_get(USARTx, USART_INT_FLAG_RBNE))
  175. {
  176. val = (uint8_t)usart_data_receive(USARTx);
  177. usart_interrupt_flag_clear(USARTx,USART_INT_FLAG_ERR_FERR);
  178. pinfo->USART_ReceiveTimeCounter = USART_RECEIVE_OVERTIME;//接收计时
  179. pinfo->Rcv_Over = 0;//接收标志
  180. if(!pinfo->rinfo.flag.bufof)
  181. {/*如果接收缓冲没有溢出*/
  182. index = pinfo->rinfo.rtbuf.pinput;
  183. // pinfo->rinfo.rtbuf.buf[index] = val;
  184. uart_rcv_buf_wr_rd(uartid,P_WRITE,P_BUF,index,val);//////////
  185. index = (index+1) % (pinfo->rinfo.rproc.datalen);/*以datalen为模加index*/
  186. if(index == pinfo->rinfo.rtbuf.poutput)
  187. {/*接收的速度大于处理的速度了*/
  188. pinfo->rinfo.flag.bufof = ENABLE;/*溢出了*/
  189. }
  190. else
  191. {
  192. pinfo->rinfo.rtbuf.pinput = index;/*更新输入指针长度*/
  193. }
  194. }
  195. }
  196. return;
  197. }
  198. /************************************************
  199. 函数名称 : USART_ReceiveOvertimeProcess
  200. 功 能 : 串口超时接收
  201. 参 数 :
  202. 返 回 值 : 无
  203. 作 者 : sun
  204. *************************************************/
  205. void USART_ReceiveOvertimeProcess(void)
  206. {
  207. uint16_t i = 0;
  208. for(i = 0; i < 5; i++)
  209. {
  210. if(g_uart_info[i].USART_ReceiveTimeCounter >= SYSTEMTICK_PERIOD_MS)
  211. {
  212. g_uart_info[i].Rcv_Over = 0;
  213. g_uart_info[i].USART_ReceiveTimeCounter -= SYSTEMTICK_PERIOD_MS;
  214. if(g_uart_info[i].USART_ReceiveTimeCounter < SYSTEMTICK_PERIOD_MS)
  215. {
  216. g_uart_info[i].Rcv_Over = 1;
  217. }
  218. }
  219. }
  220. }
  221. /******************************************************************************************
  222. *uart_rs232_init --串口初始化函数
  223. *--
  224. *Input:
  225. * prt --协议类型
  226. * rcv --信息接收函数
  227. *Output:
  228. * 无
  229. *Return:
  230. * OK/ERROR 表示执行成功与否
  231. *
  232. */
  233. int uart_rs232_init(uint8_t uartid, uart_rcv_func rcv)
  234. {
  235. uart_info *pinfo = NULL;
  236. uart_config_struct *p_uart = NULL;
  237. pinfo = &g_uart_info[uartid];
  238. p_uart = &g_uart_cfg[uartid];
  239. /*清数据结构*/
  240. memset(pinfo, 0, sizeof(uart_info));
  241. /*记录接收报文处理函数*/
  242. pinfo->rinfo.rproc.rcv = rcv;
  243. /*lint -save -e611*/
  244. pinfo->uartid = uartid;
  245. pinfo->arg = (void *)p_uart->uart_def;
  246. /*lint -restore*/
  247. /*接收和发送指针执行相应的缓冲区*/
  248. //pinfo->rinfo.rproc.pdata = p_rx_data;
  249. if(uartid == UART_4G)
  250. {
  251. pinfo->rinfo.rproc.datalen = UART_RCV_LEN_BIG;
  252. }
  253. else
  254. {
  255. pinfo->rinfo.rproc.datalen = UART_RCV_LEN_SMALL;
  256. }
  257. // pinfo->rinfo.rproc.datalen = UART_RCV_TEMPBUF_LEN;
  258. //pinfo->sinfo.pdata = p_tx_data;
  259. // pinfo->sinfo.datalen = 1024;
  260. //trace_otp_trace1(uart_msg_send, uartid, "My Friends, Uart%d!!!\n", uartid+1);
  261. return 0;
  262. }
  263. //u8 uart_msg_send_disable(u8 uartid)
  264. //{
  265. // uart_info *pinfo = NULL;
  266. // pinfo = &g_uart_info[uartid];
  267. // return (pinfo->sinfo.poutput != pinfo->sinfo.pinput);
  268. //}
  269. /**********************************************************/
  270. uint32_t uart_choice(uint8_t uartid)
  271. {
  272. uint32_t USARTx = 0;
  273. switch(uartid)
  274. {
  275. case UART1_ID:
  276. USARTx = USART0;
  277. break;
  278. case UART2_ID:
  279. USARTx = USART1;
  280. break;
  281. case UART3_ID:
  282. USARTx = USART2;
  283. break;
  284. case UART4_ID:
  285. USARTx = UART3;
  286. break;
  287. case UART5_ID:
  288. USARTx = UART4;
  289. break;
  290. default:
  291. break;
  292. }
  293. return USARTx;
  294. }
  295. /**********************************************************/
  296. /*******************************************************************************
  297. *uart1_msg_send 发送报文处理
  298. *Input:
  299. * buf --需要发送的数据指针
  300. * buflen --发送的数据长度
  301. *Output:
  302. * None
  303. *Return:
  304. * OK/ERROR,表示执行成功和失败
  305. */
  306. int uart_msg_send(uint8_t uartid, const char *buf, uint32_t buflen)
  307. {
  308. // uint32_t t = 0;
  309. uint32_t USARTx;
  310. if(uartid > UART5_ID)
  311. return -1;
  312. USARTx = uart_choice(uartid);
  313. while(buflen--)
  314. {
  315. usart_data_transmit(USARTx, *buf); // 发送一个字节数据
  316. while(RESET == usart_flag_get(USARTx, USART_FLAG_TBE)); // 发送完成判断
  317. buf++;
  318. }
  319. return 0;
  320. }
  321. /*******************************************************************************
  322. *uart_rcv_process 接收报文处理,按照相应的协议,对接收缓冲区的报文进行处理,并调用
  323. * 注册的rcv处理函数;
  324. *Input:
  325. * prt --报文处理使用的协议,根据协议类型进行报文接收;
  326. * prinfo --接收缓冲区相关信息指针;
  327. *Output:
  328. * None
  329. *Return:
  330. * OK/ERROR,表示执行成功和失败
  331. */
  332. int uart_rcv_process(uint8_t uartid)
  333. {
  334. uint8_t val = 0;
  335. uint32_t index = 0;
  336. uint32_t ucnt = 0;
  337. uart_info *pinfo = NULL;
  338. // uart_config_struct *p_uart = NULL;
  339. uart_rcv_info *prinfo = NULL;
  340. pinfo = &g_uart_info[uartid];
  341. // p_uart = &g_uart_cfg[uartid];
  342. prinfo = &pinfo->rinfo;
  343. /*参数检查*/
  344. if(prinfo == NULL) {
  345. return -1;
  346. }
  347. // if(pinfo->Rcv_Over==0)//串口数据未接收完
  348. // return -1;
  349. // else
  350. // pinfo->Rcv_Over = 0;
  351. /*20090828modify,szb*/
  352. if(prinfo->flag.bufof==TRUE) {
  353. prinfo->flag.bufof=FALSE;
  354. prinfo->rtbuf.poutput = prinfo->rtbuf.pinput;
  355. prinfo->rproc.outcnt = 0;
  356. }
  357. /*看看接收暂存缓冲区当前有没有数据可以接收*/
  358. if(prinfo->rtbuf.poutput == prinfo->rtbuf.pinput) {/*没有新数据*/
  359. return 0;
  360. }
  361. /*记录接收暂存缓冲区开始处理的位置*/
  362. index = prinfo->rtbuf.poutput;
  363. ucnt = prinfo->rproc.outcnt;
  364. /*处理已经接收完毕但是还没有处理的报文内容*/
  365. while(index != prinfo->rtbuf.pinput) {
  366. /*获取接收缓冲区的内容*/
  367. // val = prinfo->rtbuf.buf[index];
  368. // prinfo->rproc.pdata[ucnt] = val;
  369. val = uart_rcv_buf_wr_rd(uartid,P_READ,P_BUF,index,0);
  370. uart_rcv_buf_wr_rd(uartid,P_WRITE,P_DATA,ucnt,val);
  371. /*处理下一个字符*/
  372. index = (index+1) % (pinfo->rinfo.rproc.datalen);
  373. ucnt = (ucnt+1) % (pinfo->rinfo.rproc.datalen);
  374. }
  375. // if(prinfo->rproc.rcv) {/* 注册接收函数 */
  376. // prinfo->rproc.rcv(pinfo->uartid, pinfo->arg, prinfo->rproc.pdata, ucnt, NULL);
  377. // ucnt = 0;
  378. // }
  379. /*更新输出起始指针*/
  380. prinfo->rtbuf.poutput = index;
  381. prinfo->rproc.outcnt = ucnt;
  382. return 0;
  383. }
  384. int uart_blocking_read(char *buffer, uint8_t uartid, uint32_t timeout)
  385. {
  386. // OS_ERR err;
  387. uart_info *pinfo = NULL;
  388. // uart_config_struct *p_uart = NULL;
  389. uart_rcv_info *prinfo = NULL;
  390. int ret = 1;
  391. pinfo = &g_uart_info[uartid];
  392. // p_uart = &g_uart_cfg[uartid];
  393. prinfo = &pinfo->rinfo;
  394. // uart_rcv_wait(uartid,timeout);
  395. // while(timeout--) {
  396. // OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_DLY, &err);
  397. // }
  398. if(prinfo->rproc.outcnt) {
  399. // memcpy(buffer, prinfo->rproc.pdata, prinfo->rproc.outcnt);
  400. if(uartid == UART1_ID)
  401. memcpy(buffer, g_uart_rcv_buf.uart1_pdata, prinfo->rproc.outcnt);
  402. else if(uartid == UART2_ID)
  403. memcpy(buffer, g_uart_rcv_buf.uart2_pdata, prinfo->rproc.outcnt);
  404. else if(uartid == UART3_ID)
  405. memcpy(buffer, g_uart_rcv_buf.uart3_pdata, prinfo->rproc.outcnt);
  406. else if(uartid == UART4_ID)
  407. memcpy(buffer, g_uart_rcv_buf.uart4_pdata, prinfo->rproc.outcnt);
  408. else if(uartid == UART5_ID)
  409. memcpy(buffer, g_uart_rcv_buf.uart5_pdata, prinfo->rproc.outcnt);
  410. ret = prinfo->rproc.outcnt;
  411. prinfo->rproc.outcnt = 0;
  412. } else {
  413. ret = 0;
  414. }
  415. return ret;
  416. }
  417. /*****************************************************************************
  418. ** Function name: USART1_IRQHandler
  419. **
  420. ** Descriptions: UART1 interrupt handler
  421. **
  422. ** parameters: None
  423. ** Returned value: None
  424. **
  425. *****************************************************************************/
  426. void USART0_IRQHandler(void)
  427. {
  428. uart_interrupt(UART1_ID);
  429. }
  430. void USART1_IRQHandler(void)
  431. {
  432. uart_interrupt(UART2_ID);
  433. }
  434. void USART2_IRQHandler(void)
  435. {
  436. uart_interrupt(UART3_ID);
  437. }
  438. void UART3_IRQHandler(void)
  439. {
  440. uart_interrupt(UART4_ID);
  441. }
  442. void UART4_IRQHandler(void)
  443. {
  444. uart_interrupt(UART5_ID);
  445. }
  446. //void uart_rcv_wait(uint8_t uartid, uint32_t timeout)
  447. //{
  448. // OS_ERR err;
  449. // while(g_uart_info[uartid].Rcv_Over==0 && timeout) {
  450. // timeout--;
  451. // OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_DLY, &err);
  452. // }
  453. //// g_uart_info[uartid].Rcv_Over=0;
  454. //}
  455. uint32_t uart_blocking_read_over(char *buffer, uint8_t uartid, uint32_t timeout)
  456. {
  457. uint32_t uart_len=0,uart_len_temp=0;
  458. uart_len = uart_blocking_read(buffer,uartid,1);
  459. if(uart_len)
  460. {
  461. while(timeout && g_uart_info[uartid].Rcv_Over==0)
  462. {
  463. timeout--;
  464. uart_len_temp = uart_blocking_read(buffer+uart_len,uartid,1);
  465. uart_len += uart_len_temp;
  466. }
  467. }
  468. return uart_len;
  469. }