api_rt_uart.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "api_uart.h"
  2. #include "api_rt_uart.h"
  3. #include "api_rt_dbg.h"
  4. #include "board_config.h"
  5. #include "gd32f30x.h"
  6. ApiRtUart_Handle Uarts[1];
  7. uint8_t rxBuffer[UART_BUFFER_LENGTH];
  8. uint8_t txBuffer[UART_BUFFER_LENGTH];
  9. void iRtUart_Init()
  10. {
  11. Uarts[0].UartBase = UART3;
  12. Uarts[0].DmaBase = DMA1;
  13. Uarts[0].DmaChannelBase = DMA_CH4;
  14. // Uarts[0].TxDmaChannelBase = DMA1_Channel2;
  15. Uarts[0].Status = ApiUart_Idle;
  16. Uarts[0].RxBuffer = rxBuffer;
  17. Uarts[0].TxBuffer = txBuffer;
  18. Uarts[0].RxBufferHead = 0;
  19. Uarts[0].RxBufferTail = 0;
  20. Uarts[0].TxBufferCount = 0;
  21. Uarts[0].AsyncWriteCompleteCallback = 0;
  22. Uarts[0].AsyncReadCompleteCallback = 0;
  23. Uarts[0].AsyncWriteErrorCallback = 0;
  24. Uarts[0].AsyncReadErrorCallback = 0;
  25. Uarts[0].AsyncReadCount = 0;
  26. Uarts[0].AsyncReadAddr = 0;
  27. /*=======================================================================
  28. DMA1 Ch2 for UART3 receive
  29. =======================================================================*/
  30. dma_deinit(DMA1, DMA_CH2);
  31. dma_parameter_struct dma_init_struct;
  32. dma_init_struct.periph_addr = (uint32_t)(&USART_DATA(UART3));
  33. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  34. dma_init_struct.memory_addr = (uint32_t)(rxBuffer);
  35. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  36. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  37. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  38. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  39. dma_init_struct.number = 22;
  40. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  41. dma_init(DMA1, DMA_CH2, &dma_init_struct);
  42. dma_circulation_disable(DMA1, DMA_CH2);
  43. /* enable DMA1 channel2 */
  44. dma_channel_enable(DMA1, DMA_CH2);
  45. }
  46. void iUart_Open(uint8_t devIndex, uint32_t baudrate)
  47. {
  48. USART_BAUD(Uarts[devIndex].UartBase)=(HW_MCU_CLOCK_HZ / baudrate);
  49. USART_CTL0(Uarts[devIndex].UartBase) |= 0x00000001;
  50. // Uarts[devIndex].UartBase->BRR = (HW_MCU_CLOCK_HZ / baudrate);
  51. // Uarts[devIndex].UartBase->CR1 |= 0x00000001;
  52. }
  53. void iUart_Close(uint8_t devIndex)
  54. {
  55. USART_CTL0(Uarts[devIndex].UartBase) &= ~(0x00000001UL);
  56. // Uarts[devIndex].UartBase->CR1 &= ~(0x00000001UL);
  57. }
  58. ApiUart_Status iUart_GetStatus(uint8_t devIndex)
  59. {
  60. return ApiUart_Idle;
  61. }
  62. int16_t iUart_Available(uint8_t devIndex)
  63. {
  64. return (Uarts[devIndex].RxBufferTail + UART_BUFFER_LENGTH - Uarts[devIndex].RxBufferHead) % UART_BUFFER_LENGTH;
  65. }
  66. int16_t iUart_GetWriteBufferSpace(uint8_t devIndex)
  67. {
  68. return UART_BUFFER_LENGTH;
  69. }
  70. int16_t iUart_Read(uint8_t devIndex, uint8_t *data, int16_t count)
  71. {
  72. int16_t readCount = 0;
  73. // data[readCount] = Uarts[devIndex].RxBuffer[Uarts[devIndex].RxBufferHead];
  74. if ((Uarts[devIndex].Status & ApiUart_ReadBusy) == 0)
  75. {
  76. while (Uarts[devIndex].RxBufferHead != Uarts[devIndex].RxBufferTail && readCount < count)
  77. {
  78. data[readCount] = Uarts[devIndex].RxBuffer[Uarts[devIndex].RxBufferHead];
  79. Uarts[devIndex].RxBufferHead += 1;
  80. Uarts[devIndex].RxBufferHead %= UART_BUFFER_LENGTH;
  81. readCount++;
  82. }
  83. }
  84. return readCount;
  85. }
  86. int16_t iUart_Write(uint8_t devIndex, uint8_t *data, int16_t count)
  87. {
  88. int16_t writeCount = 0;
  89. if ((Uarts[devIndex].Status & ApiUart_WriteBusy) == 0)
  90. {
  91. while (writeCount < count)
  92. {
  93. USART_DATA(Uarts[devIndex].UartBase) = data[writeCount];
  94. while ((USART_STAT0(Uarts[devIndex].UartBase) & 0x80) == 0)
  95. {
  96. ;
  97. }
  98. // Uarts[devIndex].UartBase->TDR = data[writeCount];
  99. // while ((Uarts[devIndex].UartBase->ISR & 0x80) == 0)
  100. // {
  101. // ;
  102. // }
  103. }
  104. }
  105. return writeCount;
  106. }
  107. void iUart_ReadAsync(uint8_t devIndex, uint8_t *data, uint8_t count, void (*cplt)(uint8_t *data, int16_t count), void (*error)())
  108. {
  109. if ((Uarts[devIndex].Status & ApiUart_ReadBusy) == 0)
  110. {
  111. Uarts[devIndex].Status |= ApiUart_ReadBusy;
  112. Uarts[devIndex].AsyncReadCount = count;
  113. Uarts[devIndex].AsyncReadAddr = data;
  114. Uarts[devIndex].AsyncReadCompleteCallback = cplt;
  115. Uarts[devIndex].AsyncReadErrorCallback = error;
  116. }
  117. }
  118. void iUart_WriteAsync(uint8_t devIndex, uint8_t *data, uint8_t count, void (*cplt)(), void (*error)())
  119. {
  120. if ((Uarts[devIndex].Status & ApiUart_WriteBusy) == 0)
  121. {
  122. Uarts[devIndex].Status |= ApiUart_WriteBusy;
  123. Uarts[devIndex].AsyncWriteCompleteCallback = cplt;
  124. Uarts[devIndex].AsyncWriteErrorCallback = error;
  125. DMA_CHMADDR(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)= (uint32_t)data;
  126. DMA_CHCNT(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)= count;
  127. USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
  128. DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)|= 0x00000001;
  129. // Uarts[devIndex].TxDmaChannelBase->CMAR = (uint32_t)data;
  130. // Uarts[devIndex].TxDmaChannelBase->CNDTR = count;
  131. // Uarts[devIndex].UartBase->ICR = UART_CLEAR_TCF;
  132. // Uarts[devIndex].TxDmaChannelBase->CCR |= 0x00000001;
  133. }
  134. }
  135. void iRtUart_RxIsr(uint8_t devIndex)
  136. {
  137. static uint16_t uwTempCount = 0;
  138. if (dma_flag_get(DMA1, DMA_CH2, DMA_INT_FLAG_FTF) != 0)
  139. {
  140. Uarts[0].RxBufferTail = 22;
  141. Uarts[0].RxBufferHead = 0;
  142. DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  143. //dma_flag_clear(DMA1, DMA_CH2, DMA_INT_FLAG_FTF);
  144. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH2);
  145. uwTempCount = 22 - DMA_CH2CNT(DMA1);
  146. DMA_CH2CNT(DMA1) = uwTempCount;
  147. DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
  148. }
  149. /* RX error */
  150. if (dma_flag_get(DMA1, DMA_CH2, DMA_FLAG_ERR) != 0)
  151. {
  152. DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  153. //dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_ERR);
  154. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH2);
  155. DMA_CH2CNT(DMA1) = 22;
  156. DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
  157. }
  158. if (Uarts[0].AsyncReadCount > 0 && iUart_Available(0) >= Uarts[0].AsyncReadCount)
  159. {
  160. iUart_Read(0, Uarts[0].AsyncReadAddr, Uarts[0].AsyncReadCount);
  161. if (Uarts[0].AsyncReadCompleteCallback != 0)
  162. {
  163. Uarts[0].AsyncReadCompleteCallback(Uarts[0].AsyncReadAddr, Uarts[0].AsyncReadCount);
  164. }
  165. Uarts[0].AsyncReadCount = 0;
  166. Uarts[0].Status &= ~ApiUart_ReadBusy;
  167. }
  168. }
  169. void iRtUart_AsyncWriteCompleteIsr(uint8_t devIndex)
  170. {
  171. DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)&= ~0x00000001;
  172. USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
  173. // Uarts[0].TxDmaChannelBase->CCR &= (uint16_t)(~DMA_CCR_EN);
  174. // Uarts[0].UartBase->ICR = UART_CLEAR_TCF;
  175. Uarts[devIndex].Status &= ~ApiUart_WriteBusy;
  176. if (Uarts[devIndex].AsyncWriteCompleteCallback != 0)
  177. {
  178. Uarts[devIndex].AsyncWriteCompleteCallback();
  179. }
  180. }
  181. void iRtUart_AsyncWriteErrorIsr(uint8_t devIndex)
  182. {
  183. DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)&= ~0x00000001;
  184. USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
  185. // Uarts[0].TxDmaChannelBase->CCR &= (uint16_t)(~DMA_CCR_EN);
  186. // Uarts[0].UartBase->ICR = UART_CLEAR_TCF;
  187. Uarts[devIndex].Status &= ~ApiUart_WriteBusy;
  188. if (Uarts[devIndex].AsyncWriteErrorCallback != 0)
  189. {
  190. Uarts[devIndex].AsyncWriteErrorCallback();
  191. }
  192. }