drv_usart.c 38 KB

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