drv_usartX.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. /*
  2. * File : usart.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006-2022, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-01-05 Bernard the first version
  13. * 2010-03-29 Bernard remove interrupt Tx and DMA Rx mode
  14. * 2013-05-13 aozima update for kehong-lingtai.
  15. * 2015-01-31 armink make sure the serial transmit complete in putc()
  16. * 2016-05-13 armink add DMA Rx mode
  17. * 2017-01-19 aubr.cool add interrupt Tx mode
  18. * 2017-04-13 aubr.cool correct Rx parity err
  19. * 2021-08-20 breo.com first version
  20. * 2022-06-01 THEWON first version for serialX
  21. */
  22. #include <rtdevice.h>
  23. #include <rthw.h>
  24. #include <board.h>
  25. #include "drv_usartX.h"
  26. #define UART_ENABLE_IRQ(n) NVIC_EnableIRQ((n))
  27. #define UART_DISABLE_IRQ(n) NVIC_DisableIRQ((n))
  28. #ifdef RT_SERIAL_USING_DMA
  29. static void DMA_RX_Configuration(struct rt_serial_device *serial);
  30. static void DMA_TX_Configuration(struct rt_serial_device *serial);
  31. #endif
  32. static rt_err_t n32_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  33. {
  34. struct n32_uart *uart;
  35. USART_InitType USART_InitStructure;
  36. RT_ASSERT(serial != RT_NULL);
  37. RT_ASSERT(cfg != RT_NULL);
  38. uart = rt_container_of(serial, struct n32_uart, serial);
  39. USART_InitStructure.BaudRate = cfg->baud_rate;
  40. switch (cfg->data_bits)
  41. {
  42. case DATA_BITS_8 :
  43. USART_InitStructure.WordLength = USART_WL_8B;
  44. break;
  45. case DATA_BITS_9 :
  46. USART_InitStructure.WordLength = USART_WL_9B;
  47. break;
  48. default:
  49. USART_InitStructure.WordLength = USART_WL_8B;
  50. break;
  51. }
  52. switch (cfg->stop_bits)
  53. {
  54. case STOP_BITS_1 :
  55. USART_InitStructure.StopBits = USART_STPB_1;
  56. break;
  57. case STOP_BITS_2 :
  58. USART_InitStructure.StopBits = USART_STPB_2;
  59. break;
  60. default:
  61. USART_InitStructure.StopBits = USART_STPB_1;
  62. break;
  63. }
  64. switch (cfg->parity)
  65. case PARITY_NONE :
  66. USART_InitStructure.Parity = USART_PE_NO;
  67. break;
  68. case PARITY_ODD :
  69. USART_InitStructure.Parity = USART_PE_ODD;
  70. break;
  71. case PARITY_EVEN :
  72. USART_InitStructure.Parity = USART_PE_EVEN;
  73. break;
  74. default:
  75. USART_InitStructure.Parity = USART_PE_NO;
  76. break;
  77. }
  78. USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
  79. USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
  80. USART_Init(uart->uart_device, &USART_InitStructure);
  81. return RT_EOK;
  82. }
  83. static rt_err_t n32_uart_init(struct rt_serial_device *serial)
  84. {
  85. struct n32_uart *uart;
  86. USART_InitType USART_InitStructure;
  87. RT_ASSERT(serial != RT_NULL);
  88. uart = rt_container_of(serial, struct n32_uart, serial);
  89. n32_msp_usart_init(uart->uart_device);
  90. if (n32_uart_configure(serial, &serial->config) != RT_EOK)
  91. {
  92. return -RT_ERROR;
  93. }
  94. /* Enable USART */
  95. USART_Enable(uart->uart_device, ENABLE);
  96. USART_ClrFlag(uart->uart_device, USART_FLAG_TXDE|USART_FLAG_TXC);
  97. return RT_EOK;
  98. }
  99. static rt_err_t n32_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
  100. {
  101. struct n32_uart *uart;
  102. rt_uint32_t ctrl_arg = (rt_uint32_t)(arg);
  103. NVIC_InitType NVIC_InitStructure;
  104. RT_ASSERT(serial != RT_NULL);
  105. uart = rt_container_of(serial, struct n32_uart, serial);
  106. switch (cmd) {
  107. case RT_DEVICE_CTRL_OPEN:
  108. USART_ConfigInt(uart->uart_device, USART_INT_TXDE, DISABLE);
  109. USART_ClrIntPendingBit(uart->uart_device, USART_INT_RXDNE);
  110. USART_ClrIntPendingBit(uart->uart_device, USART_INT_TXDE);
  111. USART_ClrIntPendingBit(uart->uart_device, USART_INT_TXC);
  112. /* enable rx irq */
  113. UART_ENABLE_IRQ(uart->irq);
  114. #ifdef RT_SERIAL_USING_DMA
  115. uart->dmaTxing = RT_FALSE;
  116. #endif
  117. break;
  118. case RT_DEVICE_CTRL_CLOSE:
  119. /* disable rx irq */
  120. UART_DISABLE_IRQ(uart->irq);
  121. USART_ConfigInt(uart->uart_device, USART_INT_RXDNE, DISABLE);
  122. USART_ConfigInt(uart->uart_device, USART_INT_TXDE, DISABLE);
  123. USART_ConfigInt(uart->uart_device, USART_INT_TXC, DISABLE);
  124. USART_ClrIntPendingBit(uart->uart_device, USART_INT_RXDNE);
  125. USART_ClrIntPendingBit(uart->uart_device, USART_INT_TXDE);
  126. USART_ClrIntPendingBit(uart->uart_device, USART_INT_TXC);
  127. #ifdef RT_SERIAL_USING_DMA
  128. NVIC_InitStructure.NVIC_IRQChannel = uart->dma_rx.dma_irq;
  129. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  130. NVIC_Init(&NVIC_InitStructure);
  131. DMA_EnableChannel(uart->dma_rx.dma_ch, DISABLE);
  132. DMA_ConfigInt(uart->dma_rx.dma_ch, DMA_INT_HTX, DISABLE);
  133. DMA_ConfigInt(uart->dma_rx.dma_ch, DMA_INT_TXC, DISABLE);
  134. DMA_DeInit(uart->dma_rx.dma_ch);
  135. NVIC_InitStructure.NVIC_IRQChannel = uart->dma_tx.dma_irq;
  136. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  137. NVIC_Init(&NVIC_InitStructure);
  138. DMA_EnableChannel(uart->dma_tx.dma_ch, DISABLE);
  139. DMA_ConfigInt(uart->dma_tx.dma_ch, DMA_INT_TXC, DISABLE);
  140. DMA_DeInit(uart->dma_tx.dma_ch);
  141. #endif
  142. break;
  143. case RT_DEVICE_CTRL_CLR_INT:
  144. /* disable interrupt */
  145. if (ctrl_arg & RT_DEVICE_FLAG_INT_RX) {
  146. USART_ConfigInt(uart->uart_device, USART_INT_RXDNE, DISABLE);
  147. }
  148. #ifdef RT_SERIAL_USING_DMA
  149. /* disable DMA */
  150. if (ctrl_arg & RT_DEVICE_FLAG_DMA_RX) {
  151. NVIC_InitStructure.NVIC_IRQChannel = uart->dma_rx.dma_irq;
  152. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  153. NVIC_Init(&NVIC_InitStructure);
  154. DMA_ConfigInt(uart->dma_rx.dma_ch, DMA_INT_HTX, DISABLE);
  155. DMA_ConfigInt(uart->dma_rx.dma_ch, DMA_INT_TXC, DISABLE);
  156. }
  157. if(ctrl_arg & RT_DEVICE_FLAG_DMA_TX) {
  158. NVIC_InitStructure.NVIC_IRQChannel = uart->dma_tx.dma_irq;
  159. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  160. NVIC_Init(&NVIC_InitStructure);
  161. DMA_ConfigInt(uart->dma_tx.dma_ch, DMA_INT_TXC, DISABLE);
  162. }
  163. #endif
  164. break;
  165. case RT_DEVICE_CTRL_SET_INT:
  166. /* enable interrupt */
  167. if (ctrl_arg & RT_DEVICE_FLAG_INT_RX) {
  168. USART_ConfigInt(uart->uart_device, USART_INT_RXDNE, ENABLE);
  169. }
  170. break;
  171. /* USART config */
  172. case RT_DEVICE_CTRL_CONFIG :
  173. #ifdef RT_SERIAL_USING_DMA
  174. if (ctrl_arg & RT_DEVICE_FLAG_DMA_RX) {
  175. DMA_RX_Configuration(serial);
  176. } else if (ctrl_arg & RT_DEVICE_FLAG_DMA_TX) {
  177. DMA_TX_Configuration(serial);
  178. }
  179. #endif
  180. break;
  181. default :
  182. break;
  183. }
  184. return RT_EOK;
  185. }
  186. static int n32_uart_putc(struct rt_serial_device *serial, char c)
  187. {
  188. struct n32_uart *uart;
  189. RT_ASSERT(serial != RT_NULL);
  190. uart = rt_container_of(serial, struct n32_uart, serial);
  191. while (!(uart->uart_device->STS & USART_FLAG_TXDE));
  192. uart->uart_device->DAT = c;
  193. return 1;
  194. }
  195. static int n32_uart_getc(struct rt_serial_device *serial)
  196. {
  197. int ch;
  198. struct n32_uart *uart;
  199. RT_ASSERT(serial != RT_NULL);
  200. uart = rt_container_of(serial, struct n32_uart, serial);
  201. ch = -1;
  202. if (uart->uart_device->STS & USART_FLAG_RXDNE)
  203. {
  204. ch = uart->uart_device->DAT & 0xff;
  205. }
  206. return ch;
  207. }
  208. static int n32_uart_flush(struct rt_serial_device *serial)
  209. {
  210. struct n32_uart *uart;
  211. RT_ASSERT(serial != RT_NULL);
  212. uart = rt_container_of(serial, struct n32_uart, serial);
  213. while(!((uart->uart_device->STS & USART_FLAG_TXDE) && (uart->uart_device->STS & USART_FLAG_TXC)));
  214. return 0;
  215. }
  216. static void n32_start_tx(struct rt_serial_device *serial)
  217. {
  218. struct n32_uart *uart;
  219. RT_ASSERT(serial != RT_NULL);
  220. uart = rt_container_of(serial, struct n32_uart, serial);
  221. USART_ConfigInt(uart->uart_device, USART_INT_TXDE, ENABLE);
  222. }
  223. static void n32_stop_tx(struct rt_serial_device *serial)
  224. {
  225. struct n32_uart *uart;
  226. RT_ASSERT(serial != RT_NULL);
  227. uart = rt_container_of(serial, struct n32_uart, serial);
  228. USART_ConfigInt(uart->uart_device, USART_INT_TXDE, DISABLE);
  229. }
  230. #ifdef RT_SERIAL_USING_DMA
  231. static rt_bool_t n32_is_dma_txing(struct rt_serial_device *serial)
  232. {
  233. struct n32_uart *uart;
  234. RT_ASSERT(serial != RT_NULL);
  235. uart = rt_container_of(serial, struct n32_uart, serial);
  236. // return uart->dmaTxing; //RT_FALSE;
  237. return (DMA_GetFlagStatus(uart->dma_tx.dma_flag, uart->dma_tx.dma_module) == SET);
  238. }
  239. static void n32_start_dma_tx(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size)
  240. {
  241. struct n32_uart *uart;
  242. RT_ASSERT(serial != RT_NULL);
  243. uart = rt_container_of(serial, struct n32_uart, serial);
  244. // TODO: 启用 DMA 发送
  245. uart->dma_tx.dma_ch->MADDR = (uint32_t)(buf);
  246. uart->dma_tx.dma_ch->TXNUM = (uint32_t)(size);
  247. DMA_EnableChannel(uart->dma_tx.dma_ch, ENABLE);
  248. uart->dmaTxing = RT_TRUE;
  249. }
  250. static void n32_stop_dma_tx(struct rt_serial_device *serial)
  251. {
  252. struct n32_uart *uart;
  253. RT_ASSERT(serial != RT_NULL);
  254. uart = rt_container_of(serial, struct n32_uart, serial);
  255. // TODO: 禁用 DMA 发送
  256. DMA_EnableChannel(uart->dma_tx.dma_ch, DISABLE);
  257. uart->dmaTxing = RT_FALSE;
  258. }
  259. #endif
  260. static void n32_enable_interrupt(struct rt_serial_device *serial)
  261. {
  262. struct n32_uart *uart;
  263. RT_ASSERT(serial != RT_NULL);
  264. uart = rt_container_of(serial, struct n32_uart, serial);
  265. UART_ENABLE_IRQ(uart->irq);
  266. }
  267. static void n32_disable_interrupt(struct rt_serial_device *serial)
  268. {
  269. struct n32_uart *uart;
  270. RT_ASSERT(serial != RT_NULL);
  271. uart = rt_container_of(serial, struct n32_uart, serial);
  272. UART_DISABLE_IRQ(uart->irq);
  273. }
  274. #ifdef RT_SERIAL_USING_DMA
  275. /**
  276. * DMA receive done process. This need add to DMA receive done ISR.
  277. *
  278. * @param serial serial device
  279. */
  280. static void dma_rx_done_isr(struct rt_serial_device *serial)
  281. {
  282. struct n32_uart *uart;
  283. rt_size_t dma_cnt;
  284. uart = rt_container_of(serial, struct n32_uart, serial);
  285. dma_cnt = RT_SERIAL_DMA_BUFSZ - DMA_GetCurrDataCounter(uart->dma_rx.dma_ch);
  286. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (dma_cnt << 8));
  287. DMA_ClearFlag(uart->dma_rx.dma_flag, uart->dma_rx.dma_module);
  288. DMA_ClrIntPendingBit(uart->dma_rx.dma_flag, uart->dma_rx.dma_module);
  289. }
  290. /**
  291. * DMA transmit done process. This need add to DMA transmit done ISR.
  292. *
  293. * @param serial serial device
  294. */
  295. static void dma_tx_done_isr(struct rt_serial_device *serial)
  296. {
  297. struct n32_uart *uart;
  298. rt_size_t dma_cnt;
  299. uart = rt_container_of(serial, struct n32_uart, serial);
  300. dma_cnt = DMA_GetCurrDataCounter(uart->dma_tx.dma_ch);
  301. if (dma_cnt == 0)
  302. {
  303. rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_TX_DMADONE);
  304. }
  305. DMA_ClrIntPendingBit(uart->dma_tx.dma_flag, uart->dma_rx.dma_module);
  306. }
  307. #endif
  308. /**
  309. * Uart common interrupt process. This need add to uart ISR.
  310. *
  311. * @param serial serial device
  312. */
  313. static void uart_isr(struct rt_serial_device *serial)
  314. {
  315. struct n32_uart *uart;
  316. #ifdef RT_SERIAL_USING_DMA
  317. rt_size_t dma_cnt;
  318. #endif
  319. RT_ASSERT(uart != RT_NULL);
  320. uart = rt_container_of(serial, struct n32_uart, serial);
  321. if(USART_GetIntStatus(uart->uart_device, USART_INT_RXDNE) != RESET)
  322. {
  323. if(USART_GetFlagStatus(uart->uart_device, USART_FLAG_PEF) == RESET)
  324. {
  325. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  326. }
  327. /* clear interrupt */
  328. USART_ClrIntPendingBit(uart->uart_device, USART_INT_RXDNE);
  329. }
  330. if(USART_GetIntStatus(uart->uart_device, USART_INT_TXDE) != RESET)
  331. {
  332. if(USART_GetFlagStatus(uart->uart_device, USART_FLAG_PEF) == RESET)
  333. {
  334. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
  335. }
  336. /* clear interrupt */
  337. USART_ClrIntPendingBit(uart->uart_device, USART_INT_TXDE);
  338. }
  339. #ifdef RT_SERIAL_USING_DMA
  340. if(USART_GetIntStatus(uart->uart_device, USART_INT_IDLEF) != RESET)
  341. {
  342. /* read a data for clear receive idle interrupt flag */
  343. USART_ReceiveData(uart->uart_device);
  344. dma_cnt = RT_SERIAL_DMA_BUFSZ - DMA_GetCurrDataCounter(uart->dma_rx.dma_ch);
  345. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (dma_cnt << 8));
  346. }
  347. #endif
  348. if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_OREF) == SET)
  349. {
  350. n32_uart_getc(serial);
  351. }
  352. }
  353. static const struct rt_uart_ops n32_uart_ops =
  354. {
  355. .configure = n32_uart_configure,
  356. .control = n32_uart_control,
  357. .putc = n32_uart_putc,
  358. .getc = n32_uart_getc,
  359. .flush = n32_uart_flush,
  360. .start_tx = n32_start_tx,
  361. .stop_tx = n32_stop_tx,
  362. #ifdef RT_SERIAL_USING_DMA
  363. .is_dma_txing = n32_is_dma_txing,
  364. .start_dma_tx = n32_start_dma_tx,
  365. .stop_dma_tx = n32_stop_dma_tx,
  366. #endif
  367. .enable_interrupt = n32_enable_interrupt,
  368. .disable_interrupt = n32_disable_interrupt,
  369. };
  370. #if defined(BSP_USING_UART1)
  371. /* UART1 device driver structure */
  372. struct n32_uart uart1 =
  373. {
  374. .uart_device = USART1,
  375. .irq = USART1_IRQn,
  376. #ifdef RT_SERIAL_USING_DMA
  377. .dmaTxing = RT_FALSE,
  378. .dma_rx = {
  379. DMA1_CH5,
  380. DMA1,
  381. DMA1_FLAG_TC5 | DMA1_FLAG_HT5,
  382. DMA1_Channel5_IRQn,
  383. },
  384. .dma_tx = {
  385. DMA1_CH4,
  386. DMA1,
  387. DMA1_FLAG_TC4,
  388. DMA1_Channel4_IRQn,
  389. },
  390. #endif
  391. };
  392. void USART1_IRQHandler(void)
  393. {
  394. /* enter interrupt */
  395. rt_interrupt_enter();
  396. uart_isr(&uart1.serial);
  397. /* leave interrupt */
  398. rt_interrupt_leave();
  399. }
  400. #ifdef RT_SERIAL_USING_DMA
  401. void DMA1_Channel5_IRQHandler(void)
  402. {
  403. /* enter interrupt */
  404. rt_interrupt_enter();
  405. dma_rx_done_isr(&uart1.serial);
  406. /* leave interrupt */
  407. rt_interrupt_leave();
  408. }
  409. void DMA1_Channel4_IRQHandler(void)
  410. {
  411. /* enter interrupt */
  412. rt_interrupt_enter();
  413. dma_tx_done_isr(&uart1.serial);
  414. /* leave interrupt */
  415. rt_interrupt_leave();
  416. }
  417. #endif
  418. #endif /* BSP_USING_UART1 */
  419. #if defined(BSP_USING_UART2)
  420. /* UART2 device driver structure */
  421. struct n32_uart uart2 =
  422. {
  423. .uart_device = USART2,
  424. .irq = USART2_IRQn,
  425. #ifdef RT_SERIAL_USING_DMA
  426. .dmaTxing = RT_FALSE,
  427. .dma_rx = {
  428. DMA1_CH6,
  429. DMA1,
  430. DMA1_FLAG_TC6 | DMA1_FLAG_HT6,
  431. DMA1_Channel6_IRQn,
  432. },
  433. .dma_tx = {
  434. DMA1_CH7,
  435. DMA1,
  436. DMA1_FLAG_TC7,
  437. DMA1_Channel7_IRQn,
  438. },
  439. #endif
  440. };
  441. void USART2_IRQHandler(void)
  442. {
  443. /* enter interrupt */
  444. rt_interrupt_enter();
  445. uart_isr(&uart2.serial);
  446. /* leave interrupt */
  447. rt_interrupt_leave();
  448. }
  449. #ifdef RT_SERIAL_USING_DMA
  450. void DMA1_Channel6_IRQHandler(void)
  451. {
  452. /* enter interrupt */
  453. rt_interrupt_enter();
  454. dma_rx_done_isr(&uart2.serial);
  455. /* leave interrupt */
  456. rt_interrupt_leave();
  457. }
  458. #endif
  459. #endif /* BSP_USING_UART2 */
  460. #if defined(BSP_USING_UART3)
  461. /* UART3 device driver structure */
  462. struct n32_uart uart3 =
  463. {
  464. .uart_device = USART3,
  465. .irq = USART3_IRQn,
  466. #ifdef RT_SERIAL_USING_DMA
  467. .dmaTxing = RT_FALSE,
  468. .dma_rx = {
  469. DMA1_CH3,
  470. DMA1,
  471. DMA1_FLAG_TC3 | DMA1_FLAG_HT3,
  472. DMA1_Channel3_IRQn,
  473. },
  474. .dma_tx = {
  475. DMA1_CH2,
  476. DMA1,
  477. DMA1_FLAG_TC2,
  478. DMA1_Channel2_IRQn,
  479. },
  480. #endif
  481. };
  482. void USART3_IRQHandler(void)
  483. {
  484. /* enter interrupt */
  485. rt_interrupt_enter();
  486. uart_isr(&uart3.serial);
  487. /* leave interrupt */
  488. rt_interrupt_leave();
  489. }
  490. #ifdef RT_SERIAL_USING_DMA
  491. void DMA1_Channel3_IRQHandler(void)
  492. {
  493. /* enter interrupt */
  494. rt_interrupt_enter();
  495. dma_rx_done_isr(&uart3.serial);
  496. /* leave interrupt */
  497. rt_interrupt_leave();
  498. }
  499. #endif
  500. #endif /* BSP_USING_UART3 */
  501. #if defined(BSP_USING_UART4)
  502. /* UART4 device driver structure */
  503. struct n32_uart uart4 =
  504. {
  505. .uart_device = UART4,
  506. .irq = UART4_IRQn,
  507. #ifdef RT_SERIAL_USING_DMA
  508. .dmaTxing = RT_FALSE,
  509. .dma_rx = {
  510. DMA2_CH3,
  511. DMA2,
  512. DMA2_FLAG_TC3 | DMA2_FLAG_HT3,
  513. DMA2_Channel3_IRQn,
  514. },
  515. .dma_tx = {
  516. DMA2_CH5,
  517. DMA2,
  518. DMA2_FLAG_TC5,
  519. DMA2_Channel5_IRQn,
  520. },
  521. #endif
  522. };
  523. void UART4_IRQHandler(void)
  524. {
  525. /* enter interrupt */
  526. rt_interrupt_enter();
  527. uart_isr(&uart4.serial);
  528. /* leave interrupt */
  529. rt_interrupt_leave();
  530. }
  531. #ifdef RT_SERIAL_USING_DMA
  532. void DMA2_Channel3_IRQHandler(void)
  533. {
  534. /* enter interrupt */
  535. rt_interrupt_enter();
  536. dma_rx_done_isr(&uart4.serial);
  537. /* leave interrupt */
  538. rt_interrupt_leave();
  539. }
  540. #endif
  541. #endif /* BSP_USING_UART4 */
  542. static void NVIC_Configuration(struct n32_uart *uart)
  543. {
  544. NVIC_InitType NVIC_InitStructure;
  545. /* Enable the USART1 Interrupt */
  546. NVIC_InitStructure.NVIC_IRQChannel = uart->irq;
  547. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  548. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  549. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  550. NVIC_Init(&NVIC_InitStructure);
  551. }
  552. #ifdef RT_SERIAL_USING_DMA
  553. // TODO: 添加发送 DMA 配置,添加接收 DMA 配置
  554. static void DMA_RX_Configuration(struct rt_serial_device *serial)
  555. {
  556. DMA_InitType DMA_InitStructure;
  557. NVIC_InitType NVIC_InitStructure;
  558. struct n32_uart *uart;
  559. RT_ASSERT(serial != RT_NULL);
  560. uart = rt_container_of(serial, struct n32_uart, serial);
  561. /* enable transmit idle interrupt */
  562. USART_ConfigInt(uart->uart_device, USART_INT_IDLEF, ENABLE);
  563. /* DMA clock enable */
  564. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA1, ENABLE);
  565. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA2, ENABLE);
  566. /* rx dma config */
  567. DMA_InitStructure.PeriphAddr = (uint32_t)&(uart->uart_device->DAT);
  568. DMA_InitStructure.MemAddr = (uint32_t)(serial->serial_dma_rx);
  569. DMA_InitStructure.Direction = DMA_DIR_PERIPH_SRC;
  570. DMA_InitStructure.BufSize = RT_SERIAL_DMA_BUFSZ;
  571. DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
  572. DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
  573. DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE;
  574. DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Byte;
  575. DMA_InitStructure.CircularMode = DMA_MODE_CIRCULAR;
  576. DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
  577. DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
  578. DMA_DeInit(uart->dma_rx.dma_ch);
  579. DMA_Init(uart->dma_rx.dma_ch, &DMA_InitStructure);
  580. DMA_ClearFlag(uart->dma_rx.dma_flag, uart->dma_rx.dma_module);
  581. DMA_ConfigInt(uart->dma_rx.dma_ch, DMA_INT_HTX, ENABLE);
  582. DMA_ConfigInt(uart->dma_rx.dma_ch, DMA_INT_TXC, ENABLE);
  583. USART_EnableDMA(uart->uart_device, USART_DMAREQ_RX, ENABLE);
  584. DMA_EnableChannel(uart->dma_rx.dma_ch, ENABLE);
  585. /* rx dma interrupt config */
  586. NVIC_InitStructure.NVIC_IRQChannel = uart->dma_rx.dma_irq;
  587. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  588. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  589. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  590. NVIC_Init(&NVIC_InitStructure);
  591. }
  592. static void DMA_TX_Configuration(struct rt_serial_device *serial)
  593. {
  594. DMA_InitType DMA_InitStructure;
  595. NVIC_InitType NVIC_InitStructure;
  596. struct n32_uart *uart;
  597. RT_ASSERT(serial != RT_NULL);
  598. uart = rt_container_of(serial, struct n32_uart, serial);
  599. /* enable transmit idle interrupt */
  600. // USART_ConfigInt(uart->uart_device, USART_INT_IDLEF, ENABLE);
  601. /* DMA clock enable */
  602. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA1, ENABLE);
  603. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA2, ENABLE);
  604. /* tx dma config */
  605. DMA_InitStructure.PeriphAddr = (uint32_t)&(uart->uart_device->DAT);
  606. // DMA_InitStructure.MemAddr = (uint32_t)(serial->serial_dma_tx);
  607. DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
  608. // DMA_InitStructure.BufSize = serial->config.bufsz;
  609. DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
  610. DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
  611. DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE;
  612. DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Byte;
  613. DMA_InitStructure.CircularMode = DMA_MODE_NORMAL;
  614. DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
  615. DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
  616. DMA_DeInit(uart->dma_tx.dma_ch);
  617. DMA_Init(uart->dma_tx.dma_ch, &DMA_InitStructure);
  618. DMA_ClearFlag(uart->dma_tx.dma_flag, uart->dma_tx.dma_module);
  619. DMA_ConfigInt(uart->dma_tx.dma_ch, DMA_INT_TXC, ENABLE);
  620. USART_EnableDMA(uart->uart_device, USART_DMAREQ_TX, ENABLE);
  621. // DMA_EnableChannel(uart->dma_tx.dma_ch, ENABLE);
  622. /* rx dma interrupt config */
  623. NVIC_InitStructure.NVIC_IRQChannel = uart->dma_tx.dma_irq;
  624. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  625. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  626. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  627. NVIC_Init(&NVIC_InitStructure);
  628. }
  629. #endif
  630. int rt_hw_usart_init(void)
  631. {
  632. struct n32_uart *uart;
  633. #if defined(BSP_USING_UART1)
  634. uart = &uart1;
  635. uart->serial.ops = &n32_uart_ops;
  636. NVIC_Configuration(uart);
  637. /* register UART1 device */
  638. rt_hw_serial_register(&uart->serial, "uart1",
  639. RT_DEVICE_FLAG_RDWR |
  640. RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX
  641. #ifdef RT_SERIAL_USING_DMA
  642. | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX
  643. #endif
  644. , uart);
  645. #endif /* BSP_USING_UART1 */
  646. #if defined(BSP_USING_UART2)
  647. uart = &uart2;
  648. uart->serial.ops = &n32_uart_ops;
  649. NVIC_Configuration(uart);
  650. /* register UART2 device */
  651. rt_hw_serial_register(&uart->serial, "uart2",
  652. RT_DEVICE_FLAG_RDWR |
  653. RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX
  654. #ifdef RT_SERIAL_USING_DMA
  655. | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX
  656. #endif
  657. , uart);
  658. #endif /* BSP_USING_UART2 */
  659. #if defined(BSP_USING_UART3)
  660. uart = &uart3;
  661. uart->serial.ops = &n32_uart_ops;
  662. NVIC_Configuration(uart);
  663. /* register UART3 device */
  664. rt_hw_serial_register(&uart->serial, "uart3",
  665. RT_DEVICE_FLAG_RDWR |
  666. RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX
  667. #ifdef RT_SERIAL_USING_DMA
  668. | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX
  669. #endif
  670. , uart);
  671. #endif /* BSP_USING_UART3 */
  672. #if defined(BSP_USING_UART4)
  673. uart = &uart4;
  674. uart->serial.ops = &n32_uart_ops;
  675. NVIC_Configuration(uart);
  676. /* register UART4 device */
  677. rt_hw_serial_register(&uart->serial, "uart4",
  678. RT_DEVICE_FLAG_RDWR |
  679. RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX
  680. #ifdef RT_SERIAL_USING_DMA
  681. | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX
  682. #endif
  683. , uart);
  684. #endif /* BSP_USING_UART4 */
  685. return RT_EOK;
  686. }
  687. INIT_BOARD_EXPORT(rt_hw_usart_init);