drv_usart.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  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-05-17 ZYH first implementation
  9. */
  10. #include "drv_usart.h"
  11. #include "board.h"
  12. #include <rtdevice.h>
  13. #include <rthw.h>
  14. #include <rtthread.h>
  15. /* STM32 uart driver */
  16. struct drv_uart
  17. {
  18. UART_HandleTypeDef UartHandle;
  19. IRQn_Type irq;
  20. };
  21. static rt_err_t drv_configure(struct rt_serial_device *serial,
  22. struct serial_configure *cfg)
  23. {
  24. struct drv_uart *uart;
  25. RT_ASSERT(serial != RT_NULL);
  26. RT_ASSERT(cfg != RT_NULL);
  27. uart = (struct drv_uart *)serial->parent.user_data;
  28. uart->UartHandle.Init.BaudRate = cfg->baud_rate;
  29. uart->UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  30. uart->UartHandle.Init.Mode = UART_MODE_TX_RX;
  31. uart->UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  32. switch (cfg->data_bits)
  33. {
  34. case DATA_BITS_8:
  35. uart->UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  36. break;
  37. case DATA_BITS_9:
  38. uart->UartHandle.Init.WordLength = UART_WORDLENGTH_9B;
  39. break;
  40. default:
  41. uart->UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  42. break;
  43. }
  44. switch (cfg->stop_bits)
  45. {
  46. case STOP_BITS_1:
  47. uart->UartHandle.Init.StopBits = UART_STOPBITS_1;
  48. break;
  49. case STOP_BITS_2:
  50. uart->UartHandle.Init.StopBits = UART_STOPBITS_2;
  51. break;
  52. default:
  53. uart->UartHandle.Init.StopBits = UART_STOPBITS_1;
  54. break;
  55. }
  56. switch (cfg->parity)
  57. {
  58. case PARITY_NONE:
  59. uart->UartHandle.Init.Parity = UART_PARITY_NONE;
  60. break;
  61. case PARITY_ODD:
  62. uart->UartHandle.Init.Parity = UART_PARITY_ODD;
  63. break;
  64. case PARITY_EVEN:
  65. uart->UartHandle.Init.Parity = UART_PARITY_EVEN;
  66. break;
  67. default:
  68. uart->UartHandle.Init.Parity = UART_PARITY_NONE;
  69. break;
  70. }
  71. if (HAL_UART_Init(&uart->UartHandle) != HAL_OK)
  72. {
  73. return RT_ERROR;
  74. }
  75. return RT_EOK;
  76. }
  77. static rt_err_t drv_control(struct rt_serial_device *serial,
  78. int cmd, void *arg)
  79. {
  80. struct drv_uart *uart;
  81. RT_ASSERT(serial != RT_NULL);
  82. uart = (struct drv_uart *)serial->parent.user_data;
  83. switch (cmd)
  84. {
  85. case RT_DEVICE_CTRL_CLR_INT:
  86. /* disable rx irq */
  87. HAL_NVIC_DisableIRQ(uart->irq);
  88. /* disable interrupt */
  89. __HAL_UART_DISABLE_IT(&uart->UartHandle, UART_IT_RXNE);
  90. break;
  91. case RT_DEVICE_CTRL_SET_INT:
  92. /* enable rx irq */
  93. HAL_NVIC_EnableIRQ(uart->irq);
  94. HAL_NVIC_SetPriority(uart->irq, 5, 0);
  95. /* enable interrupt */
  96. __HAL_UART_ENABLE_IT(&uart->UartHandle, UART_IT_RXNE);
  97. break;
  98. }
  99. return RT_EOK;
  100. }
  101. static int drv_putc(struct rt_serial_device *serial, char c)
  102. {
  103. struct drv_uart *uart;
  104. RT_ASSERT(serial != RT_NULL);
  105. uart = (struct drv_uart *)serial->parent.user_data;
  106. __HAL_UART_CLEAR_IT(&(uart->UartHandle), UART_CLEAR_TCF);
  107. uart->UartHandle.Instance->TDR = c;
  108. while (__HAL_UART_GET_FLAG(&(uart->UartHandle), UART_FLAG_TC) == RESET);
  109. return 1;
  110. }
  111. static int drv_getc(struct rt_serial_device *serial)
  112. {
  113. int ch;
  114. struct drv_uart *uart;
  115. RT_ASSERT(serial != RT_NULL);
  116. uart = (struct drv_uart *)serial->parent.user_data;
  117. ch = -1;
  118. if (__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET)
  119. ch = uart->UartHandle.Instance->RDR & 0xff;
  120. return ch;
  121. }
  122. static const struct rt_uart_ops drv_uart_ops =
  123. {
  124. drv_configure,
  125. drv_control,
  126. drv_putc,
  127. drv_getc,
  128. };
  129. #if defined(BSP_USING_UART1)
  130. /* UART1 device driver structure */
  131. static struct drv_uart uart1;
  132. struct rt_serial_device serial1;
  133. void USART1_IRQHandler(void)
  134. {
  135. struct drv_uart *uart;
  136. uart = &uart1;
  137. /* enter interrupt */
  138. rt_interrupt_enter();
  139. /* UART in mode Receiver -------------------------------------------------*/
  140. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  141. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  142. {
  143. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  144. /* Clear RXNE interrupt flag */
  145. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  146. }
  147. /* leave interrupt */
  148. rt_interrupt_leave();
  149. }
  150. #endif /* BSP_USING_UART1 */
  151. #if defined(BSP_USING_UART4)
  152. /* UART4 device driver structure */
  153. static struct drv_uart uart4;
  154. struct rt_serial_device serial4;
  155. void UART4_IRQHandler(void)
  156. {
  157. struct drv_uart *uart;
  158. uart = &uart4;
  159. /* enter interrupt */
  160. rt_interrupt_enter();
  161. /* UART in mode Receiver -------------------------------------------------*/
  162. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  163. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  164. {
  165. rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND);
  166. /* Clear RXNE interrupt flag */
  167. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  168. }
  169. /* leave interrupt */
  170. rt_interrupt_leave();
  171. }
  172. #endif /* BSP_USING_UART4 */
  173. #if defined(BSP_USING_UART5)
  174. /* UART5 device driver structure */
  175. static struct drv_uart uart5;
  176. struct rt_serial_device serial5;
  177. void UART5_IRQHandler(void)
  178. {
  179. struct drv_uart *uart;
  180. uart = &uart5;
  181. /* enter interrupt */
  182. rt_interrupt_enter();
  183. /* UART in mode Receiver -------------------------------------------------*/
  184. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  185. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  186. {
  187. rt_hw_serial_isr(&serial5, RT_SERIAL_EVENT_RX_IND);
  188. /* Clear RXNE interrupt flag */
  189. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  190. }
  191. /* leave interrupt */
  192. rt_interrupt_leave();
  193. }
  194. #endif /* BSP_USING_UART5 */
  195. #if defined(BSP_USING_UART6)
  196. /* UART6 device driver structure */
  197. static struct drv_uart uart6;
  198. struct rt_serial_device serial6;
  199. void USART6_IRQHandler(void)
  200. {
  201. struct drv_uart *uart;
  202. uart = &uart6;
  203. /* enter interrupt */
  204. rt_interrupt_enter();
  205. /* UART in mode Receiver -------------------------------------------------*/
  206. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  207. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  208. {
  209. rt_hw_serial_isr(&serial6, RT_SERIAL_EVENT_RX_IND);
  210. /* Clear RXNE interrupt flag */
  211. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  212. }
  213. /* leave interrupt */
  214. rt_interrupt_leave();
  215. }
  216. #endif /* BSP_USING_UART6 */
  217. #if defined(BSP_USING_UART7)
  218. /* UART7 device driver structure */
  219. static struct drv_uart uart7;
  220. struct rt_serial_device serial7;
  221. void UART7_IRQHandler(void)
  222. {
  223. struct drv_uart *uart;
  224. uart = &uart7;
  225. /* enter interrupt */
  226. rt_interrupt_enter();
  227. /* UART in mode Receiver -------------------------------------------------*/
  228. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  229. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  230. {
  231. rt_hw_serial_isr(&serial7, RT_SERIAL_EVENT_RX_IND);
  232. /* Clear RXNE interrupt flag */
  233. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  234. }
  235. /* leave interrupt */
  236. rt_interrupt_leave();
  237. }
  238. #endif /* BSP_USING_UART7 */
  239. /**
  240. * @brief UART MSP Initialization
  241. * This function configures the hardware resources used in this example:
  242. * - Peripheral's clock enable
  243. * - Peripheral's GPIO Configuration
  244. * - NVIC configuration for UART interrupt request enable
  245. * @param huart: UART handle pointer
  246. * @retval None
  247. */
  248. void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle)
  249. {
  250. GPIO_InitTypeDef GPIO_InitStruct;
  251. if (uartHandle->Instance == UART4)
  252. {
  253. /* UART4 clock enable */
  254. __HAL_RCC_UART4_CLK_ENABLE();
  255. __HAL_RCC_GPIOC_CLK_ENABLE();
  256. __HAL_RCC_GPIOA_CLK_ENABLE();
  257. /**UART4 GPIO Configuration
  258. PC11 ------> UART4_RX
  259. PA0/WKUP ------> UART4_TX
  260. */
  261. GPIO_InitStruct.Pin = GPIO_PIN_11;
  262. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  263. GPIO_InitStruct.Pull = GPIO_NOPULL;
  264. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  265. GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  266. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  267. GPIO_InitStruct.Pin = GPIO_PIN_0;
  268. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  269. GPIO_InitStruct.Pull = GPIO_NOPULL;
  270. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  271. GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  272. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  273. /* UART4 interrupt Init */
  274. HAL_NVIC_SetPriority(UART4_IRQn, 5, 0);
  275. HAL_NVIC_EnableIRQ(UART4_IRQn);
  276. }
  277. else if (uartHandle->Instance == UART5)
  278. {
  279. /* UART5 clock enable */
  280. __HAL_RCC_UART5_CLK_ENABLE();
  281. __HAL_RCC_GPIOB_CLK_ENABLE();
  282. __HAL_RCC_GPIOC_CLK_ENABLE();
  283. /**UART5 GPIO Configuration
  284. PB8 ------> UART5_RX
  285. PC12 ------> UART5_TX
  286. */
  287. GPIO_InitStruct.Pin = GPIO_PIN_8;
  288. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  289. GPIO_InitStruct.Pull = GPIO_NOPULL;
  290. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  291. GPIO_InitStruct.Alternate = GPIO_AF7_UART5;
  292. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  293. GPIO_InitStruct.Pin = GPIO_PIN_12;
  294. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  295. GPIO_InitStruct.Pull = GPIO_NOPULL;
  296. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  297. GPIO_InitStruct.Alternate = GPIO_AF8_UART5;
  298. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  299. /* UART5 interrupt Init */
  300. HAL_NVIC_SetPriority(UART5_IRQn, 5, 0);
  301. HAL_NVIC_EnableIRQ(UART5_IRQn);
  302. }
  303. else if (uartHandle->Instance == UART7)
  304. {
  305. /* UART7 clock enable */
  306. __HAL_RCC_UART7_CLK_ENABLE();
  307. __HAL_RCC_GPIOA_CLK_ENABLE();
  308. /**UART7 GPIO Configuration
  309. PA15 ------> UART7_TX
  310. PA8 ------> UART7_RX
  311. */
  312. GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_8;
  313. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  314. GPIO_InitStruct.Pull = GPIO_NOPULL;
  315. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  316. GPIO_InitStruct.Alternate = GPIO_AF12_UART7;
  317. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  318. /* UART7 interrupt Init */
  319. HAL_NVIC_SetPriority(UART7_IRQn, 5, 0);
  320. HAL_NVIC_EnableIRQ(UART7_IRQn);
  321. }
  322. else if (uartHandle->Instance == USART1)
  323. {
  324. /* USART1 clock enable */
  325. __HAL_RCC_USART1_CLK_ENABLE();
  326. __HAL_RCC_GPIOA_CLK_ENABLE();
  327. /**USART1 GPIO Configuration
  328. PA10 ------> USART1_RX
  329. PA9 ------> USART1_TX
  330. */
  331. GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
  332. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  333. GPIO_InitStruct.Pull = GPIO_NOPULL;
  334. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  335. GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  336. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  337. /* USART1 interrupt Init */
  338. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  339. HAL_NVIC_EnableIRQ(USART1_IRQn);
  340. }
  341. else if (uartHandle->Instance == USART6)
  342. {
  343. /* USART6 clock enable */
  344. __HAL_RCC_USART6_CLK_ENABLE();
  345. __HAL_RCC_GPIOC_CLK_ENABLE();
  346. /**USART6 GPIO Configuration
  347. PC7 ------> USART6_RX
  348. PC6 ------> USART6_TX
  349. */
  350. GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_6;
  351. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  352. GPIO_InitStruct.Pull = GPIO_NOPULL;
  353. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  354. GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
  355. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  356. }
  357. }
  358. void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle)
  359. {
  360. if (uartHandle->Instance == UART4)
  361. {
  362. /* Peripheral clock disable */
  363. __HAL_RCC_UART4_CLK_DISABLE();
  364. /**UART4 GPIO Configuration
  365. PC11 ------> UART4_RX
  366. PA0/WKUP ------> UART4_TX
  367. */
  368. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11);
  369. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
  370. }
  371. else if (uartHandle->Instance == UART5)
  372. {
  373. /* Peripheral clock disable */
  374. __HAL_RCC_UART5_CLK_DISABLE();
  375. /**UART5 GPIO Configuration
  376. PB8 ------> UART5_RX
  377. PC12 ------> UART5_TX
  378. */
  379. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8);
  380. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12);
  381. }
  382. else if (uartHandle->Instance == UART7)
  383. {
  384. /* Peripheral clock disable */
  385. __HAL_RCC_UART7_CLK_DISABLE();
  386. /**UART7 GPIO Configuration
  387. PA15 ------> UART7_TX
  388. PA8 ------> UART7_RX
  389. */
  390. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15 | GPIO_PIN_8);
  391. }
  392. else if (uartHandle->Instance == USART1)
  393. {
  394. /* Peripheral clock disable */
  395. __HAL_RCC_USART1_CLK_DISABLE();
  396. /**USART1 GPIO Configuration
  397. PB7 ------> USART1_RX
  398. PA9 ------> USART1_TX
  399. */
  400. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
  401. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
  402. }
  403. else if (uartHandle->Instance == USART6)
  404. {
  405. /* Peripheral clock disable */
  406. __HAL_RCC_USART6_CLK_DISABLE();
  407. /**USART6 GPIO Configuration
  408. PC7 ------> USART6_RX
  409. PC6 ------> USART6_TX
  410. */
  411. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7 | GPIO_PIN_6);
  412. }
  413. }
  414. int hw_usart_init(void)
  415. {
  416. struct drv_uart *uart;
  417. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  418. #ifdef BSP_USING_UART1
  419. uart = &uart1;
  420. uart->UartHandle.Instance = USART1;
  421. uart->irq = USART1_IRQn;
  422. serial1.ops = &drv_uart_ops;
  423. serial1.config = config;
  424. /* register UART1 device */
  425. rt_hw_serial_register(&serial1, "uart1",
  426. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  427. uart);
  428. #endif /* BSP_USING_UART1 */
  429. #ifdef BSP_USING_UART4
  430. uart = &uart4;
  431. uart->UartHandle.Instance = UART4;
  432. uart->irq = UART4_IRQn;
  433. serial4.ops = &drv_uart_ops;
  434. serial4.config = config;
  435. /* register UART4 device */
  436. rt_hw_serial_register(&serial4, "uart4",
  437. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  438. uart);
  439. #endif /* BSP_USING_UART4 */
  440. #ifdef BSP_USING_UART5
  441. uart = &uart5;
  442. uart->UartHandle.Instance = UART5;
  443. uart->irq = UART5_IRQn;
  444. serial5.ops = &drv_uart_ops;
  445. serial5.config = config;
  446. /* register UART5 device */
  447. rt_hw_serial_register(&serial5, "uart5",
  448. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  449. uart);
  450. #endif /* BSP_USING_UART5 */
  451. #ifdef BSP_USING_UART6
  452. uart = &uart6;
  453. uart->UartHandle.Instance = USART6;
  454. uart->irq = USART6_IRQn;
  455. serial6.ops = &drv_uart_ops;
  456. serial6.config = config;
  457. /* register UART6 device */
  458. rt_hw_serial_register(&serial6, "uart6",
  459. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  460. uart);
  461. #endif /* BSP_USING_UART6 */
  462. #ifdef BSP_USING_UART7
  463. uart = &uart7;
  464. uart->UartHandle.Instance = UART7;
  465. uart->irq = UART7_IRQn;
  466. serial7.ops = &drv_uart_ops;
  467. serial7.config = config;
  468. /* register UART7 device */
  469. rt_hw_serial_register(&serial7, "uart7",
  470. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  471. uart);
  472. #endif /* BSP_USING_UART7 */
  473. return 0;
  474. }
  475. INIT_BOARD_EXPORT(hw_usart_init);