drv_uart.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. * 2013-11-15 bright the first version
  9. */
  10. #include <HAL_device.h>
  11. #include <rtdevice.h>
  12. #include "drv_uart.h"
  13. /* UART1 */
  14. #define UART1_GPIO_TX GPIO_Pin_9
  15. #define UART1_GPIO_TX_SOURCE GPIO_PinSource9
  16. #define UART1_GPIO_RX GPIO_Pin_10
  17. #define UART1_GPIO_RX_SOURCE GPIO_PinSource10
  18. #define UART1_GPIO_AF GPIO_AF_1
  19. #define UART1_GPIO GPIOA
  20. /* UART2 */
  21. #define UART2_GPIO_TX GPIO_Pin_2
  22. #define UART2_GPIO_TX_SOURCE GPIO_PinSource2
  23. #define UART2_GPIO_RX GPIO_Pin_3
  24. #define UART2_GPIO_RX_SOURCE GPIO_PinSource3
  25. #define UART2_GPIO_AF GPIO_AF_1
  26. #define UART2_GPIO GPIOA
  27. /* uart driver */
  28. struct mm32_uart
  29. {
  30. UART_TypeDef *uart;
  31. IRQn_Type irq;
  32. };
  33. static rt_err_t mm32_uart_configure(struct rt_serial_device *serial,
  34. struct serial_configure *cfg)
  35. {
  36. struct mm32_uart *uart;
  37. UART_InitTypeDef UART_InitStructure;
  38. RT_ASSERT(serial != RT_NULL);
  39. RT_ASSERT(cfg != RT_NULL);
  40. uart = (struct mm32_uart *)serial->parent.user_data;
  41. UART_InitStructure.UART_BaudRate = cfg->baud_rate;
  42. if (cfg->data_bits == DATA_BITS_8)
  43. UART_InitStructure.UART_WordLength = UART_WordLength_8b;
  44. if (cfg->stop_bits == STOP_BITS_1)
  45. UART_InitStructure.UART_StopBits = UART_StopBits_1;
  46. else if (cfg->stop_bits == STOP_BITS_2)
  47. UART_InitStructure.UART_StopBits = UART_StopBits_2;
  48. UART_InitStructure.UART_Parity = UART_Parity_No;
  49. UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
  50. UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
  51. UART_Init(uart->uart, &UART_InitStructure);
  52. /* Enable UART */
  53. UART_Cmd(uart->uart, ENABLE);
  54. return RT_EOK;
  55. }
  56. static rt_err_t mm32_uart_control(struct rt_serial_device *serial,
  57. int cmd, void *arg)
  58. {
  59. struct mm32_uart *uart;
  60. RT_ASSERT(serial != RT_NULL);
  61. uart = (struct mm32_uart *)serial->parent.user_data;
  62. switch (cmd)
  63. {
  64. case RT_DEVICE_CTRL_CLR_INT:
  65. /* disable rx irq */
  66. NVIC_DisableIRQ(uart->irq);
  67. UART_ITConfig(uart->uart, UART_IT_RXIEN, DISABLE);
  68. break;
  69. case RT_DEVICE_CTRL_SET_INT:
  70. /* enable rx irq */
  71. NVIC_EnableIRQ(uart->irq);
  72. /* enable interrupt */
  73. UART_ITConfig(uart->uart, UART_IT_RXIEN, ENABLE);
  74. break;
  75. }
  76. return RT_EOK;
  77. }
  78. static int mm32_uart_putc(struct rt_serial_device *serial, char c)
  79. {
  80. struct mm32_uart *uart;
  81. RT_ASSERT(serial != RT_NULL);
  82. uart = (struct mm32_uart *)serial->parent.user_data;
  83. while ((uart->uart->CSR & UART_CSR_TXC) == 0);
  84. uart->uart->TDR = c;
  85. return 1;
  86. }
  87. static int mm32_uart_getc(struct rt_serial_device *serial)
  88. {
  89. int ch;
  90. struct mm32_uart *uart;
  91. RT_ASSERT(serial != RT_NULL);
  92. uart = (struct mm32_uart *)serial->parent.user_data;
  93. ch = -1;
  94. if (uart->uart->CSR & UART_FLAG_RXAVL)
  95. {
  96. ch = uart->uart->RDR & 0xff;
  97. }
  98. return ch;
  99. }
  100. static const struct rt_uart_ops mm32_uart_ops =
  101. {
  102. mm32_uart_configure,
  103. mm32_uart_control,
  104. mm32_uart_putc,
  105. mm32_uart_getc,
  106. };
  107. #if defined(BSP_USING_UART1)
  108. /* UART1 device driver structure */
  109. static struct mm32_uart uart1;
  110. struct rt_serial_device serial1;
  111. void UART1_IRQHandler(void)
  112. {
  113. struct mm32_uart *uart;
  114. uart = &uart1;
  115. /* enter interrupt */
  116. rt_interrupt_enter();
  117. if (UART_GetITStatus(uart->uart, UART_IT_RXIEN) != RESET)
  118. {
  119. UART_ClearITPendingBit(uart->uart, UART_IT_RXIEN);
  120. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  121. }
  122. if (UART_GetITStatus(uart->uart, UART_IT_TXIEN) != RESET)
  123. {
  124. /* clear interrupt */
  125. UART_ClearITPendingBit(uart->uart, UART_IT_TXIEN);
  126. }
  127. /* leave interrupt */
  128. rt_interrupt_leave();
  129. }
  130. #endif /* BSP_USING_UART1 */
  131. #if defined(BSP_USING_UART2)
  132. /* UART2 device driver structure */
  133. static struct mm32_uart uart2;
  134. struct rt_serial_device serial2;
  135. void UART2_IRQHandler(void)
  136. {
  137. struct mm32_uart *uart;
  138. uart = &uart2;
  139. /* enter interrupt */
  140. rt_interrupt_enter();
  141. if (UART_GetITStatus(uart->uart_device, UART_IT_RXIEN) != RESET)
  142. {
  143. UART_ClearITPendingBit(uart->uart_device, UART_IT_RXIEN);
  144. rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
  145. }
  146. if (UART_GetITStatus(uart->uart, UART_IT_TXIEN) != RESET)
  147. {
  148. /* clear interrupt */
  149. UART_ClearITPendingBit(uart->uart, UART_IT_TXIEN);
  150. }
  151. /* leave interrupt */
  152. rt_interrupt_leave();
  153. }
  154. #endif /* BSP_USING_UART2 */
  155. #ifdef BSP_USING_UART1
  156. static void UART1PINconfigStepA(void)
  157. {
  158. /* Enable UART clock */
  159. RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);
  160. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  161. GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
  162. GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
  163. }
  164. static void UART1PINconfigStepB(void)
  165. {
  166. GPIO_InitTypeDef GPIO_InitStructure;
  167. /* Configure USART Rx/tx PIN */
  168. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  169. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  170. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  171. GPIO_Init(GPIOA, &GPIO_InitStructure);
  172. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  173. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  174. GPIO_Init(GPIOA, &GPIO_InitStructure);
  175. }
  176. #endif
  177. #ifdef BSP_USING_UART2
  178. static void UART2PINconfigStepA(void)
  179. {
  180. /* Enable UART clock */
  181. RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE);
  182. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  183. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
  184. GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
  185. }
  186. static void UART2PINconfigStepB(void)
  187. {
  188. GPIO_InitTypeDef GPIO_InitStructure;
  189. /* Configure USART Rx/tx PIN */
  190. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  191. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  192. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  193. GPIO_Init(GPIOA, &GPIO_InitStructure);
  194. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  195. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  196. GPIO_Init(GPIOA, &GPIO_InitStructure);
  197. }
  198. #endif
  199. int rt_hw_uart_init(void)
  200. {
  201. struct mm32_uart *uart;
  202. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  203. #ifdef BSP_USING_UART1
  204. UART1PINconfigStepA();
  205. uart = &uart1;
  206. uart->uart = UART1;
  207. uart->irq = UART1_IRQn;
  208. config.baud_rate = BAUD_RATE_115200;
  209. serial1.ops = &mm32_uart_ops;
  210. serial1.config = config;
  211. /* register UART1 device */
  212. rt_hw_serial_register(&serial1, "uart1",
  213. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  214. uart);
  215. UART1PINconfigStepB();
  216. #endif /* BSP_USING_UART1 */
  217. #ifdef BSP_USING_UART2
  218. UART2PINconfigStepA();
  219. uart = &uart2;
  220. uart->uart = UART2;
  221. uart->irq = UART2_IRQn;
  222. config.baud_rate = BAUD_RATE_115200;
  223. serial2.ops = &mm32_uart_ops;
  224. serial2.config = config;
  225. /* register UART1 device */
  226. rt_hw_serial_register(&serial2, "uart2",
  227. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  228. uart);
  229. UART2PINconfigStepB();
  230. #endif /* BSP_USING_UART2 */
  231. return 0;
  232. }
  233. INIT_BOARD_EXPORT(rt_hw_uart_init);