1
0

drv_usart_v2.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-06-01 KyleChan first version
  9. */
  10. #include "board.h"
  11. #include "drv_usart_v2.h"
  12. #ifdef RT_USING_SERIAL_V2
  13. //#define DRV_DEBUG
  14. #define DBG_TAG "drv.usart"
  15. #ifdef DRV_DEBUG
  16. #define DBG_LVL DBG_LOG
  17. #else
  18. #define DBG_LVL DBG_INFO
  19. #endif /* DRV_DEBUG */
  20. #include <rtdbg.h>
  21. #if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \
  22. !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && \
  23. !defined(BSP_USING_UART7) && !defined(BSP_USING_UART8) && !defined(BSP_USING_LPUART1)
  24. #error "Please define at least one BSP_USING_UARTx"
  25. /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
  26. #endif
  27. #ifdef RT_SERIAL_USING_DMA
  28. static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag);
  29. #endif
  30. enum
  31. {
  32. #ifdef BSP_USING_UART1
  33. UART1_INDEX,
  34. #endif
  35. #ifdef BSP_USING_UART2
  36. UART2_INDEX,
  37. #endif
  38. #ifdef BSP_USING_UART3
  39. UART3_INDEX,
  40. #endif
  41. #ifdef BSP_USING_UART4
  42. UART4_INDEX,
  43. #endif
  44. #ifdef BSP_USING_UART5
  45. UART5_INDEX,
  46. #endif
  47. #ifdef BSP_USING_UART6
  48. UART6_INDEX,
  49. #endif
  50. #ifdef BSP_USING_UART7
  51. UART7_INDEX,
  52. #endif
  53. #ifdef BSP_USING_UART8
  54. UART8_INDEX,
  55. #endif
  56. #ifdef BSP_USING_LPUART1
  57. LPUART1_INDEX,
  58. #endif
  59. };
  60. static struct stm32_uart_config uart_config[] =
  61. {
  62. #ifdef BSP_USING_UART1
  63. UART1_CONFIG,
  64. #endif
  65. #ifdef BSP_USING_UART2
  66. UART2_CONFIG,
  67. #endif
  68. #ifdef BSP_USING_UART3
  69. UART3_CONFIG,
  70. #endif
  71. #ifdef BSP_USING_UART4
  72. UART4_CONFIG,
  73. #endif
  74. #ifdef BSP_USING_UART5
  75. UART5_CONFIG,
  76. #endif
  77. #ifdef BSP_USING_UART6
  78. UART6_CONFIG,
  79. #endif
  80. #ifdef BSP_USING_UART7
  81. UART7_CONFIG,
  82. #endif
  83. #ifdef BSP_USING_UART8
  84. UART8_CONFIG,
  85. #endif
  86. #ifdef BSP_USING_LPUART1
  87. LPUART1_CONFIG,
  88. #endif
  89. };
  90. static struct stm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};
  91. static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  92. {
  93. struct stm32_uart *uart;
  94. RT_ASSERT(serial != RT_NULL);
  95. RT_ASSERT(cfg != RT_NULL);
  96. uart = rt_container_of(serial, struct stm32_uart, serial);
  97. uart->handle.Instance = uart->config->Instance;
  98. uart->handle.Init.BaudRate = cfg->baud_rate;
  99. uart->handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  100. uart->handle.Init.Mode = UART_MODE_TX_RX;
  101. uart->handle.Init.OverSampling = UART_OVERSAMPLING_16;
  102. if(uart->handle.Instance == USART3)
  103. {
  104. uart->handle.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS;
  105. }
  106. switch (cfg->data_bits)
  107. {
  108. case DATA_BITS_8:
  109. if (cfg->parity == PARITY_ODD || cfg->parity == PARITY_EVEN)
  110. uart->handle.Init.WordLength = UART_WORDLENGTH_9B;
  111. else
  112. uart->handle.Init.WordLength = UART_WORDLENGTH_8B;
  113. break;
  114. case DATA_BITS_9:
  115. uart->handle.Init.WordLength = UART_WORDLENGTH_9B;
  116. break;
  117. default:
  118. uart->handle.Init.WordLength = UART_WORDLENGTH_8B;
  119. break;
  120. }
  121. switch (cfg->stop_bits)
  122. {
  123. case STOP_BITS_1:
  124. uart->handle.Init.StopBits = UART_STOPBITS_1;
  125. break;
  126. case STOP_BITS_2:
  127. uart->handle.Init.StopBits = UART_STOPBITS_2;
  128. break;
  129. default:
  130. uart->handle.Init.StopBits = UART_STOPBITS_1;
  131. break;
  132. }
  133. switch (cfg->parity)
  134. {
  135. case PARITY_NONE:
  136. uart->handle.Init.Parity = UART_PARITY_NONE;
  137. break;
  138. case PARITY_ODD:
  139. uart->handle.Init.Parity = UART_PARITY_ODD;
  140. break;
  141. case PARITY_EVEN:
  142. uart->handle.Init.Parity = UART_PARITY_EVEN;
  143. break;
  144. default:
  145. uart->handle.Init.Parity = UART_PARITY_NONE;
  146. break;
  147. }
  148. #ifdef RT_SERIAL_USING_DMA
  149. uart->dma_rx.remaining_cnt = serial->config.rx_bufsz;
  150. #endif
  151. if (HAL_UART_Init(&uart->handle) != HAL_OK)
  152. {
  153. return -RT_ERROR;
  154. }
  155. return RT_EOK;
  156. }
  157. static rt_err_t stm32_control(struct rt_serial_device *serial, int cmd, void *arg)
  158. {
  159. struct stm32_uart *uart;
  160. rt_ubase_t ctrl_arg = (rt_ubase_t)arg;
  161. RT_ASSERT(serial != RT_NULL);
  162. uart = rt_container_of(serial, struct stm32_uart, serial);
  163. if(ctrl_arg & (RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING))
  164. {
  165. if (uart->uart_dma_flag & RT_DEVICE_FLAG_DMA_RX)
  166. ctrl_arg = RT_DEVICE_FLAG_DMA_RX;
  167. else
  168. ctrl_arg = RT_DEVICE_FLAG_INT_RX;
  169. }
  170. else if(ctrl_arg & (RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING))
  171. {
  172. if (uart->uart_dma_flag & RT_DEVICE_FLAG_DMA_TX)
  173. ctrl_arg = RT_DEVICE_FLAG_DMA_TX;
  174. else
  175. ctrl_arg = RT_DEVICE_FLAG_INT_TX;
  176. }
  177. switch (cmd)
  178. {
  179. /* disable interrupt */
  180. case RT_DEVICE_CTRL_CLR_INT:
  181. NVIC_DisableIRQ(uart->config->irq_type);
  182. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX)
  183. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_RXNE);
  184. else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX)
  185. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_TXE);
  186. #ifdef RT_SERIAL_USING_DMA
  187. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX)
  188. {
  189. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_RXNE);
  190. HAL_NVIC_DisableIRQ(uart->config->dma_rx->dma_irq);
  191. if (HAL_DMA_Abort(&(uart->dma_rx.handle)) != HAL_OK)
  192. {
  193. RT_ASSERT(0);
  194. }
  195. if (HAL_DMA_DeInit(&(uart->dma_rx.handle)) != HAL_OK)
  196. {
  197. RT_ASSERT(0);
  198. }
  199. }
  200. else if(ctrl_arg == RT_DEVICE_FLAG_DMA_TX)
  201. {
  202. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_TC);
  203. HAL_NVIC_DisableIRQ(uart->config->dma_tx->dma_irq);
  204. if (HAL_DMA_DeInit(&(uart->dma_tx.handle)) != HAL_OK)
  205. {
  206. RT_ASSERT(0);
  207. }
  208. }
  209. #endif
  210. break;
  211. case RT_DEVICE_CTRL_SET_INT:
  212. HAL_NVIC_SetPriority(uart->config->irq_type, 1, 0);
  213. HAL_NVIC_EnableIRQ(uart->config->irq_type);
  214. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX)
  215. __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_RXNE);
  216. else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX)
  217. __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_TXE);
  218. break;
  219. case RT_DEVICE_CTRL_CONFIG:
  220. if (ctrl_arg & (RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX))
  221. {
  222. #ifdef RT_SERIAL_USING_DMA
  223. stm32_dma_config(serial, ctrl_arg);
  224. #endif
  225. }
  226. else
  227. stm32_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)ctrl_arg);
  228. break;
  229. case RT_DEVICE_CHECK_OPTMODE:
  230. {
  231. if (ctrl_arg & RT_DEVICE_FLAG_DMA_TX)
  232. return RT_SERIAL_TX_BLOCKING_NO_BUFFER;
  233. else
  234. return RT_SERIAL_TX_BLOCKING_BUFFER;
  235. }
  236. case RT_DEVICE_CTRL_CLOSE:
  237. if (HAL_UART_DeInit(&(uart->handle)) != HAL_OK )
  238. {
  239. RT_ASSERT(0)
  240. }
  241. break;
  242. }
  243. return RT_EOK;
  244. }
  245. static int stm32_putc(struct rt_serial_device *serial, char c)
  246. {
  247. struct stm32_uart *uart;
  248. RT_ASSERT(serial != RT_NULL);
  249. uart = rt_container_of(serial, struct stm32_uart, serial);
  250. while (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) == RESET);
  251. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
  252. UART_SET_TDR(&uart->handle, c);
  253. return 1;
  254. }
  255. static int stm32_getc(struct rt_serial_device *serial)
  256. {
  257. int ch;
  258. struct stm32_uart *uart;
  259. RT_ASSERT(serial != RT_NULL);
  260. uart = rt_container_of(serial, struct stm32_uart, serial);
  261. ch = -1;
  262. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET)
  263. ch = UART_GET_RDR(&uart->handle);
  264. return ch;
  265. }
  266. static rt_size_t stm32_transmit(struct rt_serial_device *serial,
  267. rt_uint8_t *buf,
  268. rt_size_t size,
  269. rt_uint32_t tx_flag)
  270. {
  271. struct stm32_uart *uart;
  272. RT_ASSERT(serial != RT_NULL);
  273. RT_ASSERT(buf != RT_NULL);
  274. uart = rt_container_of(serial, struct stm32_uart, serial);
  275. if (uart->uart_dma_flag & RT_DEVICE_FLAG_DMA_TX)
  276. {
  277. HAL_UART_Transmit_DMA(&uart->handle, buf, size);
  278. return size;
  279. }
  280. stm32_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)tx_flag);
  281. return size;
  282. }
  283. #ifdef RT_SERIAL_USING_DMA
  284. static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
  285. {
  286. struct stm32_uart *uart;
  287. rt_base_t level;
  288. rt_size_t recv_len, counter;
  289. RT_ASSERT(serial != RT_NULL);
  290. uart = rt_container_of(serial, struct stm32_uart, serial);
  291. level = rt_hw_interrupt_disable();
  292. recv_len = 0;
  293. counter = __HAL_DMA_GET_COUNTER(&(uart->dma_rx.handle));
  294. switch (isr_flag)
  295. {
  296. case UART_RX_DMA_IT_IDLE_FLAG:
  297. if (counter <= uart->dma_rx.remaining_cnt)
  298. recv_len = uart->dma_rx.remaining_cnt - counter;
  299. else
  300. recv_len = serial->config.rx_bufsz + uart->dma_rx.remaining_cnt - counter;
  301. break;
  302. case UART_RX_DMA_IT_HT_FLAG:
  303. if (counter < uart->dma_rx.remaining_cnt)
  304. recv_len = uart->dma_rx.remaining_cnt - counter;
  305. break;
  306. case UART_RX_DMA_IT_TC_FLAG:
  307. if(counter >= uart->dma_rx.remaining_cnt)
  308. recv_len = serial->config.rx_bufsz + uart->dma_rx.remaining_cnt - counter;
  309. default:
  310. break;
  311. }
  312. if (recv_len)
  313. {
  314. uart->dma_rx.remaining_cnt = counter;
  315. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  316. }
  317. rt_hw_interrupt_enable(level);
  318. }
  319. #endif /* RT_SERIAL_USING_DMA */
  320. /**
  321. * Uart common interrupt process. This need add to uart ISR.
  322. *
  323. * @param serial serial device
  324. */
  325. static void uart_isr(struct rt_serial_device *serial)
  326. {
  327. struct stm32_uart *uart;
  328. RT_ASSERT(serial != RT_NULL);
  329. uart = rt_container_of(serial, struct stm32_uart, serial);
  330. /* If the Read data register is not empty and the RXNE interrupt is enabled (RDR) */
  331. if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&
  332. (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET))
  333. {
  334. struct rt_serial_rx_fifo *rx_fifo;
  335. rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
  336. RT_ASSERT(rx_fifo != RT_NULL);
  337. rt_ringbuffer_putchar(&(rx_fifo->rb), UART_GET_RDR(&uart->handle));
  338. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  339. }
  340. /* If the Transmit data register is empty and the TXE interrupt enable is enabled (TDR)*/
  341. else if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TXE) != RESET) &&
  342. (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_TXE)) != RESET)
  343. {
  344. struct rt_serial_tx_fifo *tx_fifo;
  345. tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
  346. RT_ASSERT(tx_fifo != RT_NULL);
  347. rt_uint8_t put_char = 0;
  348. if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
  349. {
  350. UART_SET_TDR(&uart->handle, put_char);
  351. }
  352. else
  353. {
  354. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_TXE);
  355. __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_TC);
  356. }
  357. }
  358. else if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) &&
  359. (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_TC) != RESET))
  360. {
  361. if (uart->uart_dma_flag & RT_DEVICE_FLAG_DMA_TX)
  362. {
  363. /* The HAL_UART_TxCpltCallback will be triggered */
  364. HAL_UART_IRQHandler(&(uart->handle));
  365. }
  366. else
  367. {
  368. /* Transmission complete interrupt disable ( CR1 Register) */
  369. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_TC);
  370. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
  371. }
  372. /* Clear Transmission complete interrupt flag ( ISR Register ) */
  373. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
  374. }
  375. #ifdef RT_SERIAL_USING_DMA
  376. else if ((uart->uart_dma_flag) && (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_IDLE) != RESET)
  377. && (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_IDLE) != RESET))
  378. {
  379. dma_recv_isr(serial, UART_RX_DMA_IT_IDLE_FLAG);
  380. __HAL_UART_CLEAR_IDLEFLAG(&uart->handle);
  381. }
  382. #endif
  383. else
  384. {
  385. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_ORE) != RESET)
  386. {
  387. LOG_E("(%s) serial device Overrun error!", serial->parent.parent.name);
  388. __HAL_UART_CLEAR_OREFLAG(&uart->handle);
  389. }
  390. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_NE) != RESET)
  391. {
  392. __HAL_UART_CLEAR_NEFLAG(&uart->handle);
  393. }
  394. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_FE) != RESET)
  395. {
  396. __HAL_UART_CLEAR_FEFLAG(&uart->handle);
  397. }
  398. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_PE) != RESET)
  399. {
  400. __HAL_UART_CLEAR_PEFLAG(&uart->handle);
  401. }
  402. #if !defined(SOC_SERIES_STM32L4) && !defined(SOC_SERIES_STM32WL) && !defined(SOC_SERIES_STM32F7) && !defined(SOC_SERIES_STM32F0) \
  403. && !defined(SOC_SERIES_STM32L0) && !defined(SOC_SERIES_STM32G0) && !defined(SOC_SERIES_STM32H7) \
  404. && !defined(SOC_SERIES_STM32G4) && !defined(SOC_SERIES_STM32MP1) && !defined(SOC_SERIES_STM32WB)
  405. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_LBD) != RESET)
  406. {
  407. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_LBD);
  408. }
  409. #endif
  410. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_CTS) != RESET)
  411. {
  412. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_CTS);
  413. }
  414. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TXE) != RESET)
  415. {
  416. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TXE);
  417. }
  418. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) != RESET)
  419. {
  420. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
  421. }
  422. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET)
  423. {
  424. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_RXNE);
  425. }
  426. }
  427. }
  428. #if defined(BSP_USING_UART1)
  429. void USART1_IRQHandler(void)
  430. {
  431. /* enter interrupt */
  432. rt_interrupt_enter();
  433. uart_isr(&(uart_obj[UART1_INDEX].serial));
  434. /* leave interrupt */
  435. rt_interrupt_leave();
  436. }
  437. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA)
  438. void UART1_DMA_RX_IRQHandler(void)
  439. {
  440. /* enter interrupt */
  441. rt_interrupt_enter();
  442. HAL_DMA_IRQHandler(&uart_obj[UART1_INDEX].dma_rx.handle);
  443. /* leave interrupt */
  444. rt_interrupt_leave();
  445. }
  446. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) */
  447. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA)
  448. void UART1_DMA_TX_IRQHandler(void)
  449. {
  450. /* enter interrupt */
  451. rt_interrupt_enter();
  452. HAL_DMA_IRQHandler(&uart_obj[UART1_INDEX].dma_tx.handle);
  453. /* leave interrupt */
  454. rt_interrupt_leave();
  455. }
  456. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA) */
  457. #endif /* BSP_USING_UART1 */
  458. #if defined(BSP_USING_UART2)
  459. void USART2_IRQHandler(void)
  460. {
  461. /* enter interrupt */
  462. rt_interrupt_enter();
  463. uart_isr(&(uart_obj[UART2_INDEX].serial));
  464. /* leave interrupt */
  465. rt_interrupt_leave();
  466. }
  467. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA)
  468. void UART2_DMA_RX_IRQHandler(void)
  469. {
  470. /* enter interrupt */
  471. rt_interrupt_enter();
  472. HAL_DMA_IRQHandler(&uart_obj[UART2_INDEX].dma_rx.handle);
  473. /* leave interrupt */
  474. rt_interrupt_leave();
  475. }
  476. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) */
  477. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA)
  478. void UART2_DMA_TX_IRQHandler(void)
  479. {
  480. /* enter interrupt */
  481. rt_interrupt_enter();
  482. HAL_DMA_IRQHandler(&uart_obj[UART2_INDEX].dma_tx.handle);
  483. /* leave interrupt */
  484. rt_interrupt_leave();
  485. }
  486. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA) */
  487. #endif /* BSP_USING_UART2 */
  488. #if defined(BSP_USING_UART3)
  489. void USART3_IRQHandler(void)
  490. {
  491. /* enter interrupt */
  492. rt_interrupt_enter();
  493. uart_isr(&(uart_obj[UART3_INDEX].serial));
  494. /* leave interrupt */
  495. rt_interrupt_leave();
  496. }
  497. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA)
  498. void UART3_DMA_RX_IRQHandler(void)
  499. {
  500. /* enter interrupt */
  501. rt_interrupt_enter();
  502. HAL_DMA_IRQHandler(&uart_obj[UART3_INDEX].dma_rx.handle);
  503. /* leave interrupt */
  504. rt_interrupt_leave();
  505. }
  506. #endif /* defined(BSP_UART_USING_DMA_RX) && defined(BSP_UART3_RX_USING_DMA) */
  507. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA)
  508. void UART3_DMA_TX_IRQHandler(void)
  509. {
  510. /* enter interrupt */
  511. rt_interrupt_enter();
  512. HAL_DMA_IRQHandler(&uart_obj[UART3_INDEX].dma_tx.handle);
  513. /* leave interrupt */
  514. rt_interrupt_leave();
  515. }
  516. #endif /* defined(BSP_UART_USING_DMA_TX) && defined(BSP_UART3_TX_USING_DMA) */
  517. #endif /* BSP_USING_UART3*/
  518. #if defined(BSP_USING_UART4)
  519. void UART4_IRQHandler(void)
  520. {
  521. /* enter interrupt */
  522. rt_interrupt_enter();
  523. uart_isr(&(uart_obj[UART4_INDEX].serial));
  524. /* leave interrupt */
  525. rt_interrupt_leave();
  526. }
  527. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA)
  528. void UART4_DMA_RX_IRQHandler(void)
  529. {
  530. /* enter interrupt */
  531. rt_interrupt_enter();
  532. HAL_DMA_IRQHandler(&uart_obj[UART4_INDEX].dma_rx.handle);
  533. /* leave interrupt */
  534. rt_interrupt_leave();
  535. }
  536. #endif /* defined(BSP_UART_USING_DMA_RX) && defined(BSP_UART4_RX_USING_DMA) */
  537. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_TX_USING_DMA)
  538. void UART4_DMA_TX_IRQHandler(void)
  539. {
  540. /* enter interrupt */
  541. rt_interrupt_enter();
  542. HAL_DMA_IRQHandler(&uart_obj[UART4_INDEX].dma_tx.handle);
  543. /* leave interrupt */
  544. rt_interrupt_leave();
  545. }
  546. #endif /* defined(BSP_UART_USING_DMA_TX) && defined(BSP_UART4_TX_USING_DMA) */
  547. #endif /* BSP_USING_UART4*/
  548. #if defined(BSP_USING_UART5)
  549. void UART5_IRQHandler(void)
  550. {
  551. /* enter interrupt */
  552. rt_interrupt_enter();
  553. uart_isr(&(uart_obj[UART5_INDEX].serial));
  554. /* leave interrupt */
  555. rt_interrupt_leave();
  556. }
  557. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA)
  558. void UART5_DMA_RX_IRQHandler(void)
  559. {
  560. /* enter interrupt */
  561. rt_interrupt_enter();
  562. HAL_DMA_IRQHandler(&uart_obj[UART5_INDEX].dma_rx.handle);
  563. /* leave interrupt */
  564. rt_interrupt_leave();
  565. }
  566. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) */
  567. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA)
  568. void UART5_DMA_TX_IRQHandler(void)
  569. {
  570. /* enter interrupt */
  571. rt_interrupt_enter();
  572. HAL_DMA_IRQHandler(&uart_obj[UART5_INDEX].dma_tx.handle);
  573. /* leave interrupt */
  574. rt_interrupt_leave();
  575. }
  576. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA) */
  577. #endif /* BSP_USING_UART5*/
  578. #if defined(BSP_USING_UART6)
  579. void USART6_IRQHandler(void)
  580. {
  581. /* enter interrupt */
  582. rt_interrupt_enter();
  583. uart_isr(&(uart_obj[UART6_INDEX].serial));
  584. /* leave interrupt */
  585. rt_interrupt_leave();
  586. }
  587. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA)
  588. void UART6_DMA_RX_IRQHandler(void)
  589. {
  590. /* enter interrupt */
  591. rt_interrupt_enter();
  592. HAL_DMA_IRQHandler(&uart_obj[UART6_INDEX].dma_rx.handle);
  593. /* leave interrupt */
  594. rt_interrupt_leave();
  595. }
  596. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA) */
  597. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA)
  598. void UART6_DMA_TX_IRQHandler(void)
  599. {
  600. /* enter interrupt */
  601. rt_interrupt_enter();
  602. HAL_DMA_IRQHandler(&uart_obj[UART6_INDEX].dma_tx.handle);
  603. /* leave interrupt */
  604. rt_interrupt_leave();
  605. }
  606. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA) */
  607. #endif /* BSP_USING_UART6*/
  608. #if defined(BSP_USING_UART7)
  609. void UART7_IRQHandler(void)
  610. {
  611. /* enter interrupt */
  612. rt_interrupt_enter();
  613. uart_isr(&(uart_obj[UART7_INDEX].serial));
  614. /* leave interrupt */
  615. rt_interrupt_leave();
  616. }
  617. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA)
  618. void UART7_DMA_RX_IRQHandler(void)
  619. {
  620. /* enter interrupt */
  621. rt_interrupt_enter();
  622. HAL_DMA_IRQHandler(&uart_obj[UART7_INDEX].dma_rx.handle);
  623. /* leave interrupt */
  624. rt_interrupt_leave();
  625. }
  626. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA) */
  627. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA)
  628. void UART7_DMA_TX_IRQHandler(void)
  629. {
  630. /* enter interrupt */
  631. rt_interrupt_enter();
  632. HAL_DMA_IRQHandler(&uart_obj[UART7_INDEX].dma_tx.handle);
  633. /* leave interrupt */
  634. rt_interrupt_leave();
  635. }
  636. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA) */
  637. #endif /* BSP_USING_UART7*/
  638. #if defined(BSP_USING_UART8)
  639. void UART8_IRQHandler(void)
  640. {
  641. /* enter interrupt */
  642. rt_interrupt_enter();
  643. uart_isr(&(uart_obj[UART8_INDEX].serial));
  644. /* leave interrupt */
  645. rt_interrupt_leave();
  646. }
  647. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA)
  648. void UART8_DMA_RX_IRQHandler(void)
  649. {
  650. /* enter interrupt */
  651. rt_interrupt_enter();
  652. HAL_DMA_IRQHandler(&uart_obj[UART8_INDEX].dma_rx.handle);
  653. /* leave interrupt */
  654. rt_interrupt_leave();
  655. }
  656. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA) */
  657. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA)
  658. void UART8_DMA_TX_IRQHandler(void)
  659. {
  660. /* enter interrupt */
  661. rt_interrupt_enter();
  662. HAL_DMA_IRQHandler(&uart_obj[UART8_INDEX].dma_tx.handle);
  663. /* leave interrupt */
  664. rt_interrupt_leave();
  665. }
  666. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA) */
  667. #endif /* BSP_USING_UART8*/
  668. #if defined(BSP_USING_LPUART1)
  669. void LPUART1_IRQHandler(void)
  670. {
  671. /* enter interrupt */
  672. rt_interrupt_enter();
  673. uart_isr(&(uart_obj[LPUART1_INDEX].serial));
  674. /* leave interrupt */
  675. rt_interrupt_leave();
  676. }
  677. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_LPUART1_RX_USING_DMA)
  678. void LPUART1_DMA_RX_IRQHandler(void)
  679. {
  680. /* enter interrupt */
  681. rt_interrupt_enter();
  682. HAL_DMA_IRQHandler(&uart_obj[LPUART1_INDEX].dma_rx.handle);
  683. /* leave interrupt */
  684. rt_interrupt_leave();
  685. }
  686. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_LPUART1_RX_USING_DMA) */
  687. #endif /* BSP_USING_LPUART1*/
  688. static void stm32_uart_get_config(void)
  689. {
  690. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  691. #ifdef BSP_USING_UART1
  692. uart_obj[UART1_INDEX].serial.config = config;
  693. uart_obj[UART1_INDEX].uart_dma_flag = 0;
  694. uart_obj[UART1_INDEX].serial.config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
  695. uart_obj[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
  696. #ifdef BSP_UART1_RX_USING_DMA
  697. uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  698. static struct dma_config uart1_dma_rx = UART1_DMA_RX_CONFIG;
  699. uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx;
  700. #endif
  701. #ifdef BSP_UART1_TX_USING_DMA
  702. uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  703. static struct dma_config uart1_dma_tx = UART1_DMA_TX_CONFIG;
  704. uart_config[UART1_INDEX].dma_tx = &uart1_dma_tx;
  705. #endif
  706. #endif
  707. #ifdef BSP_USING_UART2
  708. uart_obj[UART2_INDEX].serial.config = config;
  709. uart_obj[UART2_INDEX].uart_dma_flag = 0;
  710. uart_obj[UART2_INDEX].serial.config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
  711. uart_obj[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
  712. #ifdef BSP_UART2_RX_USING_DMA
  713. uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  714. static struct dma_config uart2_dma_rx = UART2_DMA_RX_CONFIG;
  715. uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx;
  716. #endif
  717. #ifdef BSP_UART2_TX_USING_DMA
  718. uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  719. static struct dma_config uart2_dma_tx = UART2_DMA_TX_CONFIG;
  720. uart_config[UART2_INDEX].dma_tx = &uart2_dma_tx;
  721. #endif
  722. #endif
  723. #ifdef BSP_USING_UART3
  724. uart_obj[UART3_INDEX].serial.config = config;
  725. uart_obj[UART3_INDEX].uart_dma_flag = 0;
  726. uart_obj[UART3_INDEX].serial.config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
  727. uart_obj[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
  728. #ifdef BSP_UART3_RX_USING_DMA
  729. uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  730. static struct dma_config uart3_dma_rx = UART3_DMA_RX_CONFIG;
  731. uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx;
  732. #endif
  733. #ifdef BSP_UART3_TX_USING_DMA
  734. uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  735. static struct dma_config uart3_dma_tx = UART3_DMA_TX_CONFIG;
  736. uart_config[UART3_INDEX].dma_tx = &uart3_dma_tx;
  737. #endif
  738. #endif
  739. #ifdef BSP_USING_UART4
  740. uart_obj[UART4_INDEX].serial.config = config;
  741. uart_obj[UART4_INDEX].uart_dma_flag = 0;
  742. uart_obj[UART4_INDEX].serial.config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
  743. uart_obj[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
  744. #ifdef BSP_UART4_RX_USING_DMA
  745. uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  746. static struct dma_config uart4_dma_rx = UART4_DMA_RX_CONFIG;
  747. uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx;
  748. #endif
  749. #ifdef BSP_UART4_TX_USING_DMA
  750. uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  751. static struct dma_config uart4_dma_tx = UART4_DMA_TX_CONFIG;
  752. uart_config[UART4_INDEX].dma_tx = &uart4_dma_tx;
  753. #endif
  754. #endif
  755. }
  756. #ifdef RT_SERIAL_USING_DMA
  757. static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
  758. {
  759. struct rt_serial_rx_fifo *rx_fifo;
  760. DMA_HandleTypeDef *DMA_Handle;
  761. struct dma_config *dma_config;
  762. struct stm32_uart *uart;
  763. RT_ASSERT(serial != RT_NULL);
  764. uart = rt_container_of(serial, struct stm32_uart, serial);
  765. if (RT_DEVICE_FLAG_DMA_RX == flag)
  766. {
  767. DMA_Handle = &uart->dma_rx.handle;
  768. dma_config = uart->config->dma_rx;
  769. }
  770. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  771. {
  772. DMA_Handle = &uart->dma_tx.handle;
  773. dma_config = uart->config->dma_tx;
  774. }
  775. LOG_D("%s dma config start", uart->config->name);
  776. {
  777. rt_uint32_t tmpreg = 0x00U;
  778. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) \
  779. || defined(SOC_SERIES_STM32L0)
  780. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  781. SET_BIT(RCC->AHBENR, dma_config->dma_rcc);
  782. tmpreg = READ_BIT(RCC->AHBENR, dma_config->dma_rcc);
  783. #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WL) \
  784. || defined(SOC_SERIES_STM32G4)|| defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32WB)
  785. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  786. SET_BIT(RCC->AHB1ENR, dma_config->dma_rcc);
  787. tmpreg = READ_BIT(RCC->AHB1ENR, dma_config->dma_rcc);
  788. #elif defined(SOC_SERIES_STM32MP1)
  789. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  790. SET_BIT(RCC->MP_AHB2ENSETR, dma_config->dma_rcc);
  791. tmpreg = READ_BIT(RCC->MP_AHB2ENSETR, dma_config->dma_rcc);
  792. #endif
  793. #if defined(DMAMUX1) && (defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WL) || defined(SOC_SERIES_STM32G4) || defined(SOC_SERIES_STM32WB))
  794. /* enable DMAMUX clock for L4+ and G4 */
  795. __HAL_RCC_DMAMUX1_CLK_ENABLE();
  796. #elif defined(SOC_SERIES_STM32MP1)
  797. __HAL_RCC_DMAMUX_CLK_ENABLE();
  798. #endif
  799. UNUSED(tmpreg); /* To avoid compiler warnings */
  800. }
  801. if (RT_DEVICE_FLAG_DMA_RX == flag)
  802. {
  803. __HAL_LINKDMA(&(uart->handle), hdmarx, uart->dma_rx.handle);
  804. }
  805. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  806. {
  807. __HAL_LINKDMA(&(uart->handle), hdmatx, uart->dma_tx.handle);
  808. }
  809. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0)
  810. DMA_Handle->Instance = dma_config->Instance;
  811. #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  812. DMA_Handle->Instance = dma_config->Instance;
  813. DMA_Handle->Init.Channel = dma_config->channel;
  814. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WL) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4) || defined(SOC_SERIES_STM32WB)\
  815. || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32MP1)
  816. DMA_Handle->Instance = dma_config->Instance;
  817. DMA_Handle->Init.Request = dma_config->request;
  818. #endif
  819. DMA_Handle->Init.PeriphInc = DMA_PINC_DISABLE;
  820. DMA_Handle->Init.MemInc = DMA_MINC_ENABLE;
  821. DMA_Handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  822. DMA_Handle->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  823. if (RT_DEVICE_FLAG_DMA_RX == flag)
  824. {
  825. DMA_Handle->Init.Direction = DMA_PERIPH_TO_MEMORY;
  826. DMA_Handle->Init.Mode = DMA_CIRCULAR;
  827. }
  828. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  829. {
  830. DMA_Handle->Init.Direction = DMA_MEMORY_TO_PERIPH;
  831. DMA_Handle->Init.Mode = DMA_NORMAL;
  832. }
  833. DMA_Handle->Init.Priority = DMA_PRIORITY_MEDIUM;
  834. #if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32MP1)
  835. DMA_Handle->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  836. #endif
  837. if (HAL_DMA_DeInit(DMA_Handle) != HAL_OK)
  838. {
  839. RT_ASSERT(0);
  840. }
  841. if (HAL_DMA_Init(DMA_Handle) != HAL_OK)
  842. {
  843. RT_ASSERT(0);
  844. }
  845. /* enable interrupt */
  846. if (flag == RT_DEVICE_FLAG_DMA_RX)
  847. {
  848. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  849. RT_ASSERT(rx_fifo != RT_NULL);
  850. /* Start DMA transfer */
  851. if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.rx_bufsz) != HAL_OK)
  852. {
  853. /* Transfer error in reception process */
  854. RT_ASSERT(0);
  855. }
  856. CLEAR_BIT(uart->handle.Instance->CR3, USART_CR3_EIE);
  857. __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE);
  858. }
  859. /* DMA irq should set in DMA TX mode, or HAL_UART_TxCpltCallback function will not be called */
  860. HAL_NVIC_SetPriority(dma_config->dma_irq, 0, 0);
  861. HAL_NVIC_EnableIRQ(dma_config->dma_irq);
  862. HAL_NVIC_SetPriority(uart->config->irq_type, 1, 0);
  863. HAL_NVIC_EnableIRQ(uart->config->irq_type);
  864. LOG_D("%s dma %s instance: %x", uart->config->name, flag == RT_DEVICE_FLAG_DMA_RX ? "RX" : "TX", DMA_Handle->Instance);
  865. LOG_D("%s dma config done", uart->config->name);
  866. }
  867. /**
  868. * @brief UART error callbacks
  869. * @param huart: UART handle
  870. * @note This example shows a simple way to report transfer error, and you can
  871. * add your own implementation.
  872. * @retval None
  873. */
  874. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  875. {
  876. RT_ASSERT(huart != NULL);
  877. struct stm32_uart *uart = (struct stm32_uart *)huart;
  878. LOG_D("%s: %s %d\n", __FUNCTION__, uart->config->name, huart->ErrorCode);
  879. UNUSED(uart);
  880. }
  881. /**
  882. * @brief Rx Transfer completed callback
  883. * @param huart: UART handle
  884. * @note This example shows a simple way to report end of DMA Rx transfer, and
  885. * you can add your own implementation.
  886. * @retval None
  887. */
  888. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  889. {
  890. struct stm32_uart *uart;
  891. RT_ASSERT(huart != NULL);
  892. uart = (struct stm32_uart *)huart;
  893. dma_recv_isr(&uart->serial, UART_RX_DMA_IT_TC_FLAG);
  894. }
  895. /**
  896. * @brief Rx Half transfer completed callback
  897. * @param huart: UART handle
  898. * @note This example shows a simple way to report end of DMA Rx Half transfer,
  899. * and you can add your own implementation.
  900. * @retval None
  901. */
  902. void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
  903. {
  904. struct stm32_uart *uart;
  905. RT_ASSERT(huart != NULL);
  906. uart = (struct stm32_uart *)huart;
  907. dma_recv_isr(&uart->serial, UART_RX_DMA_IT_HT_FLAG);
  908. }
  909. /**
  910. * @brief HAL_UART_TxCpltCallback
  911. * @param huart: UART handle
  912. * @note This callback can be called by two functions, first in UART_EndTransmit_IT when
  913. * UART Tx complete and second in UART_DMATransmitCplt function in DMA Circular mode.
  914. * @retval None
  915. */
  916. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  917. {
  918. struct stm32_uart *uart;
  919. struct rt_serial_device *serial;
  920. rt_size_t trans_total_index;
  921. rt_base_t level;
  922. RT_ASSERT(huart != NULL);
  923. uart = (struct stm32_uart *)huart;
  924. serial = &uart->serial;
  925. RT_ASSERT(serial != RT_NULL);
  926. level = rt_hw_interrupt_disable();
  927. trans_total_index = __HAL_DMA_GET_COUNTER(&(uart->dma_tx.handle));
  928. rt_hw_interrupt_enable(level);
  929. if (trans_total_index) return;
  930. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
  931. }
  932. #endif /* RT_SERIAL_USING_DMA */
  933. static const struct rt_uart_ops stm32_uart_ops =
  934. {
  935. .configure = stm32_configure,
  936. .control = stm32_control,
  937. .putc = stm32_putc,
  938. .getc = stm32_getc,
  939. .transmit = stm32_transmit
  940. };
  941. int rt_hw_usart_init(void)
  942. {
  943. rt_err_t result = 0;
  944. rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);
  945. stm32_uart_get_config();
  946. for (int i = 0; i < obj_num; i++)
  947. {
  948. /* init UART object */
  949. uart_obj[i].config = &uart_config[i];
  950. uart_obj[i].serial.ops = &stm32_uart_ops;
  951. /* register UART device */
  952. result = rt_hw_serial_register(&uart_obj[i].serial,
  953. uart_obj[i].config->name,
  954. RT_DEVICE_FLAG_RDWR,
  955. NULL);
  956. RT_ASSERT(result == RT_EOK);
  957. }
  958. return result;
  959. }
  960. #endif /* RT_USING_SERIAL_V2 */