uart.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #include <rthw.h>
  2. #include <rtthread.h>
  3. #include "CMSIS/CM0/NUC1xx.h"
  4. /**
  5. * @addtogroup NUC1xx
  6. */
  7. /*@{*/
  8. #if defined(RT_USING_UART) && defined(RT_USING_DEVICE)
  9. #define UART_BAUDRATE 115200
  10. struct rt_uart_nuc
  11. {
  12. struct rt_device parent;
  13. /* buffer for reception */
  14. rt_uint8_t read_index, save_index;
  15. rt_uint8_t rx_buffer[RT_UART_RX_BUFFER_SIZE];
  16. }uart_device;
  17. void UART0_IRQHandler(void)
  18. {
  19. rt_ubase_t level;
  20. struct rt_uart_nuc* uart = &uart_device;
  21. if (UART0->ISR.RDA_INT == 1) /* Receive Data Available */
  22. {
  23. while (UART0->ISR.RDA_IF == 1)
  24. {
  25. /* Receive Data Available */
  26. uart->rx_buffer[uart->save_index] = UART0->DATA;
  27. level = rt_hw_interrupt_disable();
  28. uart->save_index ++;
  29. if (uart->save_index >= RT_UART_RX_BUFFER_SIZE)
  30. uart->save_index = 0;
  31. rt_hw_interrupt_enable(level);
  32. }
  33. /* invoke callback */
  34. if(uart->parent.rx_indicate != RT_NULL)
  35. {
  36. rt_size_t length;
  37. if (uart->read_index > uart->save_index)
  38. length = RT_UART_RX_BUFFER_SIZE - uart->read_index + uart->save_index;
  39. else
  40. length = uart->save_index - uart->read_index;
  41. uart->parent.rx_indicate(&uart->parent, length);
  42. }
  43. }
  44. return;
  45. }
  46. static rt_err_t rt_uart_init (rt_device_t dev)
  47. {
  48. /* Multi-Function Pin: Enable UART0:Tx Rx */
  49. SYS->GPBMFP.UART0_RX = 1;
  50. SYS->GPBMFP.UART0_TX = 1;
  51. /* Configure GCR to reset UART0 */
  52. SYS->IPRSTC2.UART0_RST = 1;
  53. SYS->IPRSTC2.UART0_RST = 0;
  54. /* Enable UART clock */
  55. SYSCLK->APBCLK.UART0_EN = 1;
  56. /* Select UART clock source */
  57. SYSCLK->CLKSEL1.UART_S = 0;
  58. /* Data format */
  59. UART0->LCR.WLS = 3;
  60. /* Configure the baud rate */
  61. *((__IO uint32_t *)&UART0->BAUD) = 0x3F000066; /* This setting is for 115200bsp with 12Mhz clock source */
  62. return RT_EOK;
  63. }
  64. static rt_err_t rt_uart_open(rt_device_t dev, rt_uint16_t oflag)
  65. {
  66. RT_ASSERT(dev != RT_NULL);
  67. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  68. {
  69. /* open receive data available interrupt */
  70. UART0->IER.RDA_IEN = 1;
  71. /* Enable the UART Interrupt */
  72. NVIC_EnableIRQ(UART0_IRQn);
  73. }
  74. return RT_EOK;
  75. }
  76. static rt_err_t rt_uart_close(rt_device_t dev)
  77. {
  78. RT_ASSERT(dev != RT_NULL);
  79. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  80. {
  81. /* Disable the UART Interrupt */
  82. NVIC_DisableIRQ(UART0_IRQn);
  83. }
  84. return RT_EOK;
  85. }
  86. static rt_size_t rt_uart_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  87. {
  88. rt_uint8_t* ptr;
  89. struct rt_uart_nuc *uart = (struct rt_uart_nuc*)dev;
  90. RT_ASSERT(uart != RT_NULL);
  91. /* point to buffer */
  92. ptr = (rt_uint8_t*) buffer;
  93. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  94. {
  95. while (size)
  96. {
  97. /* interrupt receive */
  98. rt_base_t level;
  99. /* disable interrupt */
  100. level = rt_hw_interrupt_disable();
  101. if (uart->read_index != uart->save_index)
  102. {
  103. *ptr = uart->rx_buffer[uart->read_index];
  104. uart->read_index ++;
  105. if (uart->read_index >= RT_UART_RX_BUFFER_SIZE)
  106. uart->read_index = 0;
  107. }
  108. else
  109. {
  110. /* no data in rx buffer */
  111. /* enable interrupt */
  112. rt_hw_interrupt_enable(level);
  113. break;
  114. }
  115. /* enable interrupt */
  116. rt_hw_interrupt_enable(level);
  117. ptr ++;
  118. size --;
  119. }
  120. return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
  121. }
  122. return 0;
  123. }
  124. static rt_size_t rt_uart_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  125. {
  126. char *ptr;
  127. ptr = (char*)buffer;
  128. if (dev->flag & RT_DEVICE_FLAG_STREAM)
  129. {
  130. /* stream mode */
  131. while (size)
  132. {
  133. if (*ptr == '\n')
  134. {
  135. /* check whether UART is empty */
  136. while (UART0->FSR.TX_EMPTY !=1);
  137. /* write data */
  138. UART0->DATA = '\r';
  139. }
  140. /* check whether UART is empty */
  141. while (UART0->FSR.TX_EMPTY !=1);
  142. /* write data */
  143. UART0->DATA = *ptr;
  144. ptr ++;
  145. size --;
  146. }
  147. }
  148. else
  149. {
  150. while ( size != 0 )
  151. {
  152. /* check whether UART is empty */
  153. while (UART0->FSR.TX_EMPTY !=1);
  154. /* write data */
  155. UART0->DATA = *ptr;
  156. ptr++;
  157. size--;
  158. }
  159. }
  160. return (rt_size_t) ptr - (rt_size_t) buffer;
  161. }
  162. void rt_hw_uart_init(void)
  163. {
  164. struct rt_uart_nuc* uart;
  165. /* get uart device */
  166. uart = &uart_device;
  167. /* device initialization */
  168. uart->parent.type = RT_Device_Class_Char;
  169. rt_memset(uart->rx_buffer, 0, sizeof(uart->rx_buffer));
  170. uart->read_index = uart->save_index = 0;
  171. /* device interface */
  172. uart->parent.init = rt_uart_init;
  173. uart->parent.open = rt_uart_open;
  174. uart->parent.close = rt_uart_close;
  175. uart->parent.read = rt_uart_read;
  176. uart->parent.write = rt_uart_write;
  177. uart->parent.control = RT_NULL;
  178. uart->parent.user_data = RT_NULL;
  179. rt_device_register(&uart->parent,
  180. "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_RX);
  181. }
  182. #endif /* end of UART */
  183. /*@}*/