drv_usart.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  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_FLAG(&(uart->UartHandle), UART_FLAG_TC);
  107. uart->UartHandle.Instance->TDR = c;
  108. return 1;
  109. }
  110. static int drv_getc(struct rt_serial_device *serial)
  111. {
  112. int ch;
  113. struct drv_uart *uart;
  114. RT_ASSERT(serial != RT_NULL);
  115. uart = (struct drv_uart *)serial->parent.user_data;
  116. ch = -1;
  117. if (__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET)
  118. ch = uart->UartHandle.Instance->RDR & 0xff;
  119. return ch;
  120. }
  121. static const struct rt_uart_ops drv_uart_ops =
  122. {
  123. drv_configure,
  124. drv_control,
  125. drv_putc,
  126. drv_getc,
  127. };
  128. #if defined(BSP_USING_UART1)
  129. /* UART1 device driver structure */
  130. static struct drv_uart uart1;
  131. struct rt_serial_device serial1;
  132. void USART1_IRQHandler(void)
  133. {
  134. struct drv_uart *uart;
  135. uart = &uart1;
  136. /* enter interrupt */
  137. rt_interrupt_enter();
  138. /* UART in mode Receiver -------------------------------------------------*/
  139. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  140. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  141. {
  142. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  143. /* Clear RXNE interrupt flag */
  144. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  145. }
  146. /* leave interrupt */
  147. rt_interrupt_leave();
  148. }
  149. #endif /* BSP_USING_UART1 */
  150. #if defined(BSP_USING_UART4)
  151. /* UART4 device driver structure */
  152. static struct drv_uart uart4;
  153. struct rt_serial_device serial4;
  154. void UART4_IRQHandler(void)
  155. {
  156. struct drv_uart *uart;
  157. uart = &uart4;
  158. /* enter interrupt */
  159. rt_interrupt_enter();
  160. /* UART in mode Receiver -------------------------------------------------*/
  161. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  162. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  163. {
  164. rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND);
  165. /* Clear RXNE interrupt flag */
  166. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  167. }
  168. /* leave interrupt */
  169. rt_interrupt_leave();
  170. }
  171. #endif /* BSP_USING_UART4 */
  172. #if defined(BSP_USING_UART5)
  173. /* UART5 device driver structure */
  174. static struct drv_uart uart5;
  175. struct rt_serial_device serial5;
  176. void UART5_IRQHandler(void)
  177. {
  178. struct drv_uart *uart;
  179. uart = &uart5;
  180. /* enter interrupt */
  181. rt_interrupt_enter();
  182. /* UART in mode Receiver -------------------------------------------------*/
  183. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  184. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  185. {
  186. rt_hw_serial_isr(&serial5, RT_SERIAL_EVENT_RX_IND);
  187. /* Clear RXNE interrupt flag */
  188. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  189. }
  190. /* leave interrupt */
  191. rt_interrupt_leave();
  192. }
  193. #endif /* BSP_USING_UART5 */
  194. #if defined(BSP_USING_UART6)
  195. /* UART6 device driver structure */
  196. static struct drv_uart uart6;
  197. struct rt_serial_device serial6;
  198. void USART6_IRQHandler(void)
  199. {
  200. struct drv_uart *uart;
  201. uart = &uart6;
  202. /* enter interrupt */
  203. rt_interrupt_enter();
  204. /* UART in mode Receiver -------------------------------------------------*/
  205. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  206. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  207. {
  208. rt_hw_serial_isr(&serial6, RT_SERIAL_EVENT_RX_IND);
  209. /* Clear RXNE interrupt flag */
  210. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  211. }
  212. /* leave interrupt */
  213. rt_interrupt_leave();
  214. }
  215. #endif /* BSP_USING_UART6 */
  216. #if defined(BSP_USING_UART7)
  217. /* UART7 device driver structure */
  218. static struct drv_uart uart7;
  219. struct rt_serial_device serial7;
  220. void UART7_IRQHandler(void)
  221. {
  222. struct drv_uart *uart;
  223. uart = &uart7;
  224. /* enter interrupt */
  225. rt_interrupt_enter();
  226. /* UART in mode Receiver -------------------------------------------------*/
  227. if ((__HAL_UART_GET_FLAG(&uart->UartHandle, UART_FLAG_RXNE) != RESET) &&
  228. (__HAL_UART_GET_IT_SOURCE(&uart->UartHandle, UART_IT_RXNE) != RESET))
  229. {
  230. rt_hw_serial_isr(&serial7, RT_SERIAL_EVENT_RX_IND);
  231. /* Clear RXNE interrupt flag */
  232. __HAL_UART_CLEAR_IT(&uart->UartHandle, UART_FLAG_RXNE);
  233. }
  234. /* leave interrupt */
  235. rt_interrupt_leave();
  236. }
  237. #endif /* BSP_USING_UART7 */
  238. /**
  239. * @brief UART MSP Initialization
  240. * This function configures the hardware resources used in this example:
  241. * - Peripheral's clock enable
  242. * - Peripheral's GPIO Configuration
  243. * - NVIC configuration for UART interrupt request enable
  244. * @param huart: UART handle pointer
  245. * @retval None
  246. */
  247. void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle)
  248. {
  249. GPIO_InitTypeDef GPIO_InitStruct;
  250. if (uartHandle->Instance == UART4)
  251. {
  252. /* UART4 clock enable */
  253. __HAL_RCC_UART4_CLK_ENABLE();
  254. __HAL_RCC_GPIOC_CLK_ENABLE();
  255. __HAL_RCC_GPIOA_CLK_ENABLE();
  256. /**UART4 GPIO Configuration
  257. PC11 ------> UART4_RX
  258. PA0/WKUP ------> UART4_TX
  259. */
  260. GPIO_InitStruct.Pin = GPIO_PIN_11;
  261. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  262. GPIO_InitStruct.Pull = GPIO_NOPULL;
  263. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  264. GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  265. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  266. GPIO_InitStruct.Pin = GPIO_PIN_0;
  267. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  268. GPIO_InitStruct.Pull = GPIO_NOPULL;
  269. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  270. GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  271. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  272. /* UART4 interrupt Init */
  273. HAL_NVIC_SetPriority(UART4_IRQn, 5, 0);
  274. HAL_NVIC_EnableIRQ(UART4_IRQn);
  275. }
  276. else if (uartHandle->Instance == UART5)
  277. {
  278. /* UART5 clock enable */
  279. __HAL_RCC_UART5_CLK_ENABLE();
  280. __HAL_RCC_GPIOB_CLK_ENABLE();
  281. __HAL_RCC_GPIOC_CLK_ENABLE();
  282. /**UART5 GPIO Configuration
  283. PB8 ------> UART5_RX
  284. PC12 ------> UART5_TX
  285. */
  286. GPIO_InitStruct.Pin = GPIO_PIN_8;
  287. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  288. GPIO_InitStruct.Pull = GPIO_NOPULL;
  289. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  290. GPIO_InitStruct.Alternate = GPIO_AF7_UART5;
  291. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  292. GPIO_InitStruct.Pin = GPIO_PIN_12;
  293. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  294. GPIO_InitStruct.Pull = GPIO_NOPULL;
  295. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  296. GPIO_InitStruct.Alternate = GPIO_AF8_UART5;
  297. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  298. /* UART5 interrupt Init */
  299. HAL_NVIC_SetPriority(UART5_IRQn, 5, 0);
  300. HAL_NVIC_EnableIRQ(UART5_IRQn);
  301. }
  302. else if (uartHandle->Instance == UART7)
  303. {
  304. /* UART7 clock enable */
  305. __HAL_RCC_UART7_CLK_ENABLE();
  306. __HAL_RCC_GPIOA_CLK_ENABLE();
  307. /**UART7 GPIO Configuration
  308. PA15 ------> UART7_TX
  309. PA8 ------> UART7_RX
  310. */
  311. GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_8;
  312. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  313. GPIO_InitStruct.Pull = GPIO_NOPULL;
  314. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  315. GPIO_InitStruct.Alternate = GPIO_AF12_UART7;
  316. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  317. /* UART7 interrupt Init */
  318. HAL_NVIC_SetPriority(UART7_IRQn, 5, 0);
  319. HAL_NVIC_EnableIRQ(UART7_IRQn);
  320. }
  321. else if (uartHandle->Instance == USART1)
  322. {
  323. /* USART1 clock enable */
  324. __HAL_RCC_USART1_CLK_ENABLE();
  325. __HAL_RCC_GPIOA_CLK_ENABLE();
  326. /**USART1 GPIO Configuration
  327. PA10 ------> USART1_RX
  328. PA9 ------> USART1_TX
  329. */
  330. GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
  331. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  332. GPIO_InitStruct.Pull = GPIO_NOPULL;
  333. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  334. GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  335. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  336. /* USART1 interrupt Init */
  337. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  338. HAL_NVIC_EnableIRQ(USART1_IRQn);
  339. }
  340. else if (uartHandle->Instance == USART6)
  341. {
  342. /* USART6 clock enable */
  343. __HAL_RCC_USART6_CLK_ENABLE();
  344. __HAL_RCC_GPIOC_CLK_ENABLE();
  345. /**USART6 GPIO Configuration
  346. PC7 ------> USART6_RX
  347. PC6 ------> USART6_TX
  348. */
  349. GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_6;
  350. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  351. GPIO_InitStruct.Pull = GPIO_NOPULL;
  352. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  353. GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
  354. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  355. }
  356. }
  357. void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle)
  358. {
  359. if (uartHandle->Instance == UART4)
  360. {
  361. /* Peripheral clock disable */
  362. __HAL_RCC_UART4_CLK_DISABLE();
  363. /**UART4 GPIO Configuration
  364. PC11 ------> UART4_RX
  365. PA0/WKUP ------> UART4_TX
  366. */
  367. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11);
  368. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
  369. }
  370. else if (uartHandle->Instance == UART5)
  371. {
  372. /* Peripheral clock disable */
  373. __HAL_RCC_UART5_CLK_DISABLE();
  374. /**UART5 GPIO Configuration
  375. PB8 ------> UART5_RX
  376. PC12 ------> UART5_TX
  377. */
  378. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8);
  379. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12);
  380. }
  381. else if (uartHandle->Instance == UART7)
  382. {
  383. /* Peripheral clock disable */
  384. __HAL_RCC_UART7_CLK_DISABLE();
  385. /**UART7 GPIO Configuration
  386. PA15 ------> UART7_TX
  387. PA8 ------> UART7_RX
  388. */
  389. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15 | GPIO_PIN_8);
  390. }
  391. else if (uartHandle->Instance == USART1)
  392. {
  393. /* Peripheral clock disable */
  394. __HAL_RCC_USART1_CLK_DISABLE();
  395. /**USART1 GPIO Configuration
  396. PB7 ------> USART1_RX
  397. PA9 ------> USART1_TX
  398. */
  399. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
  400. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
  401. }
  402. else if (uartHandle->Instance == USART6)
  403. {
  404. /* Peripheral clock disable */
  405. __HAL_RCC_USART6_CLK_DISABLE();
  406. /**USART6 GPIO Configuration
  407. PC7 ------> USART6_RX
  408. PC6 ------> USART6_TX
  409. */
  410. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7 | GPIO_PIN_6);
  411. }
  412. }
  413. int hw_usart_init(void)
  414. {
  415. struct drv_uart *uart;
  416. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  417. #ifdef BSP_USING_UART1
  418. uart = &uart1;
  419. uart->UartHandle.Instance = USART1;
  420. uart->irq = USART1_IRQn;
  421. serial1.ops = &drv_uart_ops;
  422. serial1.config = config;
  423. /* register UART1 device */
  424. rt_hw_serial_register(&serial1, "uart1",
  425. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  426. uart);
  427. #endif /* BSP_USING_UART1 */
  428. #ifdef BSP_USING_UART4
  429. uart = &uart4;
  430. uart->UartHandle.Instance = UART4;
  431. uart->irq = UART4_IRQn;
  432. serial4.ops = &drv_uart_ops;
  433. serial4.config = config;
  434. /* register UART4 device */
  435. rt_hw_serial_register(&serial4, "uart4",
  436. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  437. uart);
  438. #endif /* BSP_USING_UART4 */
  439. #ifdef BSP_USING_UART5
  440. uart = &uart5;
  441. uart->UartHandle.Instance = UART5;
  442. uart->irq = UART5_IRQn;
  443. serial5.ops = &drv_uart_ops;
  444. serial5.config = config;
  445. /* register UART5 device */
  446. rt_hw_serial_register(&serial5, "uart5",
  447. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  448. uart);
  449. #endif /* BSP_USING_UART5 */
  450. #ifdef BSP_USING_UART6
  451. uart = &uart6;
  452. uart->UartHandle.Instance = USART6;
  453. uart->irq = USART6_IRQn;
  454. serial6.ops = &drv_uart_ops;
  455. serial6.config = config;
  456. /* register UART6 device */
  457. rt_hw_serial_register(&serial6, "uart6",
  458. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  459. uart);
  460. #endif /* BSP_USING_UART6 */
  461. #ifdef BSP_USING_UART7
  462. uart = &uart7;
  463. uart->UartHandle.Instance = UART7;
  464. uart->irq = UART7_IRQn;
  465. serial7.ops = &drv_uart_ops;
  466. serial7.config = config;
  467. /* register UART7 device */
  468. rt_hw_serial_register(&serial7, "uart7",
  469. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  470. uart);
  471. #endif /* BSP_USING_UART7 */
  472. return 0;
  473. }
  474. INIT_BOARD_EXPORT(hw_usart_init);