uart.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #include "board.h"
  2. #include "uart.h"
  3. #include "nrf_drv_common.h"
  4. #include "nrf_drv_uart.h"
  5. #include "app_util_platform.h"
  6. #include "nrf_gpio.h"
  7. #include <rtdevice.h>
  8. static struct rt_serial_device _serial0_0;
  9. #if USE_UART0_1
  10. static struct rt_serial_device _serial0_1;
  11. #endif
  12. typedef struct
  13. {
  14. struct rt_serial_device *serial;
  15. nrf_drv_uart_t uart;
  16. uint32_t rx_pin;
  17. uint32_t tx_pin;
  18. } UART_CFG_T;
  19. UART_CFG_T uart0 = {
  20. .uart = NRF_DRV_UART_INSTANCE(0),
  21. #ifdef RT_USING_CONSOLE
  22. .rx_pin = 3,
  23. .tx_pin = 4
  24. #else
  25. .rx_pin = 19,
  26. .tx_pin = 20
  27. #endif
  28. };
  29. #if USE_UART0_1
  30. UART_CFG_T uart1 = {
  31. .uart = NRF_DRV_UART_INSTANCE(0),
  32. .rx_pin = 3,
  33. .tx_pin = 4
  34. };
  35. #endif
  36. UART_CFG_T *working_cfg = RT_NULL;
  37. void UART0_IRQHandler(void)
  38. {
  39. if (nrf_uart_int_enable_check(NRF_UART0, NRF_UART_INT_MASK_ERROR)
  40. && nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_ERROR))
  41. {
  42. nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_ERROR);
  43. }
  44. if (nrf_uart_int_enable_check(NRF_UART0, NRF_UART_INT_MASK_RXDRDY)
  45. && nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_RXDRDY))
  46. {
  47. rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_RX_IND);
  48. }
  49. if (nrf_uart_int_enable_check(NRF_UART0, NRF_UART_INT_MASK_TXDRDY)
  50. && nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_TXDRDY))
  51. {
  52. rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_TX_DONE);
  53. }
  54. if (nrf_uart_event_check(NRF_UART0, NRF_UART_EVENT_RXTO))
  55. {
  56. rt_hw_serial_isr(working_cfg->serial, RT_SERIAL_EVENT_RX_TIMEOUT);
  57. }
  58. }
  59. static rt_err_t _uart_cfg(struct rt_serial_device *serial, struct serial_configure *cfg)
  60. {
  61. nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG;
  62. UART_CFG_T *instance = &uart0;
  63. RT_ASSERT(serial != RT_NULL);
  64. RT_ASSERT(cfg != RT_NULL);
  65. if (serial->parent.user_data != RT_NULL)
  66. {
  67. instance = (UART_CFG_T*)serial->parent.user_data;
  68. }
  69. nrf_uart_disable(instance->uart.reg.p_uart);
  70. switch (cfg->baud_rate)
  71. {
  72. case 115200:
  73. config.baudrate = NRF_UART_BAUDRATE_115200;
  74. break;
  75. case 9600:
  76. config.baudrate = NRF_UART_BAUDRATE_9600;
  77. break;
  78. default:
  79. config.baudrate = NRF_UART_BAUDRATE_115200;
  80. break;
  81. }
  82. if (cfg->parity == PARITY_NONE)
  83. {
  84. config.parity = NRF_UART_PARITY_EXCLUDED;
  85. }
  86. else
  87. {
  88. config.parity = NRF_UART_PARITY_INCLUDED;
  89. }
  90. config.hwfc = NRF_UART_HWFC_DISABLED;
  91. config.interrupt_priority = APP_IRQ_PRIORITY_LOWEST;
  92. config.pselcts = 0;
  93. config.pselrts = 0;
  94. config.pselrxd = instance->rx_pin;
  95. config.pseltxd = instance->tx_pin;
  96. nrf_gpio_pin_set(config.pseltxd);
  97. nrf_gpio_cfg_output(config.pseltxd);
  98. nrf_gpio_pin_clear(config.pseltxd);
  99. nrf_gpio_cfg_input(config.pselrxd, NRF_GPIO_PIN_NOPULL);
  100. nrf_uart_baudrate_set(instance->uart.reg.p_uart, config.baudrate);
  101. nrf_uart_configure(instance->uart.reg.p_uart, config.parity, config.hwfc);
  102. nrf_uart_txrx_pins_set(instance->uart.reg.p_uart, config.pseltxd, config.pselrxd);
  103. if (config.hwfc == NRF_UART_HWFC_ENABLED)
  104. {
  105. nrf_uart_hwfc_pins_set(instance->uart.reg.p_uart, config.pselrts, config.pselcts);
  106. }
  107. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_TXDRDY);
  108. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_RXDRDY);
  109. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_RXTO);
  110. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_ERROR);
  111. nrf_uart_int_enable(instance->uart.reg.p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_RXTO | NRF_UART_INT_MASK_ERROR);
  112. nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)instance->uart.reg.p_uart), config.interrupt_priority);
  113. nrf_uart_enable(instance->uart.reg.p_uart);
  114. // nrf_uart_task_trigger(instance->uart.reg.p_uart, NRF_UART_TASK_STARTRX);
  115. working_cfg = instance;
  116. return RT_EOK;
  117. }
  118. static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg)
  119. {
  120. UART_CFG_T *instance = working_cfg;
  121. RT_ASSERT(serial != RT_NULL);
  122. if (serial->parent.user_data != RT_NULL)
  123. {
  124. instance = (UART_CFG_T*)serial->parent.user_data;
  125. }
  126. switch (cmd)
  127. {
  128. /* disable interrupt */
  129. case RT_DEVICE_CTRL_CLR_INT:
  130. nrf_uart_task_trigger(instance->uart.reg.p_uart, NRF_UART_TASK_STOPRX);
  131. nrf_uart_int_disable(instance->uart.reg.p_uart, NRF_UART_INT_MASK_RXDRDY
  132. | NRF_UART_INT_MASK_RXTO
  133. | NRF_UART_INT_MASK_ERROR);
  134. nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)instance->uart.reg.p_uart));
  135. break;
  136. /* enable interrupt */
  137. case RT_DEVICE_CTRL_SET_INT:
  138. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_RXDRDY);
  139. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_RXTO);
  140. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_ERROR);
  141. /* Enable RX interrupt. */
  142. nrf_uart_int_enable(instance->uart.reg.p_uart, NRF_UART_INT_MASK_RXDRDY
  143. | NRF_UART_INT_MASK_RXTO
  144. | NRF_UART_INT_MASK_ERROR);
  145. nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)instance->uart.reg.p_uart), APP_IRQ_PRIORITY_LOWEST);
  146. nrf_uart_task_trigger(instance->uart.reg.p_uart, NRF_UART_TASK_STARTRX);
  147. break;
  148. case RT_DEVICE_CTRL_CUSTOM:
  149. if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_9600)
  150. {
  151. instance->serial->config.baud_rate = 9600;
  152. nrf_uart_baudrate_set(instance->uart.reg.p_uart, NRF_UART_BAUDRATE_9600);
  153. }
  154. else if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_115200)
  155. {
  156. instance->serial->config.baud_rate = 115200;
  157. nrf_uart_baudrate_set(instance->uart.reg.p_uart, NRF_UART_BAUDRATE_115200);
  158. }
  159. // _uart_cfg(instance->serial, &(instance->serial->config));
  160. // nrf_uart_task_trigger(instance->uart.reg.p_uart, NRF_UART_TASK_STARTRX);
  161. break;
  162. case RT_DEVICE_CTRL_PIN:
  163. if (working_cfg != instance)
  164. {
  165. _uart_cfg(instance->serial, &(instance->serial->config));
  166. }
  167. break;
  168. case RT_DEVICE_POWERSAVE:
  169. nrf_uart_disable(instance->uart.reg.p_uart);
  170. nrf_uart_txrx_pins_disconnect(instance->uart.reg.p_uart);
  171. nrf_gpio_pin_clear(instance->rx_pin);
  172. nrf_gpio_cfg_output(instance->rx_pin);
  173. nrf_gpio_pin_clear(instance->tx_pin);
  174. nrf_gpio_cfg_output(instance->tx_pin);
  175. break;
  176. case RT_DEVICE_WAKEUP:
  177. _uart_cfg(instance->serial, &(instance->serial->config));
  178. break;
  179. default:
  180. return RT_ERROR;
  181. }
  182. return RT_EOK;
  183. }
  184. static int _uart_putc(struct rt_serial_device *serial, char c)
  185. {
  186. UART_CFG_T *instance = working_cfg;
  187. RT_ASSERT(serial != RT_NULL);
  188. if (serial->parent.user_data != RT_NULL)
  189. {
  190. instance = (UART_CFG_T*)serial->parent.user_data;
  191. }
  192. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_TXDRDY);
  193. nrf_uart_task_trigger(instance->uart.reg.p_uart, NRF_UART_TASK_STARTTX);
  194. nrf_uart_txd_set(instance->uart.reg.p_uart, (uint8_t)c);
  195. while (!nrf_uart_event_check(instance->uart.reg.p_uart, NRF_UART_EVENT_TXDRDY))
  196. {
  197. }
  198. return 1;
  199. }
  200. static int _uart_getc(struct rt_serial_device *serial)
  201. {
  202. int ch = -1;
  203. UART_CFG_T *instance = working_cfg;
  204. RT_ASSERT(serial != RT_NULL);
  205. if (serial->parent.user_data != RT_NULL)
  206. {
  207. instance = (UART_CFG_T*)serial->parent.user_data;
  208. }
  209. if (nrf_uart_event_check(instance->uart.reg.p_uart, NRF_UART_EVENT_RXDRDY))
  210. {
  211. nrf_uart_event_clear(instance->uart.reg.p_uart, NRF_UART_EVENT_RXDRDY);
  212. ch = (int)(nrf_uart_rxd_get(instance->uart.reg.p_uart));
  213. }
  214. return ch;
  215. }
  216. static struct rt_uart_ops _uart_ops = {
  217. _uart_cfg,
  218. _uart_ctrl,
  219. _uart_putc,
  220. _uart_getc
  221. };
  222. void rt_hw_uart_init(void)
  223. {
  224. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  225. config.bufsz = RT_SERIAL_RB_BUFSZ;
  226. _serial0_0.config = config;
  227. _serial0_0.ops = &_uart_ops;
  228. uart0.serial = &_serial0_0;
  229. rt_hw_serial_register(&_serial0_0, "uart0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, &uart0);
  230. #if USE_UART0_1
  231. config.bufsz = UART0_RB_SIZE;
  232. _serial0_1.config = config;
  233. _serial0_1.ops = &_uart_ops;
  234. uart1.serial = &_serial0_1;
  235. rt_hw_serial_register(&_serial0_1, "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, &uart1);
  236. #endif
  237. }