bsp_uart.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "bsp_uart.h"
  2. /********************** 环形缓存区 *************************/
  3. static const int RxLen = 1024;
  4. static volatile unsigned char RxBuf[RxLen];
  5. static volatile unsigned char* RxW=RxBuf;
  6. static volatile unsigned char* RxR=RxBuf;
  7. void UART0_Push(unsigned char* p,int len)
  8. {
  9. volatile unsigned char *W=RxW; //这里要与上面指针相同
  10. if(len<=0) return;
  11. for(int i=0;i<len;i++){
  12. W=RxW+1; if(W>=RxBuf+RxLen) W=RxBuf; //取下一位置(到顶转到底)
  13. if(W!=RxR){*RxW=*(p+i); RxW=W;}
  14. else break;
  15. }
  16. }
  17. unsigned int UART0_CheckLen(void) //检查RX接收了多少数据
  18. {
  19. unsigned int Len; //short
  20. volatile unsigned char *W=RxW; volatile unsigned char *R=RxR;
  21. if(W>=R)Len=W-R;else Len=(W+RxLen)-R; //这样正确(中途中断改变也变不了结果)
  22. return Len;
  23. }
  24. unsigned char UART0_ReadByte(void) //读RX中数锯,地指加一,和丢弃
  25. {
  26. unsigned char R=*RxR; //读数
  27. if(RxR!=RxW){ if(RxR+1>=(RxBuf+RxLen))RxR =RxBuf; else RxR++;}//下标
  28. return R;
  29. }
  30. unsigned char UART0_CheckByte(unsigned short n) //看RX中数锯,地指不变,
  31. {
  32. volatile unsigned char *R=RxR+n;
  33. if(R>=(RxBuf+RxLen))R-=RxLen;
  34. return *R;
  35. }
  36. void UART0_Discard(unsigned short n) //丢弃RX数据几位
  37. {
  38. while(n){ n--;
  39. if(RxR==RxW) return;
  40. if(RxR+1>=RxBuf+RxLen){RxR=RxBuf;} else RxR++; //下标
  41. }
  42. }
  43. void UART0_SendChar(unsigned char ch)//发送一位数锯
  44. {
  45. NRF_UART0->TXD = (unsigned int)ch;
  46. while(NRF_UART0->EVENTS_TXDRDY == 0x0UL);
  47. NRF_UART0->EVENTS_TXDRDY = 0x0UL;
  48. }
  49. void UART0_SendBuff(unsigned char *p,int L)//发送缓存
  50. {
  51. unsigned int len = L;
  52. while (len>0){len--;
  53. UART0_SendChar(*p++);
  54. }
  55. }
  56. void UART0_SendStr(char *p)//发送字符串
  57. {
  58. while (*p){
  59. UART0_SendChar(*p++);
  60. }
  61. }
  62. void UART0_Test(void)
  63. {
  64. while(UART0_CheckLen()>0){
  65. // DEBUG_LOG("%02X ",UART0_ReadByte());
  66. DEBUG_LOG("%c",UART0_ReadByte());
  67. }
  68. }
  69. //*****************************************************************//
  70. void UARTE0_UART0_IRQHandler(void)
  71. {
  72. volatile unsigned char *W=RxW; //这里要与上面指针相同
  73. if(NRF_UART0->EVENTS_RXDRDY!=0){NRF_UART0->EVENTS_RXDRDY=0;
  74. W=RxW+1; if(W>=RxBuf+RxLen) W=RxBuf; //取下一位置(到顶转到底)
  75. if(W!=RxR){*RxW=NRF_UART0->RXD; RxW=W;}
  76. }
  77. if(NRF_UART0->EVENTS_RXTO!=0){NRF_UART0->EVENTS_RXTO=0;
  78. //DEBUG_LOG("EVENTS_RXTO\n");
  79. }
  80. if(NRF_UART0->EVENTS_CTS!=0){NRF_UART0->EVENTS_CTS=0;
  81. //DEBUG_LOG("EVENTS_CTS\n");
  82. }
  83. if(NRF_UART0->EVENTS_NCTS!=0){NRF_UART0->EVENTS_NCTS=0;
  84. //DEBUG_LOG("EVENTS_NCTS\n");
  85. }
  86. if(NRF_UART0->EVENTS_TXDRDY!=0){//NRF_UART0->EVENTS_TXDRDY=0;
  87. //DEBUG_LOG("EVENTS_TXDRDY\n");
  88. }
  89. if(NRF_UART0->EVENTS_ERROR!=0){NRF_UART0->EVENTS_ERROR=0;
  90. //DEBUG_LOG("EVENTS_ERROR=%d\n",NRF_UART0->EVENTS_ERROR);
  91. }
  92. }
  93. uint32_t get_baud(uint32_t baud)
  94. {
  95. switch(baud){
  96. case 1200: return UART_BAUDRATE_BAUDRATE_Baud1200;
  97. case 2400: return UART_BAUDRATE_BAUDRATE_Baud2400;
  98. case 4800: return UART_BAUDRATE_BAUDRATE_Baud4800;
  99. case 9600: return UART_BAUDRATE_BAUDRATE_Baud9600;
  100. case 14400: return UART_BAUDRATE_BAUDRATE_Baud14400;
  101. case 19200: return UART_BAUDRATE_BAUDRATE_Baud19200;
  102. case 28800: return UART_BAUDRATE_BAUDRATE_Baud28800;
  103. case 31250: return UART_BAUDRATE_BAUDRATE_Baud31250;
  104. case 38400: return UART_BAUDRATE_BAUDRATE_Baud38400;
  105. case 56000: return UART_BAUDRATE_BAUDRATE_Baud56000;
  106. case 57600: return UART_BAUDRATE_BAUDRATE_Baud57600;
  107. case 76800: return UART_BAUDRATE_BAUDRATE_Baud76800;
  108. case 115200: return UART_BAUDRATE_BAUDRATE_Baud115200;
  109. case 230400: return UART_BAUDRATE_BAUDRATE_Baud230400;
  110. case 250000: return UART_BAUDRATE_BAUDRATE_Baud250000;
  111. case 460800: return UART_BAUDRATE_BAUDRATE_Baud460800;
  112. case 921600: return UART_BAUDRATE_BAUDRATE_Baud921600;
  113. case 1000000: return UART_BAUDRATE_BAUDRATE_Baud1M;
  114. default: return UART_BAUDRATE_BAUDRATE_Baud115200;
  115. }
  116. }
  117. void UART0_Init(uint32_t baud)
  118. {
  119. NRF_UART0->INTENCLR = UART_INTENCLR_CTS_Msk | UART_INTENCLR_RXTO_Msk | UART_INTENCLR_NCTS_Msk | UART_INTENCLR_ERROR_Msk;
  120. NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Enabled << UART_INTENSET_RXDRDY_Pos;
  121. NRF_UART0->PSELTXD = PIN_TXD_BLE;
  122. NRF_UART0->PSELRXD = PIN_RXD_BLE;
  123. NRF_UART0->BAUDRATE = get_baud(baud);
  124. NRF_UART0->ENABLE |= UART_ENABLE_ENABLE_Enabled;
  125. NRF_UART0->TASKS_STARTTX = 0XFFFFFFFF;
  126. NRF_UART0->TASKS_STARTRX = 0XFFFFFFFF;
  127. NVIC_SetPriority(UARTE0_UART0_IRQn, 7);
  128. NVIC_EnableIRQ(UARTE0_UART0_IRQn);
  129. NRF_UART0->EVENTS_TXDRDY = 0x0UL;
  130. }