drv_usart.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2009-01-05 Bernard the first version
  9. * 2010-03-29 Bernard remove interrupt Tx and DMA Rx mode
  10. * 2013-05-13 aozima update for kehong-lingtai.
  11. * 2015-01-31 armink make sure the serial transmit complete in putc()
  12. * 2016-05-13 armink add DMA Rx mode
  13. * 2017-01-19 aubr.cool add interrupt Tx mode
  14. * 2017-04-13 aubr.cool correct Rx parity err
  15. * 2021-08-20 breo.com first version
  16. */
  17. #include <rtdevice.h>
  18. #include <rthw.h>
  19. #include <board.h>
  20. #include "drv_usart.h"
  21. #define UART_ENABLE_IRQ(n) NVIC_EnableIRQ((n))
  22. #define UART_DISABLE_IRQ(n) NVIC_DisableIRQ((n))
  23. struct n32_uart
  24. {
  25. USART_Module *uart_device;
  26. IRQn_Type irq;
  27. struct n32_uart_dma
  28. {
  29. /* dma channel */
  30. DMA_ChannelType *rx_ch;
  31. DMA_Module *rx_dma_type;
  32. /* dma global flag */
  33. uint32_t rx_gl_flag;
  34. /* dma irq channel */
  35. uint8_t rx_irq_ch;
  36. /* setting receive len */
  37. rt_size_t setting_recv_len;
  38. /* last receive index */
  39. rt_size_t last_recv_index;
  40. } dma;
  41. };
  42. static void DMA_Configuration(struct rt_serial_device *serial);
  43. static rt_err_t n32_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  44. {
  45. struct n32_uart *uart;
  46. USART_InitType USART_InitStructure;
  47. RT_ASSERT(serial != RT_NULL);
  48. RT_ASSERT(cfg != RT_NULL);
  49. uart = (struct n32_uart *)serial->parent.user_data;
  50. RT_ASSERT(uart != RT_NULL);
  51. RT_ASSERT((uart->uart_device) != RT_NULL);
  52. n32_msp_usart_init(uart->uart_device);
  53. USART_InitStructure.BaudRate = cfg->baud_rate;
  54. if (cfg->data_bits == DATA_BITS_8)
  55. {
  56. USART_InitStructure.WordLength = USART_WL_8B;
  57. }
  58. else if (cfg->data_bits == DATA_BITS_9)
  59. {
  60. USART_InitStructure.WordLength = USART_WL_9B;
  61. }
  62. if (cfg->stop_bits == STOP_BITS_1)
  63. {
  64. USART_InitStructure.StopBits = USART_STPB_1;
  65. }
  66. else if (cfg->stop_bits == STOP_BITS_2)
  67. {
  68. USART_InitStructure.StopBits = USART_STPB_2;
  69. }
  70. if (cfg->parity == PARITY_NONE)
  71. {
  72. USART_InitStructure.Parity = USART_PE_NO;
  73. }
  74. else if (cfg->parity == PARITY_ODD)
  75. {
  76. USART_InitStructure.Parity = USART_PE_ODD;
  77. }
  78. else if (cfg->parity == PARITY_EVEN)
  79. {
  80. USART_InitStructure.Parity = USART_PE_EVEN;
  81. }
  82. USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
  83. USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
  84. USART_Init(uart->uart_device, &USART_InitStructure);
  85. /* Enable USART */
  86. USART_Enable(uart->uart_device, ENABLE);
  87. USART_ClrFlag(uart->uart_device, USART_FLAG_TXDE | USART_FLAG_TXC);
  88. return RT_EOK;
  89. }
  90. static rt_err_t n32_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
  91. {
  92. struct n32_uart *uart;
  93. rt_uint32_t ctrl_arg = (rt_uint32_t)(arg);
  94. RT_ASSERT(serial != RT_NULL);
  95. uart = (struct n32_uart *)serial->parent.user_data;
  96. switch (cmd)
  97. {
  98. /* disable interrupt */
  99. case RT_DEVICE_CTRL_CLR_INT:
  100. /* disable rx irq */
  101. UART_DISABLE_IRQ(uart->irq);
  102. /* disable interrupt */
  103. USART_ConfigInt(uart->uart_device, USART_INT_RXDNE, DISABLE);
  104. break;
  105. /* enable interrupt */
  106. case RT_DEVICE_CTRL_SET_INT:
  107. /* enable rx irq */
  108. UART_ENABLE_IRQ(uart->irq);
  109. /* enable interrupt */
  110. USART_ConfigInt(uart->uart_device, USART_INT_RXDNE, ENABLE);
  111. break;
  112. /* USART config */
  113. case RT_DEVICE_CTRL_CONFIG :
  114. if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX)
  115. {
  116. DMA_Configuration(serial);
  117. }
  118. break;
  119. }
  120. return RT_EOK;
  121. }
  122. static int n32_uart_putc(struct rt_serial_device *serial, char c)
  123. {
  124. struct n32_uart *uart;
  125. RT_ASSERT(serial != RT_NULL);
  126. uart = (struct n32_uart *)serial->parent.user_data;
  127. if (serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX)
  128. {
  129. if (!(uart->uart_device->STS & USART_FLAG_TXDE))
  130. {
  131. USART_ConfigInt(uart->uart_device, USART_INT_TXC, ENABLE);
  132. return -1;
  133. }
  134. uart->uart_device->DAT = c;
  135. USART_ConfigInt(uart->uart_device, USART_INT_TXC, ENABLE);
  136. }
  137. else
  138. {
  139. uart->uart_device->DAT = c;
  140. while (!(uart->uart_device->STS & USART_FLAG_TXC));
  141. }
  142. return 1;
  143. }
  144. static int n32_uart_getc(struct rt_serial_device *serial)
  145. {
  146. int ch;
  147. struct n32_uart *uart;
  148. RT_ASSERT(serial != RT_NULL);
  149. uart = (struct n32_uart *)serial->parent.user_data;
  150. ch = -1;
  151. if (uart->uart_device->STS & USART_FLAG_RXDNE)
  152. {
  153. ch = uart->uart_device->DAT & 0xff;
  154. }
  155. return ch;
  156. }
  157. /**
  158. * Serial port receive idle process. This need add to uart idle ISR.
  159. *
  160. * @param serial serial device
  161. */
  162. static void dma_uart_rx_idle_isr(struct rt_serial_device *serial)
  163. {
  164. struct n32_uart *uart = (struct n32_uart *) serial->parent.user_data;
  165. rt_size_t recv_total_index, recv_len;
  166. rt_base_t level;
  167. /* disable interrupt */
  168. level = rt_hw_interrupt_disable();
  169. recv_total_index = uart->dma.setting_recv_len - DMA_GetCurrDataCounter(uart->dma.rx_ch);
  170. recv_len = recv_total_index - uart->dma.last_recv_index;
  171. uart->dma.last_recv_index = recv_total_index;
  172. /* enable interrupt */
  173. rt_hw_interrupt_enable(level);
  174. if (recv_len)
  175. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  176. /* read a data for clear receive idle interrupt flag */
  177. USART_ReceiveData(uart->uart_device);
  178. DMA_ClearFlag(uart->dma.rx_gl_flag, uart->dma.rx_dma_type);
  179. }
  180. /**
  181. * DMA receive done process. This need add to DMA receive done ISR.
  182. *
  183. * @param serial serial device
  184. */
  185. static void dma_rx_done_isr(struct rt_serial_device *serial)
  186. {
  187. struct n32_uart *uart = (struct n32_uart *) serial->parent.user_data;
  188. rt_size_t recv_len;
  189. rt_base_t level;
  190. /* disable interrupt */
  191. level = rt_hw_interrupt_disable();
  192. recv_len = uart->dma.setting_recv_len - uart->dma.last_recv_index;
  193. /* reset last recv index */
  194. uart->dma.last_recv_index = 0;
  195. /* enable interrupt */
  196. rt_hw_interrupt_enable(level);
  197. if (recv_len)
  198. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  199. DMA_ClearFlag(uart->dma.rx_gl_flag, uart->dma.rx_dma_type);
  200. }
  201. /**
  202. * Uart common interrupt process. This need add to uart ISR.
  203. *
  204. * @param serial serial device
  205. */
  206. static void uart_isr(struct rt_serial_device *serial)
  207. {
  208. struct n32_uart *uart = (struct n32_uart *) serial->parent.user_data;
  209. RT_ASSERT(uart != RT_NULL);
  210. if (USART_GetIntStatus(uart->uart_device, USART_INT_RXDNE) != RESET)
  211. {
  212. if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_PEF) == RESET)
  213. {
  214. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  215. }
  216. /* clear interrupt */
  217. USART_ClrIntPendingBit(uart->uart_device, USART_INT_RXDNE);
  218. }
  219. if (USART_GetIntStatus(uart->uart_device, USART_INT_IDLEF) != RESET)
  220. {
  221. dma_uart_rx_idle_isr(serial);
  222. }
  223. if (USART_GetIntStatus(uart->uart_device, USART_INT_TXC) != RESET)
  224. {
  225. /* clear interrupt */
  226. if (serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX)
  227. {
  228. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
  229. }
  230. USART_ConfigInt(uart->uart_device, USART_INT_TXC, DISABLE);
  231. USART_ClrIntPendingBit(uart->uart_device, USART_INT_TXC);
  232. }
  233. if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_OREF) == SET)
  234. {
  235. n32_uart_getc(serial);
  236. }
  237. }
  238. static const struct rt_uart_ops n32_uart_ops =
  239. {
  240. n32_uart_configure,
  241. n32_uart_control,
  242. n32_uart_putc,
  243. n32_uart_getc,
  244. };
  245. #if defined(BSP_USING_UART1)
  246. /* UART1 device driver structure */
  247. struct n32_uart uart1 =
  248. {
  249. USART1,
  250. USART1_IRQn,
  251. {
  252. DMA1_CH5,
  253. DMA1,
  254. DMA1_FLAG_GL5,
  255. DMA1_Channel5_IRQn,
  256. 0,
  257. },
  258. };
  259. struct rt_serial_device serial1;
  260. void USART1_IRQHandler(void)
  261. {
  262. /* enter interrupt */
  263. rt_interrupt_enter();
  264. uart_isr(&serial1);
  265. /* leave interrupt */
  266. rt_interrupt_leave();
  267. }
  268. void DMA1_Channel5_IRQHandler(void)
  269. {
  270. /* enter interrupt */
  271. rt_interrupt_enter();
  272. dma_rx_done_isr(&serial1);
  273. /* leave interrupt */
  274. rt_interrupt_leave();
  275. }
  276. #endif /* BSP_USING_UART1 */
  277. #if defined(BSP_USING_UART2)
  278. /* UART2 device driver structure */
  279. struct n32_uart uart2 =
  280. {
  281. USART2,
  282. USART2_IRQn,
  283. {
  284. DMA1_CH6,
  285. DMA1,
  286. DMA1_FLAG_GL6,
  287. DMA1_Channel6_IRQn,
  288. 0,
  289. },
  290. };
  291. struct rt_serial_device serial2;
  292. void USART2_IRQHandler(void)
  293. {
  294. /* enter interrupt */
  295. rt_interrupt_enter();
  296. uart_isr(&serial2);
  297. /* leave interrupt */
  298. rt_interrupt_leave();
  299. }
  300. void DMA1_Channel6_IRQHandler(void)
  301. {
  302. /* enter interrupt */
  303. rt_interrupt_enter();
  304. dma_rx_done_isr(&serial2);
  305. /* leave interrupt */
  306. rt_interrupt_leave();
  307. }
  308. #endif /* BSP_USING_UART2 */
  309. #if defined(BSP_USING_UART3)
  310. /* UART3 device driver structure */
  311. struct n32_uart uart3 =
  312. {
  313. USART3,
  314. USART3_IRQn,
  315. {
  316. DMA1_CH3,
  317. DMA1,
  318. DMA1_FLAG_GL3,
  319. DMA1_Channel3_IRQn,
  320. 0,
  321. },
  322. };
  323. struct rt_serial_device serial3;
  324. void USART3_IRQHandler(void)
  325. {
  326. /* enter interrupt */
  327. rt_interrupt_enter();
  328. uart_isr(&serial3);
  329. /* leave interrupt */
  330. rt_interrupt_leave();
  331. }
  332. void DMA1_Channel3_IRQHandler(void)
  333. {
  334. /* enter interrupt */
  335. rt_interrupt_enter();
  336. dma_rx_done_isr(&serial3);
  337. /* leave interrupt */
  338. rt_interrupt_leave();
  339. }
  340. #endif /* BSP_USING_UART3 */
  341. #if defined(BSP_USING_UART4)
  342. /* UART4 device driver structure */
  343. struct n32_uart uart4 =
  344. {
  345. UART4,
  346. UART4_IRQn,
  347. {
  348. DMA2_CH3,
  349. DMA2,
  350. DMA2_FLAG_GL3,
  351. DMA2_Channel3_IRQn,
  352. 0,
  353. },
  354. };
  355. struct rt_serial_device serial4;
  356. void UART4_IRQHandler(void)
  357. {
  358. /* enter interrupt */
  359. rt_interrupt_enter();
  360. uart_isr(&serial4);
  361. /* leave interrupt */
  362. rt_interrupt_leave();
  363. }
  364. void DMA2_Channel3_IRQHandler(void)
  365. {
  366. /* enter interrupt */
  367. rt_interrupt_enter();
  368. dma_rx_done_isr(&serial4);
  369. /* leave interrupt */
  370. rt_interrupt_leave();
  371. }
  372. #endif /* BSP_USING_UART4 */
  373. #if defined(BSP_USING_UART5)
  374. /* UART5 device driver structure */
  375. struct n32_uart uart5 =
  376. {
  377. UART5,
  378. UART5_IRQn,
  379. {
  380. DMA1_CH8,
  381. DMA1,
  382. DMA1_FLAG_GL8,
  383. DMA1_Channel8_IRQn,
  384. 0,
  385. },
  386. };
  387. struct rt_serial_device serial5;
  388. void UART5_IRQHandler(void)
  389. {
  390. /* enter interrupt */
  391. rt_interrupt_enter();
  392. uart_isr(&serial5);
  393. /* leave interrupt */
  394. rt_interrupt_leave();
  395. }
  396. void DMA1_Channel8_IRQHandler(void)
  397. {
  398. /* enter interrupt */
  399. rt_interrupt_enter();
  400. dma_rx_done_isr(&serial5);
  401. /* leave interrupt */
  402. rt_interrupt_leave();
  403. }
  404. #endif /* BSP_USING_UART5 */
  405. #if defined(BSP_USING_UART6)
  406. /* UART6 device driver structure */
  407. struct n32_uart uart6 =
  408. {
  409. UART6,
  410. UART6_IRQn,
  411. {
  412. DMA2_CH1,
  413. DMA2,
  414. DMA2_FLAG_GL1,
  415. DMA2_Channel1_IRQn,
  416. 0,
  417. },
  418. };
  419. struct rt_serial_device serial6;
  420. void UART6_IRQHandler(void)
  421. {
  422. /* enter interrupt */
  423. rt_interrupt_enter();
  424. uart_isr(&serial6);
  425. /* leave interrupt */
  426. rt_interrupt_leave();
  427. }
  428. void DMA2_Channel1_IRQHandler(void)
  429. {
  430. /* enter interrupt */
  431. rt_interrupt_enter();
  432. dma_rx_done_isr(&serial6);
  433. /* leave interrupt */
  434. rt_interrupt_leave();
  435. }
  436. #endif /* BSP_USING_UART6 */
  437. #if defined(BSP_USING_UART7)
  438. /* UART7 device driver structure */
  439. struct n32_uart uart7 =
  440. {
  441. UART7,
  442. UART7_IRQn,
  443. {
  444. DMA2_CH6,
  445. DMA2,
  446. DMA2_FLAG_GL6,
  447. DMA2_Channel6_IRQn,
  448. 0,
  449. },
  450. };
  451. struct rt_serial_device serial7;
  452. void UART7_IRQHandler(void)
  453. {
  454. /* enter interrupt */
  455. rt_interrupt_enter();
  456. uart_isr(&serial7);
  457. /* leave interrupt */
  458. rt_interrupt_leave();
  459. }
  460. void DMA2_Channel6_IRQHandler(void)
  461. {
  462. /* enter interrupt */
  463. rt_interrupt_enter();
  464. dma_rx_done_isr(&serial7);
  465. /* leave interrupt */
  466. rt_interrupt_leave();
  467. }
  468. #endif /* BSP_USING_UART7 */
  469. static void NVIC_Configuration(struct n32_uart *uart)
  470. {
  471. NVIC_InitType NVIC_InitStructure;
  472. /* Enable the USART1 Interrupt */
  473. NVIC_InitStructure.NVIC_IRQChannel = uart->irq;
  474. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  475. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  476. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  477. NVIC_Init(&NVIC_InitStructure);
  478. }
  479. static void DMA_Configuration(struct rt_serial_device *serial)
  480. {
  481. struct n32_uart *uart = (struct n32_uart *) serial->parent.user_data;
  482. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  483. DMA_InitType DMA_InitStructure;
  484. NVIC_InitType NVIC_InitStructure;
  485. uart->dma.setting_recv_len = serial->config.bufsz;
  486. /* enable transmit idle interrupt */
  487. USART_ConfigInt(uart->uart_device, USART_INT_IDLEF, ENABLE);
  488. /* DMA clock enable */
  489. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA1, ENABLE);
  490. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA2, ENABLE);
  491. /* rx dma config */
  492. DMA_DeInit(uart->dma.rx_ch);
  493. DMA_InitStructure.PeriphAddr = (uint32_t) & (uart->uart_device->DAT);
  494. DMA_InitStructure.MemAddr = (uint32_t)(rx_fifo->buffer);
  495. DMA_InitStructure.Direction = DMA_DIR_PERIPH_SRC;
  496. DMA_InitStructure.BufSize = serial->config.bufsz;
  497. DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
  498. DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
  499. DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE;
  500. DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Byte;
  501. DMA_InitStructure.CircularMode = DMA_MODE_CIRCULAR;
  502. DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
  503. DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
  504. DMA_Init(uart->dma.rx_ch, &DMA_InitStructure);
  505. DMA_ClearFlag(uart->dma.rx_gl_flag, uart->dma.rx_dma_type);
  506. DMA_ConfigInt(uart->dma.rx_ch, DMA_INT_TXC, ENABLE);
  507. USART_EnableDMA(uart->uart_device, USART_DMAREQ_RX, ENABLE);
  508. DMA_EnableChannel(uart->dma.rx_ch, ENABLE);
  509. /* rx dma interrupt config */
  510. NVIC_InitStructure.NVIC_IRQChannel = uart->dma.rx_irq_ch;
  511. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  512. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  513. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  514. NVIC_Init(&NVIC_InitStructure);
  515. }
  516. int rt_hw_usart_init(void)
  517. {
  518. struct n32_uart *uart;
  519. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  520. #if defined(BSP_USING_UART1)
  521. uart = &uart1;
  522. config.baud_rate = BAUD_RATE_115200;
  523. serial1.ops = &n32_uart_ops;
  524. serial1.config = config;
  525. NVIC_Configuration(uart);
  526. /* register UART1 device */
  527. rt_hw_serial_register(&serial1, "uart1",
  528. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  529. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  530. uart);
  531. #endif /* BSP_USING_UART1 */
  532. #if defined(BSP_USING_UART2)
  533. uart = &uart2;
  534. config.baud_rate = BAUD_RATE_115200;
  535. serial2.ops = &n32_uart_ops;
  536. serial2.config = config;
  537. NVIC_Configuration(uart);
  538. /* register UART2 device */
  539. rt_hw_serial_register(&serial2, "uart2",
  540. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  541. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  542. uart);
  543. #endif /* BSP_USING_UART2 */
  544. #if defined(BSP_USING_UART3)
  545. uart = &uart3;
  546. config.baud_rate = BAUD_RATE_115200;
  547. serial3.ops = &n32_uart_ops;
  548. serial3.config = config;
  549. NVIC_Configuration(uart);
  550. /* register UART3 device */
  551. rt_hw_serial_register(&serial3, "uart3",
  552. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  553. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  554. uart);
  555. #endif /* BSP_USING_UART3 */
  556. #if defined(BSP_USING_UART4)
  557. uart = &uart4;
  558. config.baud_rate = BAUD_RATE_115200;
  559. serial4.ops = &n32_uart_ops;
  560. serial4.config = config;
  561. NVIC_Configuration(uart);
  562. /* register UART4 device */
  563. rt_hw_serial_register(&serial4, "uart4",
  564. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  565. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  566. uart);
  567. #endif /* BSP_USING_UART4 */
  568. #if defined(BSP_USING_UART5)
  569. uart = &uart5;
  570. config.baud_rate = BAUD_RATE_115200;
  571. serial5.ops = &n32_uart_ops;
  572. serial5.config = config;
  573. NVIC_Configuration(uart);
  574. /* register UART5 device */
  575. rt_hw_serial_register(&serial5, "uart5",
  576. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  577. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  578. uart);
  579. #endif /* BSP_USING_UART5 */
  580. #if defined(BSP_USING_UART6)
  581. uart = &uart6;
  582. config.baud_rate = BAUD_RATE_115200;
  583. serial6.ops = &n32_uart_ops;
  584. serial6.config = config;
  585. NVIC_Configuration(uart);
  586. /* register UART6 device */
  587. rt_hw_serial_register(&serial6, "uart6",
  588. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  589. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  590. uart);
  591. #endif /* BSP_USING_UART6 */
  592. #if defined(BSP_USING_UART7)
  593. uart = &uart7;
  594. config.baud_rate = BAUD_RATE_115200;
  595. serial7.ops = &n32_uart_ops;
  596. serial7.config = config;
  597. NVIC_Configuration(uart);
  598. /* register UART7 device */
  599. rt_hw_serial_register(&serial7, "uart7",
  600. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |
  601. RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_DMA_RX,
  602. uart);
  603. #endif /* BSP_USING_UART7 */
  604. return RT_EOK;
  605. }