drv_usart.c 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399
  1. /*
  2. * Copyright (c) 2006-2018, 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-05-18 chenyaxing modify usart3 remap check
  10. */
  11. #include "string.h"
  12. #include "stdlib.h"
  13. #include "drv_common.h"
  14. #include "uart_config.h"
  15. #include "board.h"
  16. #ifdef RT_USING_SERIAL
  17. #include <rtdevice.h>
  18. #if (defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32H7)) && defined(RT_SERIAL_USING_DMA)
  19. #error "The STM32L0 and STM32H7 devices DO NOT support UART DMA feature."
  20. #elif defined(RT_SERIAL_USING_DMA)
  21. #include "dma_config.h"
  22. #endif
  23. //#define DRV_DEBUG
  24. #define DBG_TAG "drv.usart"
  25. #ifdef DRV_DEBUG
  26. #define DBG_LVL DBG_LOG
  27. #else
  28. #define DBG_LVL DBG_INFO
  29. #endif /* DRV_DEBUG */
  30. #include <rtdbg.h>
  31. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) \
  32. || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32L1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4)
  33. #define DMA_INSTANCE_TYPE DMA_Channel_TypeDef
  34. #elif defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32H7)
  35. #define DMA_INSTANCE_TYPE DMA_Stream_TypeDef
  36. #endif /* defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) */
  37. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F2) \
  38. || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32L1) \
  39. || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4)
  40. #define UART_INSTANCE_CLEAR_FUNCTION __HAL_UART_CLEAR_FLAG
  41. #elif defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7)
  42. #define UART_INSTANCE_CLEAR_FUNCTION __HAL_UART_CLEAR_IT
  43. #endif
  44. #ifdef RT_SERIAL_USING_DMA
  45. /* -------------------------- DMA config -------------------------- */
  46. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L0) \
  47. || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4)
  48. #define DMA_INSTANCE_TYPE DMA_Channel_TypeDef
  49. #elif defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)\
  50. || defined(SOC_SERIES_STM32H7)
  51. #define DMA_INSTANCE_TYPE DMA_Stream_TypeDef
  52. #endif /* defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) */
  53. struct dma_config {
  54. DMA_INSTANCE_TYPE *Instance;
  55. rt_uint32_t dma_rcc;
  56. IRQn_Type dma_irq;
  57. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  58. rt_uint32_t channel;
  59. #endif
  60. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4)
  61. rt_uint32_t request;
  62. #endif
  63. };
  64. #endif
  65. /* stm32 config class */
  66. struct stm32_uart_config
  67. {
  68. const char *name;
  69. USART_TypeDef *Instance;
  70. IRQn_Type irq_type;
  71. #ifdef RT_SERIAL_USING_DMA
  72. struct dma_config *dma_rx;
  73. struct dma_config *dma_tx;
  74. #endif
  75. const char *tx_pin_name;
  76. const char *rx_pin_name;
  77. };
  78. /* stm32 uart dirver class */
  79. struct stm32_uart
  80. {
  81. UART_HandleTypeDef handle;
  82. struct stm32_uart_config *config;
  83. #ifdef RT_SERIAL_USING_DMA
  84. struct
  85. {
  86. DMA_HandleTypeDef handle;
  87. rt_size_t last_index;
  88. } dma_rx;
  89. struct
  90. {
  91. DMA_HandleTypeDef handle;
  92. } dma_tx;
  93. #endif
  94. rt_uint16_t uart_dma_flag;
  95. struct rt_serial_device serial;
  96. };
  97. #if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \
  98. !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && \
  99. !defined(BSP_USING_UART7) && !defined(BSP_USING_UART8) && !defined(BSP_USING_LPUART1)
  100. #error "Please define at least one BSP_USING_UARTx"
  101. /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
  102. #endif
  103. #ifdef RT_SERIAL_USING_DMA
  104. static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag);
  105. #endif
  106. enum
  107. {
  108. #ifdef BSP_USING_UART1
  109. UART1_INDEX,
  110. #endif
  111. #ifdef BSP_USING_UART2
  112. UART2_INDEX,
  113. #endif
  114. #ifdef BSP_USING_UART3
  115. UART3_INDEX,
  116. #endif
  117. #ifdef BSP_USING_UART4
  118. UART4_INDEX,
  119. #endif
  120. #ifdef BSP_USING_UART5
  121. UART5_INDEX,
  122. #endif
  123. #ifdef BSP_USING_UART6
  124. UART6_INDEX,
  125. #endif
  126. #ifdef BSP_USING_UART7
  127. UART7_INDEX,
  128. #endif
  129. #ifdef BSP_USING_UART8
  130. UART8_INDEX,
  131. #endif
  132. #ifdef BSP_USING_LPUART1
  133. LPUART1_INDEX,
  134. #endif
  135. };
  136. static struct stm32_uart_config uart_config[] =
  137. {
  138. #ifdef BSP_USING_UART1
  139. UART1_CONFIG,
  140. #endif
  141. #ifdef BSP_USING_UART2
  142. UART2_CONFIG,
  143. #endif
  144. #ifdef BSP_USING_UART3
  145. UART3_CONFIG,
  146. #endif
  147. #ifdef BSP_USING_UART4
  148. UART4_CONFIG,
  149. #endif
  150. #ifdef BSP_USING_UART5
  151. UART5_CONFIG,
  152. #endif
  153. #ifdef BSP_USING_UART6
  154. UART6_CONFIG,
  155. #endif
  156. #ifdef BSP_USING_UART7
  157. UART7_CONFIG,
  158. #endif
  159. #ifdef BSP_USING_UART8
  160. UART8_CONFIG,
  161. #endif
  162. #ifdef BSP_USING_LPUART1
  163. LPUART1_CONFIG,
  164. #endif
  165. };
  166. static rt_err_t stm32_uart_clk_enable(struct stm32_uart_config *config)
  167. {
  168. /* uart clock enable */
  169. switch ((uint32_t)config->Instance)
  170. {
  171. #ifdef BSP_USING_UART1
  172. case (uint32_t)USART1:
  173. __HAL_RCC_USART1_CLK_ENABLE();
  174. break;
  175. #endif /* BSP_USING_UART1 */
  176. #ifdef BSP_USING_UART2
  177. case (uint32_t)USART2:
  178. __HAL_RCC_USART2_CLK_ENABLE();
  179. break;
  180. #endif /* BSP_USING_UART2 */
  181. #ifdef BSP_USING_UART3
  182. case (uint32_t)USART3:
  183. __HAL_RCC_USART3_CLK_ENABLE();
  184. break;
  185. #endif /* BSP_USING_UART3 */
  186. #ifdef BSP_USING_UART4
  187. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0) || \
  188. defined(SOC_SERIES_STM32G0)
  189. case (uint32_t)USART4:
  190. __HAL_RCC_USART4_CLK_ENABLE();
  191. #else
  192. case (uint32_t)UART4:
  193. __HAL_RCC_UART4_CLK_ENABLE();
  194. #endif
  195. break;
  196. #endif /* BSP_USING_UART4 */
  197. #ifdef BSP_USING_UART5
  198. #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0) || \
  199. defined(SOC_SERIES_STM32G0)
  200. case (uint32_t)USART5:
  201. __HAL_RCC_USART5_CLK_ENABLE();
  202. #else
  203. case (uint32_t)UART5:
  204. __HAL_RCC_UART5_CLK_ENABLE();
  205. #endif
  206. break;
  207. #endif /* BSP_USING_UART5 */
  208. #ifdef BSP_USING_UART6
  209. case (uint32_t)USART6:
  210. __HAL_RCC_USART6_CLK_ENABLE();
  211. break;
  212. #endif /* BSP_USING_UART6 */
  213. #ifdef BSP_USING_UART7
  214. #if defined(SOC_SERIES_STM32F0)
  215. case (uint32_t)USART7:
  216. __HAL_RCC_USART7_CLK_ENABLE();
  217. #else
  218. case (uint32_t)UART7:
  219. __HAL_RCC_UART7_CLK_ENABLE();
  220. #endif
  221. break;
  222. #endif /* BSP_USING_UART7 */
  223. #ifdef BSP_USING_UART8
  224. #if defined(SOC_SERIES_STM32F0)
  225. case (uint32_t)USART8:
  226. __HAL_RCC_USART8_CLK_ENABLE();
  227. #else
  228. case (uint32_t)UART8:
  229. __HAL_RCC_UART8_CLK_ENABLE();
  230. #endif
  231. break;
  232. #endif /* BSP_USING_UART8 */
  233. #ifdef BSP_USING_LPUART1
  234. case (uint32_t)LPUART1:
  235. __HAL_RCC_LPUART1_CLK_ENABLE();
  236. break;
  237. #endif /* BSP_USING_LPUART1 */
  238. default:
  239. return -RT_ERROR;
  240. }
  241. return RT_EOK;
  242. }
  243. static rt_err_t stm32_gpio_clk_enable(GPIO_TypeDef *gpiox)
  244. {
  245. /* check the parameters */
  246. RT_ASSERT(IS_GPIO_ALL_INSTANCE(gpiox));
  247. /* gpio ports clock enable */
  248. switch ((uint32_t)gpiox)
  249. {
  250. #if defined(__HAL_RCC_GPIOA_CLK_ENABLE)
  251. case (uint32_t)GPIOA:
  252. __HAL_RCC_GPIOA_CLK_ENABLE();
  253. break;
  254. #endif
  255. #if defined(__HAL_RCC_GPIOB_CLK_ENABLE)
  256. case (uint32_t)GPIOB:
  257. __HAL_RCC_GPIOB_CLK_ENABLE();
  258. break;
  259. #endif
  260. #if defined(__HAL_RCC_GPIOC_CLK_ENABLE)
  261. case (uint32_t)GPIOC:
  262. __HAL_RCC_GPIOC_CLK_ENABLE();
  263. break;
  264. #endif
  265. #if defined(__HAL_RCC_GPIOD_CLK_ENABLE)
  266. case (uint32_t)GPIOD:
  267. __HAL_RCC_GPIOD_CLK_ENABLE();
  268. break;
  269. #endif
  270. #if defined(__HAL_RCC_GPIOE_CLK_ENABLE)
  271. case (uint32_t)GPIOE:
  272. __HAL_RCC_GPIOE_CLK_ENABLE();
  273. break;
  274. #endif
  275. #if defined(__HAL_RCC_GPIOF_CLK_ENABLE)
  276. case (uint32_t)GPIOF:
  277. __HAL_RCC_GPIOF_CLK_ENABLE();
  278. break;
  279. #endif
  280. #if defined(__HAL_RCC_GPIOG_CLK_ENABLE)
  281. case (uint32_t)GPIOG:
  282. __HAL_RCC_GPIOG_CLK_ENABLE();
  283. break;
  284. #endif
  285. #if defined(__HAL_RCC_GPIOH_CLK_ENABLE)
  286. case (uint32_t)GPIOH:
  287. __HAL_RCC_GPIOH_CLK_ENABLE();
  288. break;
  289. #endif
  290. #if defined(__HAL_RCC_GPIOI_CLK_ENABLE)
  291. case (uint32_t)GPIOI:
  292. __HAL_RCC_GPIOI_CLK_ENABLE();
  293. break;
  294. #endif
  295. #if defined(__HAL_RCC_GPIOJ_CLK_ENABLE)
  296. case (uint32_t)GPIOJ:
  297. __HAL_RCC_GPIOJ_CLK_ENABLE();
  298. break;
  299. #endif
  300. #if defined(__HAL_RCC_GPIOK_CLK_ENABLE)
  301. case (uint32_t)GPIOK:
  302. __HAL_RCC_GPIOK_CLK_ENABLE();
  303. break;
  304. #endif
  305. default:
  306. return -RT_ERROR;
  307. }
  308. return RT_EOK;
  309. }
  310. static int up_char(char * c)
  311. {
  312. if ((*c >= 'a') && (*c <= 'z'))
  313. {
  314. *c = *c - 32;
  315. }
  316. return 0;
  317. }
  318. static void get_pin_by_name(const char* pin_name, GPIO_TypeDef **port, uint16_t *pin)
  319. {
  320. int pin_num = atoi((char*) &pin_name[2]);
  321. char port_name = pin_name[1];
  322. up_char(&port_name);
  323. up_char(&port_name);
  324. *port = ((GPIO_TypeDef *) ((uint32_t) GPIOA
  325. + (uint32_t) (port_name - 'A') * ((uint32_t) GPIOB - (uint32_t) GPIOA)));
  326. *pin = (GPIO_PIN_0 << pin_num);
  327. }
  328. static uint16_t stm32_get_pin(GPIO_TypeDef *pin_port, rt_uint32_t pin_num)
  329. {
  330. return (uint16_t)((16 * (((rt_base_t)pin_port - (rt_base_t)GPIOA_BASE)/(0x0400UL))) + (__rt_ffs(pin_num) - 1));
  331. }
  332. static rt_err_t stm32_gpio_configure(struct stm32_uart_config *config)
  333. {
  334. #define UART_IS_TX (1U<<7)
  335. #define UART_IS_RX (0U)
  336. rt_uint16_t tx_pin_num = 0, rx_pin_num = 0;
  337. int rx_index = 0, tx_index = 0, index = 0;
  338. int uart_num = 0;
  339. rt_bool_t uart_is_remap = 0;
  340. GPIO_TypeDef *tx_port;
  341. GPIO_TypeDef *rx_port;
  342. uint16_t tx_pin;
  343. uint16_t rx_pin;
  344. get_pin_by_name(config->rx_pin_name, &rx_port, &rx_pin);
  345. get_pin_by_name(config->tx_pin_name, &tx_port, &tx_pin);
  346. struct gpio_uart_remap {
  347. /* index get by GET_PIN */
  348. rt_uint16_t pin_index;
  349. /* -1: not uart, 1: uart1, 2: uart2 ... */
  350. rt_int8_t normal_uart;
  351. /* -1: not uart, 1: uart1, 2: uart2 ... */
  352. rt_int8_t remap_uart;
  353. };
  354. static const struct gpio_uart_remap uart_remaps[] =
  355. {
  356. /* usart1 configure */
  357. { .pin_index = GET_PIN(A, 9), .normal_uart = 1, .remap_uart = -1 },
  358. { .pin_index = GET_PIN(A, 10), .normal_uart = 1, .remap_uart = -1 },
  359. { .pin_index = GET_PIN(B, 6), .normal_uart = -1, .remap_uart = 1 },
  360. { .pin_index = GET_PIN(B, 7), .normal_uart = -1, .remap_uart = 1 },
  361. /* usart2 configure */
  362. { .pin_index = GET_PIN(A, 2), .normal_uart = 2, .remap_uart = -1 },
  363. { .pin_index = GET_PIN(A, 3), .normal_uart = 2, .remap_uart = -1 },
  364. { .pin_index = GET_PIN(D, 5), .normal_uart = -1, .remap_uart = 2 },
  365. { .pin_index = GET_PIN(D, 6), .normal_uart = -1, .remap_uart = 2 },
  366. /* usart3 configure */
  367. { .pin_index = GET_PIN(B, 10), .normal_uart = 3, .remap_uart = -1 },
  368. { .pin_index = GET_PIN(B, 11), .normal_uart = 3, .remap_uart = -1 },
  369. { .pin_index = GET_PIN(D, 8), .normal_uart = -1, .remap_uart = 3 },
  370. { .pin_index = GET_PIN(D, 9), .normal_uart = -1, .remap_uart = 3 },
  371. { .pin_index = GET_PIN(C, 10), .normal_uart = 4, .remap_uart = 3 },
  372. { .pin_index = GET_PIN(C, 11), .normal_uart = 4, .remap_uart = 3 },
  373. };
  374. /* get tx/rx pin index */
  375. tx_pin_num = stm32_get_pin(tx_port, tx_pin);
  376. rx_pin_num = stm32_get_pin(rx_port, rx_pin);
  377. for (index = 0; index < sizeof(uart_remaps) / sizeof(struct gpio_uart_remap); index++)
  378. {
  379. if (uart_remaps[index].pin_index == tx_pin_num)
  380. {
  381. tx_index = index;
  382. }
  383. else if (uart_remaps[index].pin_index == rx_pin_num)
  384. {
  385. rx_index = index;
  386. }
  387. }
  388. /* check tx/rx pin remap information */
  389. RT_ASSERT(uart_remaps[tx_index].normal_uart == uart_remaps[rx_index].normal_uart);
  390. RT_ASSERT(uart_remaps[tx_index].remap_uart == uart_remaps[rx_index].remap_uart);
  391. uart_num = config->name[4] - '0';
  392. uart_is_remap = uart_remaps[tx_index].remap_uart == uart_num ? RT_TRUE : RT_FALSE;
  393. {
  394. GPIO_InitTypeDef GPIO_InitStruct = {0};
  395. /* gpio ports clock enable */
  396. stm32_gpio_clk_enable(tx_port);
  397. if (tx_port != rx_port)
  398. {
  399. stm32_gpio_clk_enable(rx_port);
  400. }
  401. /* tx pin initialize */
  402. GPIO_InitStruct.Pin = tx_pin;
  403. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  404. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  405. HAL_GPIO_Init(tx_port, &GPIO_InitStruct);
  406. /* rx pin initialize */
  407. GPIO_InitStruct.Pin = rx_pin;
  408. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  409. GPIO_InitStruct.Pull = GPIO_NOPULL;
  410. HAL_GPIO_Init(rx_port, &GPIO_InitStruct);
  411. /* enable the remapping of usart alternate */
  412. if (uart_is_remap)
  413. {
  414. __HAL_RCC_AFIO_CLK_ENABLE();
  415. switch (uart_num)
  416. {
  417. case 1:
  418. __HAL_AFIO_REMAP_USART1_ENABLE();
  419. break;
  420. case 2:
  421. __HAL_AFIO_REMAP_USART2_ENABLE();
  422. break;
  423. case 3:
  424. if (uart_remaps[tx_index].normal_uart < 0)
  425. {
  426. #ifdef AFIO_MAPR_USART3_REMAP_FULLREMAP
  427. __HAL_AFIO_REMAP_USART3_ENABLE();
  428. #endif
  429. }
  430. else
  431. {
  432. #ifdef AFIO_MAPR_USART3_REMAP_PARTIALREMAP
  433. __HAL_AFIO_REMAP_USART3_PARTIAL();
  434. #endif
  435. }
  436. break;
  437. default:
  438. RT_ASSERT(0);
  439. }
  440. }
  441. }
  442. return RT_EOK;
  443. }
  444. static struct stm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};
  445. static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  446. {
  447. struct stm32_uart *uart;
  448. RT_ASSERT(serial != RT_NULL);
  449. RT_ASSERT(cfg != RT_NULL);
  450. uart = rt_container_of(serial, struct stm32_uart, serial);
  451. /* uart clock enable */
  452. stm32_uart_clk_enable(uart->config);
  453. /* uart gpio clock enable and gpio pin init */
  454. stm32_gpio_configure(uart->config);
  455. uart->handle.Instance = uart->config->Instance;
  456. uart->handle.Init.BaudRate = cfg->baud_rate;
  457. uart->handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  458. uart->handle.Init.Mode = UART_MODE_TX_RX;
  459. uart->handle.Init.OverSampling = UART_OVERSAMPLING_16;
  460. switch (cfg->data_bits)
  461. {
  462. case DATA_BITS_8:
  463. uart->handle.Init.WordLength = UART_WORDLENGTH_8B;
  464. break;
  465. case DATA_BITS_9:
  466. uart->handle.Init.WordLength = UART_WORDLENGTH_9B;
  467. break;
  468. default:
  469. uart->handle.Init.WordLength = UART_WORDLENGTH_8B;
  470. break;
  471. }
  472. switch (cfg->stop_bits)
  473. {
  474. case STOP_BITS_1:
  475. uart->handle.Init.StopBits = UART_STOPBITS_1;
  476. break;
  477. case STOP_BITS_2:
  478. uart->handle.Init.StopBits = UART_STOPBITS_2;
  479. break;
  480. default:
  481. uart->handle.Init.StopBits = UART_STOPBITS_1;
  482. break;
  483. }
  484. switch (cfg->parity)
  485. {
  486. case PARITY_NONE:
  487. uart->handle.Init.Parity = UART_PARITY_NONE;
  488. break;
  489. case PARITY_ODD:
  490. uart->handle.Init.Parity = UART_PARITY_ODD;
  491. break;
  492. case PARITY_EVEN:
  493. uart->handle.Init.Parity = UART_PARITY_EVEN;
  494. break;
  495. default:
  496. uart->handle.Init.Parity = UART_PARITY_NONE;
  497. break;
  498. }
  499. if (HAL_UART_Init(&uart->handle) != HAL_OK)
  500. {
  501. return -RT_ERROR;
  502. }
  503. return RT_EOK;
  504. }
  505. static rt_err_t stm32_control(struct rt_serial_device *serial, int cmd, void *arg)
  506. {
  507. struct stm32_uart *uart;
  508. #ifdef RT_SERIAL_USING_DMA
  509. rt_ubase_t ctrl_arg = (rt_ubase_t)arg;
  510. #endif
  511. RT_ASSERT(serial != RT_NULL);
  512. uart = rt_container_of(serial, struct stm32_uart, serial);
  513. switch (cmd)
  514. {
  515. /* disable interrupt */
  516. case RT_DEVICE_CTRL_CLR_INT:
  517. /* disable rx irq */
  518. NVIC_DisableIRQ(uart->config->irq_type);
  519. /* disable interrupt */
  520. __HAL_UART_DISABLE_IT(&(uart->handle), UART_IT_RXNE);
  521. break;
  522. /* enable interrupt */
  523. case RT_DEVICE_CTRL_SET_INT:
  524. /* enable rx irq */
  525. NVIC_EnableIRQ(uart->config->irq_type);
  526. /* enable interrupt */
  527. __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_RXNE);
  528. break;
  529. #ifdef RT_SERIAL_USING_DMA
  530. case RT_DEVICE_CTRL_CONFIG:
  531. stm32_dma_config(serial, ctrl_arg);
  532. break;
  533. #endif
  534. }
  535. return RT_EOK;
  536. }
  537. static int stm32_putc(struct rt_serial_device *serial, char c)
  538. {
  539. struct stm32_uart *uart;
  540. RT_ASSERT(serial != RT_NULL);
  541. uart = rt_container_of(serial, struct stm32_uart, serial);
  542. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
  543. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) \
  544. || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) \
  545. || defined(SOC_SERIES_STM32G4)
  546. uart->handle.Instance->TDR = c;
  547. #else
  548. uart->handle.Instance->DR = c;
  549. #endif
  550. while (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) == RESET);
  551. return 1;
  552. }
  553. static int stm32_getc(struct rt_serial_device *serial)
  554. {
  555. int ch;
  556. struct stm32_uart *uart;
  557. RT_ASSERT(serial != RT_NULL);
  558. uart = rt_container_of(serial, struct stm32_uart, serial);
  559. ch = -1;
  560. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET)
  561. {
  562. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) \
  563. || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) \
  564. || defined(SOC_SERIES_STM32G4)
  565. ch = uart->handle.Instance->RDR & 0xff;
  566. #else
  567. ch = uart->handle.Instance->DR & 0xff;
  568. #endif
  569. }
  570. return ch;
  571. }
  572. static rt_size_t stm32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction)
  573. {
  574. struct stm32_uart *uart;
  575. RT_ASSERT(serial != RT_NULL);
  576. uart = rt_container_of(serial, struct stm32_uart, serial);
  577. if (size == 0)
  578. {
  579. return 0;
  580. }
  581. if (RT_SERIAL_DMA_TX == direction)
  582. {
  583. if (HAL_UART_Transmit_DMA(&uart->handle, buf, size) == HAL_OK)
  584. {
  585. return size;
  586. }
  587. else
  588. {
  589. return 0;
  590. }
  591. }
  592. return 0;
  593. }
  594. static const struct rt_uart_ops stm32_uart_ops =
  595. {
  596. .configure = stm32_configure,
  597. .control = stm32_control,
  598. .putc = stm32_putc,
  599. .getc = stm32_getc,
  600. .dma_transmit = stm32_dma_transmit
  601. };
  602. /**
  603. * Uart common interrupt process. This need add to uart ISR.
  604. *
  605. * @param serial serial device
  606. */
  607. static void uart_isr(struct rt_serial_device *serial)
  608. {
  609. struct stm32_uart *uart;
  610. #ifdef RT_SERIAL_USING_DMA
  611. rt_size_t recv_total_index, recv_len;
  612. rt_base_t level;
  613. #endif
  614. RT_ASSERT(serial != RT_NULL);
  615. uart = rt_container_of(serial, struct stm32_uart, serial);
  616. /* UART in mode Receiver -------------------------------------------------*/
  617. if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&
  618. (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET))
  619. {
  620. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  621. }
  622. #ifdef RT_SERIAL_USING_DMA
  623. else if ((uart->uart_dma_flag) && (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_IDLE) != RESET)
  624. && (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_IDLE) != RESET))
  625. {
  626. level = rt_hw_interrupt_disable();
  627. recv_total_index = serial->config.bufsz - __HAL_DMA_GET_COUNTER(&(uart->dma_rx.handle));
  628. recv_len = recv_total_index - uart->dma_rx.last_index;
  629. uart->dma_rx.last_index = recv_total_index;
  630. rt_hw_interrupt_enable(level);
  631. if (recv_len)
  632. {
  633. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  634. }
  635. __HAL_UART_CLEAR_IDLEFLAG(&uart->handle);
  636. }
  637. else if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) != RESET)
  638. {
  639. if ((serial->parent.open_flag & RT_DEVICE_FLAG_DMA_TX) != 0)
  640. {
  641. HAL_UART_IRQHandler(&(uart->handle));
  642. }
  643. else
  644. {
  645. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
  646. }
  647. }
  648. #endif
  649. else
  650. {
  651. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_ORE) != RESET)
  652. {
  653. __HAL_UART_CLEAR_OREFLAG(&uart->handle);
  654. }
  655. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_NE) != RESET)
  656. {
  657. __HAL_UART_CLEAR_NEFLAG(&uart->handle);
  658. }
  659. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_FE) != RESET)
  660. {
  661. __HAL_UART_CLEAR_FEFLAG(&uart->handle);
  662. }
  663. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_PE) != RESET)
  664. {
  665. __HAL_UART_CLEAR_PEFLAG(&uart->handle);
  666. }
  667. #if !defined(SOC_SERIES_STM32L4) && !defined(SOC_SERIES_STM32F7) && !defined(SOC_SERIES_STM32F0) \
  668. && !defined(SOC_SERIES_STM32L0) && !defined(SOC_SERIES_STM32G0) && !defined(SOC_SERIES_STM32H7) \
  669. && !defined(SOC_SERIES_STM32G4)
  670. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_LBD) != RESET)
  671. {
  672. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_LBD);
  673. }
  674. #endif
  675. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_CTS) != RESET)
  676. {
  677. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_CTS);
  678. }
  679. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TXE) != RESET)
  680. {
  681. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TXE);
  682. }
  683. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) != RESET)
  684. {
  685. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
  686. }
  687. if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET)
  688. {
  689. UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_RXNE);
  690. }
  691. }
  692. }
  693. #ifdef RT_SERIAL_USING_DMA
  694. static void dma_isr(struct rt_serial_device *serial)
  695. {
  696. struct stm32_uart *uart;
  697. rt_size_t recv_total_index, recv_len;
  698. rt_base_t level;
  699. RT_ASSERT(serial != RT_NULL);
  700. uart = rt_container_of(serial, struct stm32_uart, serial);
  701. if ((__HAL_DMA_GET_IT_SOURCE(&(uart->dma_rx.handle), DMA_IT_TC) != RESET) ||
  702. (__HAL_DMA_GET_IT_SOURCE(&(uart->dma_rx.handle), DMA_IT_HT) != RESET))
  703. {
  704. level = rt_hw_interrupt_disable();
  705. recv_total_index = serial->config.bufsz - __HAL_DMA_GET_COUNTER(&(uart->dma_rx.handle));
  706. if (recv_total_index == 0)
  707. {
  708. recv_len = serial->config.bufsz - uart->dma_rx.last_index;
  709. }
  710. else
  711. {
  712. recv_len = recv_total_index - uart->dma_rx.last_index;
  713. }
  714. uart->dma_rx.last_index = recv_total_index;
  715. rt_hw_interrupt_enable(level);
  716. if (recv_len)
  717. {
  718. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  719. }
  720. }
  721. }
  722. #endif
  723. #if defined(BSP_USING_UART1)
  724. void USART1_IRQHandler(void)
  725. {
  726. /* enter interrupt */
  727. rt_interrupt_enter();
  728. uart_isr(&(uart_obj[UART1_INDEX].serial));
  729. /* leave interrupt */
  730. rt_interrupt_leave();
  731. }
  732. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA)
  733. void UART1_DMA_RX_IRQHandler(void)
  734. {
  735. /* enter interrupt */
  736. rt_interrupt_enter();
  737. HAL_DMA_IRQHandler(&uart_obj[UART1_INDEX].dma_rx.handle);
  738. /* leave interrupt */
  739. rt_interrupt_leave();
  740. }
  741. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) */
  742. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA)
  743. void UART1_DMA_TX_IRQHandler(void)
  744. {
  745. /* enter interrupt */
  746. rt_interrupt_enter();
  747. HAL_DMA_IRQHandler(&uart_obj[UART1_INDEX].dma_tx.handle);
  748. /* leave interrupt */
  749. rt_interrupt_leave();
  750. }
  751. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA) */
  752. #endif /* BSP_USING_UART1 */
  753. #if defined(BSP_USING_UART2)
  754. void USART2_IRQHandler(void)
  755. {
  756. /* enter interrupt */
  757. rt_interrupt_enter();
  758. uart_isr(&(uart_obj[UART2_INDEX].serial));
  759. /* leave interrupt */
  760. rt_interrupt_leave();
  761. }
  762. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA)
  763. void UART2_DMA_RX_IRQHandler(void)
  764. {
  765. /* enter interrupt */
  766. rt_interrupt_enter();
  767. HAL_DMA_IRQHandler(&uart_obj[UART2_INDEX].dma_rx.handle);
  768. /* leave interrupt */
  769. rt_interrupt_leave();
  770. }
  771. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) */
  772. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA)
  773. void UART2_DMA_TX_IRQHandler(void)
  774. {
  775. /* enter interrupt */
  776. rt_interrupt_enter();
  777. HAL_DMA_IRQHandler(&uart_obj[UART2_INDEX].dma_tx.handle);
  778. /* leave interrupt */
  779. rt_interrupt_leave();
  780. }
  781. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA) */
  782. #endif /* BSP_USING_UART2 */
  783. #if defined(BSP_USING_UART3)
  784. void USART3_IRQHandler(void)
  785. {
  786. /* enter interrupt */
  787. rt_interrupt_enter();
  788. uart_isr(&(uart_obj[UART3_INDEX].serial));
  789. /* leave interrupt */
  790. rt_interrupt_leave();
  791. }
  792. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA)
  793. void UART3_DMA_RX_IRQHandler(void)
  794. {
  795. /* enter interrupt */
  796. rt_interrupt_enter();
  797. HAL_DMA_IRQHandler(&uart_obj[UART3_INDEX].dma_rx.handle);
  798. /* leave interrupt */
  799. rt_interrupt_leave();
  800. }
  801. #endif /* defined(BSP_UART_USING_DMA_RX) && defined(BSP_UART3_RX_USING_DMA) */
  802. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA)
  803. void UART3_DMA_TX_IRQHandler(void)
  804. {
  805. /* enter interrupt */
  806. rt_interrupt_enter();
  807. HAL_DMA_IRQHandler(&uart_obj[UART3_INDEX].dma_tx.handle);
  808. /* leave interrupt */
  809. rt_interrupt_leave();
  810. }
  811. #endif /* defined(BSP_UART_USING_DMA_TX) && defined(BSP_UART3_TX_USING_DMA) */
  812. #endif /* BSP_USING_UART3*/
  813. #if defined(BSP_USING_UART4)
  814. void UART4_IRQHandler(void)
  815. {
  816. /* enter interrupt */
  817. rt_interrupt_enter();
  818. uart_isr(&(uart_obj[UART4_INDEX].serial));
  819. /* leave interrupt */
  820. rt_interrupt_leave();
  821. }
  822. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA)
  823. void UART4_DMA_RX_IRQHandler(void)
  824. {
  825. /* enter interrupt */
  826. rt_interrupt_enter();
  827. HAL_DMA_IRQHandler(&uart_obj[UART4_INDEX].dma_rx.handle);
  828. /* leave interrupt */
  829. rt_interrupt_leave();
  830. }
  831. #endif /* defined(BSP_UART_USING_DMA_RX) && defined(BSP_UART4_RX_USING_DMA) */
  832. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_TX_USING_DMA)
  833. void UART4_DMA_TX_IRQHandler(void)
  834. {
  835. /* enter interrupt */
  836. rt_interrupt_enter();
  837. HAL_DMA_IRQHandler(&uart_obj[UART4_INDEX].dma_tx.handle);
  838. /* leave interrupt */
  839. rt_interrupt_leave();
  840. }
  841. #endif /* defined(BSP_UART_USING_DMA_TX) && defined(BSP_UART4_TX_USING_DMA) */
  842. #endif /* BSP_USING_UART4*/
  843. #if defined(BSP_USING_UART5)
  844. void UART5_IRQHandler(void)
  845. {
  846. /* enter interrupt */
  847. rt_interrupt_enter();
  848. uart_isr(&(uart_obj[UART5_INDEX].serial));
  849. /* leave interrupt */
  850. rt_interrupt_leave();
  851. }
  852. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA)
  853. void UART5_DMA_RX_IRQHandler(void)
  854. {
  855. /* enter interrupt */
  856. rt_interrupt_enter();
  857. HAL_DMA_IRQHandler(&uart_obj[UART5_INDEX].dma_rx.handle);
  858. /* leave interrupt */
  859. rt_interrupt_leave();
  860. }
  861. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) */
  862. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA)
  863. void UART5_DMA_TX_IRQHandler(void)
  864. {
  865. /* enter interrupt */
  866. rt_interrupt_enter();
  867. HAL_DMA_IRQHandler(&uart_obj[UART5_INDEX].dma_tx.handle);
  868. /* leave interrupt */
  869. rt_interrupt_leave();
  870. }
  871. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA) */
  872. #endif /* BSP_USING_UART5*/
  873. #if defined(BSP_USING_UART6)
  874. void USART6_IRQHandler(void)
  875. {
  876. /* enter interrupt */
  877. rt_interrupt_enter();
  878. uart_isr(&(uart_obj[UART6_INDEX].serial));
  879. /* leave interrupt */
  880. rt_interrupt_leave();
  881. }
  882. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA)
  883. void UART6_DMA_RX_IRQHandler(void)
  884. {
  885. /* enter interrupt */
  886. rt_interrupt_enter();
  887. HAL_DMA_IRQHandler(&uart_obj[UART6_INDEX].dma_rx.handle);
  888. /* leave interrupt */
  889. rt_interrupt_leave();
  890. }
  891. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA) */
  892. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA)
  893. void UART6_DMA_TX_IRQHandler(void)
  894. {
  895. /* enter interrupt */
  896. rt_interrupt_enter();
  897. HAL_DMA_IRQHandler(&uart_obj[UART6_INDEX].dma_tx.handle);
  898. /* leave interrupt */
  899. rt_interrupt_leave();
  900. }
  901. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA) */
  902. #endif /* BSP_USING_UART6*/
  903. #if defined(BSP_USING_UART7)
  904. void UART7_IRQHandler(void)
  905. {
  906. /* enter interrupt */
  907. rt_interrupt_enter();
  908. uart_isr(&(uart_obj[UART7_INDEX].serial));
  909. /* leave interrupt */
  910. rt_interrupt_leave();
  911. }
  912. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA)
  913. void UART7_DMA_RX_IRQHandler(void)
  914. {
  915. /* enter interrupt */
  916. rt_interrupt_enter();
  917. HAL_DMA_IRQHandler(&uart_obj[UART7_INDEX].dma_rx.handle);
  918. /* leave interrupt */
  919. rt_interrupt_leave();
  920. }
  921. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA) */
  922. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA)
  923. void UART7_DMA_TX_IRQHandler(void)
  924. {
  925. /* enter interrupt */
  926. rt_interrupt_enter();
  927. HAL_DMA_IRQHandler(&uart_obj[UART7_INDEX].dma_tx.handle);
  928. /* leave interrupt */
  929. rt_interrupt_leave();
  930. }
  931. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA) */
  932. #endif /* BSP_USING_UART7*/
  933. #if defined(BSP_USING_UART8)
  934. void UART8_IRQHandler(void)
  935. {
  936. /* enter interrupt */
  937. rt_interrupt_enter();
  938. uart_isr(&(uart_obj[UART8_INDEX].serial));
  939. /* leave interrupt */
  940. rt_interrupt_leave();
  941. }
  942. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA)
  943. void UART8_DMA_RX_IRQHandler(void)
  944. {
  945. /* enter interrupt */
  946. rt_interrupt_enter();
  947. HAL_DMA_IRQHandler(&uart_obj[UART8_INDEX].dma_rx.handle);
  948. /* leave interrupt */
  949. rt_interrupt_leave();
  950. }
  951. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA) */
  952. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA)
  953. void UART8_DMA_TX_IRQHandler(void)
  954. {
  955. /* enter interrupt */
  956. rt_interrupt_enter();
  957. HAL_DMA_IRQHandler(&uart_obj[UART8_INDEX].dma_tx.handle);
  958. /* leave interrupt */
  959. rt_interrupt_leave();
  960. }
  961. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA) */
  962. #endif /* BSP_USING_UART8*/
  963. #if defined(BSP_USING_LPUART1)
  964. void LPUART1_IRQHandler(void)
  965. {
  966. /* enter interrupt */
  967. rt_interrupt_enter();
  968. uart_isr(&(uart_obj[LPUART1_INDEX].serial));
  969. /* leave interrupt */
  970. rt_interrupt_leave();
  971. }
  972. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_LPUART1_RX_USING_DMA)
  973. void LPUART1_DMA_RX_IRQHandler(void)
  974. {
  975. /* enter interrupt */
  976. rt_interrupt_enter();
  977. HAL_DMA_IRQHandler(&uart_obj[LPUART1_INDEX].dma_rx.handle);
  978. /* leave interrupt */
  979. rt_interrupt_leave();
  980. }
  981. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_LPUART1_RX_USING_DMA) */
  982. #endif /* BSP_USING_LPUART1*/
  983. #ifdef RT_SERIAL_USING_DMA
  984. static void stm32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
  985. {
  986. struct rt_serial_rx_fifo *rx_fifo;
  987. DMA_HandleTypeDef *DMA_Handle;
  988. struct dma_config *dma_config;
  989. struct stm32_uart *uart;
  990. RT_ASSERT(serial != RT_NULL);
  991. uart = rt_container_of(serial, struct stm32_uart, serial);
  992. if (RT_DEVICE_FLAG_DMA_RX == flag)
  993. {
  994. DMA_Handle = &uart->dma_rx.handle;
  995. dma_config = uart->config->dma_rx;
  996. }
  997. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  998. {
  999. DMA_Handle = &uart->dma_tx.handle;
  1000. dma_config = uart->config->dma_tx;
  1001. }
  1002. LOG_D("%s dma config start", uart->config->name);
  1003. {
  1004. rt_uint32_t tmpreg = 0x00U;
  1005. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) \
  1006. || defined(SOC_SERIES_STM32L0)
  1007. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  1008. SET_BIT(RCC->AHBENR, dma_config->dma_rcc);
  1009. tmpreg = READ_BIT(RCC->AHBENR, dma_config->dma_rcc);
  1010. #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) \
  1011. || defined(SOC_SERIES_STM32G4)
  1012. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  1013. SET_BIT(RCC->AHB1ENR, dma_config->dma_rcc);
  1014. tmpreg = READ_BIT(RCC->AHB1ENR, dma_config->dma_rcc);
  1015. #if (defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G4)) && defined(DMAMUX1)
  1016. /* enable DMAMUX clock for L4+ and G4 */
  1017. __HAL_RCC_DMAMUX1_CLK_ENABLE();
  1018. #endif
  1019. #endif
  1020. UNUSED(tmpreg); /* To avoid compiler warnings */
  1021. }
  1022. if (RT_DEVICE_FLAG_DMA_RX == flag)
  1023. {
  1024. __HAL_LINKDMA(&(uart->handle), hdmarx, uart->dma_rx.handle);
  1025. }
  1026. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  1027. {
  1028. __HAL_LINKDMA(&(uart->handle), hdmatx, uart->dma_tx.handle);
  1029. }
  1030. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0)
  1031. DMA_Handle->Instance = dma_config->Instance;
  1032. #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  1033. DMA_Handle->Instance = dma_config->Instance;
  1034. DMA_Handle->Init.Channel = dma_config->channel;
  1035. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4)
  1036. DMA_Handle->Instance = dma_config->Instance;
  1037. DMA_Handle->Init.Request = dma_config->request;
  1038. #endif
  1039. DMA_Handle->Init.PeriphInc = DMA_PINC_DISABLE;
  1040. DMA_Handle->Init.MemInc = DMA_MINC_ENABLE;
  1041. DMA_Handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  1042. DMA_Handle->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  1043. if (RT_DEVICE_FLAG_DMA_RX == flag)
  1044. {
  1045. DMA_Handle->Init.Direction = DMA_PERIPH_TO_MEMORY;
  1046. DMA_Handle->Init.Mode = DMA_CIRCULAR;
  1047. }
  1048. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  1049. {
  1050. DMA_Handle->Init.Direction = DMA_MEMORY_TO_PERIPH;
  1051. DMA_Handle->Init.Mode = DMA_NORMAL;
  1052. }
  1053. DMA_Handle->Init.Priority = DMA_PRIORITY_MEDIUM;
  1054. #if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  1055. DMA_Handle->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  1056. #endif
  1057. if (HAL_DMA_DeInit(DMA_Handle) != HAL_OK)
  1058. {
  1059. RT_ASSERT(0);
  1060. }
  1061. if (HAL_DMA_Init(DMA_Handle) != HAL_OK)
  1062. {
  1063. RT_ASSERT(0);
  1064. }
  1065. /* enable interrupt */
  1066. if (flag == RT_DEVICE_FLAG_DMA_RX)
  1067. {
  1068. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1069. /* Start DMA transfer */
  1070. if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.bufsz) != HAL_OK)
  1071. {
  1072. /* Transfer error in reception process */
  1073. RT_ASSERT(0);
  1074. }
  1075. CLEAR_BIT(uart->handle.Instance->CR3, USART_CR3_EIE);
  1076. __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE);
  1077. }
  1078. /* enable irq */
  1079. HAL_NVIC_SetPriority(dma_config->dma_irq, 0, 0);
  1080. HAL_NVIC_EnableIRQ(dma_config->dma_irq);
  1081. HAL_NVIC_SetPriority(uart->config->irq_type, 1, 0);
  1082. HAL_NVIC_EnableIRQ(uart->config->irq_type);
  1083. LOG_D("%s dma %s instance: %x", uart->config->name, flag == RT_DEVICE_FLAG_DMA_RX ? "RX" : "TX", DMA_Handle->Instance);
  1084. LOG_D("%s dma config done", uart->config->name);
  1085. }
  1086. /**
  1087. * @brief UART error callbacks
  1088. * @param huart: UART handle
  1089. * @note This example shows a simple way to report transfer error, and you can
  1090. * add your own implementation.
  1091. * @retval None
  1092. */
  1093. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  1094. {
  1095. RT_ASSERT(huart != NULL);
  1096. struct stm32_uart *uart = (struct stm32_uart *)huart;
  1097. LOG_D("%s: %s %d\n", __FUNCTION__, uart->config->name, huart->ErrorCode);
  1098. UNUSED(uart);
  1099. }
  1100. /**
  1101. * @brief Rx Transfer completed callback
  1102. * @param huart: UART handle
  1103. * @note This example shows a simple way to report end of DMA Rx transfer, and
  1104. * you can add your own implementation.
  1105. * @retval None
  1106. */
  1107. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  1108. {
  1109. struct stm32_uart *uart;
  1110. RT_ASSERT(huart != NULL);
  1111. uart = (struct stm32_uart *)huart;
  1112. dma_isr(&uart->serial);
  1113. }
  1114. /**
  1115. * @brief Rx Half transfer completed callback
  1116. * @param huart: UART handle
  1117. * @note This example shows a simple way to report end of DMA Rx Half transfer,
  1118. * and you can add your own implementation.
  1119. * @retval None
  1120. */
  1121. void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
  1122. {
  1123. struct stm32_uart *uart;
  1124. RT_ASSERT(huart != NULL);
  1125. uart = (struct stm32_uart *)huart;
  1126. dma_isr(&uart->serial);
  1127. }
  1128. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  1129. {
  1130. struct stm32_uart *uart;
  1131. RT_ASSERT(huart != NULL);
  1132. uart = (struct stm32_uart *)huart;
  1133. rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_TX_DMADONE);
  1134. }
  1135. #endif /* RT_SERIAL_USING_DMA */
  1136. static void stm32_uart_get_dma_config(void)
  1137. {
  1138. #ifdef BSP_USING_UART1
  1139. uart_obj[UART1_INDEX].uart_dma_flag = 0;
  1140. #ifdef BSP_UART1_RX_USING_DMA
  1141. uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1142. static struct dma_config uart1_dma_rx = UART1_DMA_RX_CONFIG;
  1143. uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx;
  1144. #endif
  1145. #ifdef BSP_UART1_TX_USING_DMA
  1146. uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1147. static struct dma_config uart1_dma_tx = UART1_DMA_TX_CONFIG;
  1148. uart_config[UART1_INDEX].dma_tx = &uart1_dma_tx;
  1149. #endif
  1150. #endif
  1151. #ifdef BSP_USING_UART2
  1152. uart_obj[UART2_INDEX].uart_dma_flag = 0;
  1153. #ifdef BSP_UART2_RX_USING_DMA
  1154. uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1155. static struct dma_config uart2_dma_rx = UART2_DMA_RX_CONFIG;
  1156. uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx;
  1157. #endif
  1158. #ifdef BSP_UART2_TX_USING_DMA
  1159. uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1160. static struct dma_config uart2_dma_tx = UART2_DMA_TX_CONFIG;
  1161. uart_config[UART2_INDEX].dma_tx = &uart2_dma_tx;
  1162. #endif
  1163. #endif
  1164. #ifdef BSP_USING_UART3
  1165. uart_obj[UART3_INDEX].uart_dma_flag = 0;
  1166. #ifdef BSP_UART3_RX_USING_DMA
  1167. uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1168. static struct dma_config uart3_dma_rx = UART3_DMA_RX_CONFIG;
  1169. uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx;
  1170. #endif
  1171. #ifdef BSP_UART3_TX_USING_DMA
  1172. uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1173. static struct dma_config uart3_dma_tx = UART3_DMA_TX_CONFIG;
  1174. uart_config[UART3_INDEX].dma_tx = &uart3_dma_tx;
  1175. #endif
  1176. #endif
  1177. #ifdef BSP_USING_UART4
  1178. uart_obj[UART4_INDEX].uart_dma_flag = 0;
  1179. #ifdef BSP_UART4_RX_USING_DMA
  1180. uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1181. static struct dma_config uart4_dma_rx = UART4_DMA_RX_CONFIG;
  1182. uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx;
  1183. #endif
  1184. #ifdef BSP_UART4_TX_USING_DMA
  1185. uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1186. static struct dma_config uart4_dma_tx = UART4_DMA_TX_CONFIG;
  1187. uart_config[UART4_INDEX].dma_tx = &uart4_dma_tx;
  1188. #endif
  1189. #endif
  1190. #ifdef BSP_USING_UART5
  1191. uart_obj[UART5_INDEX].uart_dma_flag = 0;
  1192. #ifdef BSP_UART5_RX_USING_DMA
  1193. uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1194. static struct dma_config uart5_dma_rx = UART5_DMA_RX_CONFIG;
  1195. uart_config[UART5_INDEX].dma_rx = &uart5_dma_rx;
  1196. #endif
  1197. #ifdef BSP_UART5_TX_USING_DMA
  1198. uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1199. static struct dma_config uart5_dma_tx = UART5_DMA_TX_CONFIG;
  1200. uart_config[UART5_INDEX].dma_tx = &uart5_dma_tx;
  1201. #endif
  1202. #endif
  1203. #ifdef BSP_USING_UART6
  1204. uart_obj[UART6_INDEX].uart_dma_flag = 0;
  1205. #ifdef BSP_UART6_RX_USING_DMA
  1206. uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1207. static struct dma_config uart6_dma_rx = UART6_DMA_RX_CONFIG;
  1208. uart_config[UART6_INDEX].dma_rx = &uart6_dma_rx;
  1209. #endif
  1210. #ifdef BSP_UART6_TX_USING_DMA
  1211. uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1212. static struct dma_config uart6_dma_tx = UART6_DMA_TX_CONFIG;
  1213. uart_config[UART6_INDEX].dma_tx = &uart6_dma_tx;
  1214. #endif
  1215. #endif
  1216. }
  1217. int rt_hw_usart_init(void)
  1218. {
  1219. rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);
  1220. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  1221. rt_err_t result = 0;
  1222. stm32_uart_get_dma_config();
  1223. for (int i = 0; i < obj_num; i++)
  1224. {
  1225. uart_obj[i].config = &uart_config[i];
  1226. uart_obj[i].serial.ops = &stm32_uart_ops;
  1227. uart_obj[i].serial.config = config;
  1228. /* register UART device */
  1229. result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
  1230. RT_DEVICE_FLAG_RDWR
  1231. | RT_DEVICE_FLAG_INT_RX
  1232. | RT_DEVICE_FLAG_INT_TX
  1233. | uart_obj[i].uart_dma_flag
  1234. , NULL);
  1235. RT_ASSERT(result == RT_EOK);
  1236. }
  1237. return result;
  1238. }
  1239. #endif /* RT_USING_SERIAL */