uart.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <rthw.h>
  2. #include <rtthread.h>
  3. #include <rtdevice.h>
  4. #include <board.h>
  5. /* CME-M7 uart driver */
  6. struct CME_M7_uart
  7. {
  8. UART0_Type* uart_device;
  9. IRQn_Type irq;
  10. };
  11. #ifdef RT_USING_UART0
  12. struct CME_M7_uart uart0 =
  13. {
  14. UART0,
  15. UART0_INT_IRQn,
  16. };
  17. static struct rt_serial_device serial0;
  18. #endif /* RT_USING_UART0 */
  19. #ifdef RT_USING_UART2
  20. struct CME_M7_uart uart2 =
  21. {
  22. UART2,
  23. UART2_INT_IRQn,
  24. };
  25. static struct rt_serial_device serial2;
  26. #endif /* RT_USING_UART2 */
  27. static rt_err_t CME_M7_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  28. {
  29. struct CME_M7_uart* uart;
  30. UART_InitTypeDef init;
  31. RT_ASSERT(serial != RT_NULL);
  32. RT_ASSERT(cfg != RT_NULL);
  33. uart = (struct CME_M7_uart *)serial->parent.user_data;
  34. init.UART_BaudRate = cfg->baud_rate;
  35. init.UART_StopBits = UART_StopBits_1;
  36. init.UART_Parity = UART_Parity_None;
  37. init.UART_LoopBack = FALSE;
  38. init.UART_RxEn = TRUE;
  39. init.UART_CtsEn = FALSE;
  40. UART_Init(uart->uart_device, &init);
  41. uart->uart_device->RX_RESET = 1;
  42. UART_Enable(uart->uart_device, TRUE);
  43. uart->uart_device->RX_RESET = 0;
  44. return RT_EOK;
  45. }
  46. static rt_err_t CME_M7_control(struct rt_serial_device *serial, int cmd, void *arg)
  47. {
  48. struct CME_M7_uart* uart;
  49. NVIC_InitTypeDef NVIC_InitStructure;
  50. RT_ASSERT(serial != RT_NULL);
  51. uart = (struct CME_M7_uart *)serial->parent.user_data;
  52. switch (cmd)
  53. {
  54. case RT_DEVICE_CTRL_CLR_INT:
  55. /* disable rx irq */
  56. NVIC_InitStructure.NVIC_IRQChannel = uart->irq;
  57. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  58. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  59. NVIC_InitStructure.NVIC_IRQChannelCmd = FALSE;
  60. NVIC_Init(&NVIC_InitStructure);
  61. UART_EnableInt(uart->uart_device, UART_Int_RxNotEmpty, FALSE);
  62. break;
  63. case RT_DEVICE_CTRL_SET_INT:
  64. /* enable rx irq */
  65. NVIC_InitStructure.NVIC_IRQChannel = uart->irq;
  66. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  67. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  68. NVIC_InitStructure.NVIC_IRQChannelCmd = TRUE;
  69. NVIC_Init(&NVIC_InitStructure);
  70. UART_ClearInt(uart->uart_device, UART_Int_RxNotEmpty);
  71. UART_EnableInt(uart->uart_device, UART_Int_RxNotEmpty, TRUE);
  72. break;
  73. }
  74. return RT_EOK;
  75. }
  76. static int CME_M7_putc(struct rt_serial_device *serial, char ch)
  77. {
  78. struct CME_M7_uart* uart;
  79. RT_ASSERT(serial != RT_NULL);
  80. uart = (struct CME_M7_uart *)serial->parent.user_data;
  81. while(uart->uart_device->STATUS_b.TF); //waits for transmitter FIFO not full.
  82. uart->uart_device->TX_BUF = ch;
  83. return 1;
  84. }
  85. static int CME_M7_getc(struct rt_serial_device *serial)
  86. {
  87. int ch;
  88. struct CME_M7_uart* uart;
  89. RT_ASSERT(serial != RT_NULL);
  90. uart = (struct CME_M7_uart *)serial->parent.user_data;
  91. ch = -1;
  92. if(uart->uart_device->STATUS_b.RNE)
  93. {
  94. ch = uart->uart_device->RX_BUF & 0x00FF; /* Get Data from UART RX */
  95. }
  96. return ch;
  97. }
  98. static const struct rt_uart_ops CME_M7_uart_ops =
  99. {
  100. CME_M7_configure,
  101. CME_M7_control,
  102. CME_M7_putc,
  103. CME_M7_getc,
  104. };
  105. int rt_hw_uart_init(void)
  106. {
  107. struct CME_M7_uart* uart;
  108. struct rt_serial_device *serial;
  109. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  110. #ifdef RT_USING_UART0
  111. uart = &uart0;
  112. serial = &serial0;
  113. serial->ops = &CME_M7_uart_ops;
  114. serial->config = config;
  115. /* register UART device */
  116. rt_hw_serial_register(serial,
  117. "uart0",
  118. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  119. uart);
  120. #endif /* RT_USING_UART0 */
  121. #ifdef RT_USING_UART2
  122. uart = &uart2;
  123. serial = &serial2;
  124. serial->ops = &CME_M7_uart_ops;
  125. serial->config = config;
  126. /* register UART device */
  127. rt_hw_serial_register(serial,
  128. "uart2",
  129. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  130. uart);
  131. #endif /* RT_USING_UART2 */
  132. return RT_EOK;
  133. }
  134. INIT_BOARD_EXPORT(rt_hw_uart_init);
  135. static void CME_UART_IRQHandler(struct rt_serial_device *serial)
  136. {
  137. struct CME_M7_uart* uart;
  138. RT_ASSERT(serial != RT_NULL);
  139. uart = (struct CME_M7_uart *)serial->parent.user_data;
  140. if(UART_GetIntStatus(uart->uart_device, UART_Int_RxNotEmpty))
  141. {
  142. UART_ClearInt(uart->uart_device, UART_Int_RxNotEmpty);
  143. rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
  144. }
  145. if(UART_GetIntStatus(uart->uart_device, UART_Int_RxThresholdReach))
  146. {
  147. UART_ClearInt(uart->uart_device, UART_Int_RxThresholdReach);
  148. }
  149. if(UART_GetIntStatus(uart->uart_device, UART_Int_OverrunError))
  150. {
  151. UART_ClearInt(uart->uart_device, UART_Int_OverrunError);
  152. }
  153. if(UART_GetIntStatus(uart->uart_device, UART_Int_FrameError))
  154. {
  155. UART_ClearInt(uart->uart_device, UART_Int_FrameError);
  156. }
  157. if(UART_GetIntStatus(uart->uart_device, UART_Int_ParityError))
  158. {
  159. UART_ClearInt(uart->uart_device, UART_Int_ParityError);
  160. }
  161. }
  162. #ifdef RT_USING_UART0
  163. void UART0_IRQHandler(void)
  164. {
  165. CME_UART_IRQHandler(&serial0);
  166. }
  167. #endif /* RT_USING_UART0 */
  168. #ifdef RT_USING_UART2
  169. void UART2_IRQHandler(void)
  170. {
  171. CME_UART_IRQHandler(&serial2);
  172. }
  173. #endif /* RT_USING_UART2 */