api_rt_uart.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. writeCount++;
  95. while ((USART_STAT0(Uarts[devIndex].UartBase) & 0x80) == 0)
  96. {
  97. ;
  98. }
  99. }
  100. }
  101. return writeCount;
  102. }
  103. void iUart_ReadAsync(uint8_t devIndex, uint8_t *data, uint8_t count, void (*cplt)(uint8_t *data, int16_t count), void (*error)())
  104. {
  105. if ((Uarts[devIndex].Status & ApiUart_ReadBusy) == 0)
  106. {
  107. Uarts[devIndex].Status |= ApiUart_ReadBusy;
  108. Uarts[devIndex].AsyncReadCount = count;
  109. Uarts[devIndex].AsyncReadAddr = data;
  110. Uarts[devIndex].AsyncReadCompleteCallback = cplt;
  111. Uarts[devIndex].AsyncReadErrorCallback = error;
  112. }
  113. }
  114. void iUart_WriteAsync(uint8_t devIndex, uint8_t *data, uint8_t count, void (*cplt)(), void (*error)())
  115. {
  116. if ((Uarts[devIndex].Status & ApiUart_WriteBusy) == 0)
  117. {
  118. Uarts[devIndex].Status |= ApiUart_WriteBusy;
  119. Uarts[devIndex].AsyncWriteCompleteCallback = cplt;
  120. Uarts[devIndex].AsyncWriteErrorCallback = error;
  121. DMA_CHMADDR(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)= (uint32_t)data;
  122. DMA_CHCNT(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)= count;
  123. USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
  124. DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)|= 0x00000001;
  125. // Uarts[devIndex].TxDmaChannelBase->CMAR = (uint32_t)data;
  126. // Uarts[devIndex].TxDmaChannelBase->CNDTR = count;
  127. // Uarts[devIndex].UartBase->ICR = UART_CLEAR_TCF;
  128. // Uarts[devIndex].TxDmaChannelBase->CCR |= 0x00000001;
  129. }
  130. }
  131. void iRtUart_RxIsr(uint8_t devIndex)
  132. {
  133. static uint16_t uwTempCount = 0;
  134. if (dma_flag_get(DMA1, DMA_CH2, DMA_INT_FLAG_FTF) != 0)
  135. {
  136. Uarts[0].RxBufferTail = 22;
  137. Uarts[0].RxBufferHead = 0;
  138. DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  139. //dma_flag_clear(DMA1, DMA_CH2, DMA_INT_FLAG_FTF);
  140. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH2);
  141. uwTempCount = 22 - DMA_CH2CNT(DMA1);
  142. DMA_CH2CNT(DMA1) = uwTempCount;
  143. DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
  144. }
  145. /* RX error */
  146. if (dma_flag_get(DMA1, DMA_CH2, DMA_FLAG_ERR) != 0)
  147. {
  148. DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  149. //dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_ERR);
  150. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH2);
  151. DMA_CH2CNT(DMA1) = 22;
  152. DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
  153. }
  154. if (Uarts[0].AsyncReadCount > 0 && iUart_Available(0) >= Uarts[0].AsyncReadCount)
  155. {
  156. iUart_Read(0, Uarts[0].AsyncReadAddr, Uarts[0].AsyncReadCount);
  157. if (Uarts[0].AsyncReadCompleteCallback != 0)
  158. {
  159. Uarts[0].AsyncReadCompleteCallback(Uarts[0].AsyncReadAddr, Uarts[0].AsyncReadCount);
  160. }
  161. Uarts[0].AsyncReadCount = 0;
  162. Uarts[0].Status &= ~ApiUart_ReadBusy;
  163. }
  164. }
  165. void iRtUart_AsyncWriteCompleteIsr(uint8_t devIndex)
  166. {
  167. DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)&= ~0x00000001;
  168. USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
  169. // Uarts[0].TxDmaChannelBase->CCR &= (uint16_t)(~DMA_CCR_EN);
  170. // Uarts[0].UartBase->ICR = UART_CLEAR_TCF;
  171. Uarts[devIndex].Status &= ~ApiUart_WriteBusy;
  172. if (Uarts[devIndex].AsyncWriteCompleteCallback != 0)
  173. {
  174. Uarts[devIndex].AsyncWriteCompleteCallback();
  175. }
  176. }
  177. void iRtUart_AsyncWriteErrorIsr(uint8_t devIndex)
  178. {
  179. DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)&= ~0x00000001;
  180. USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
  181. // Uarts[0].TxDmaChannelBase->CCR &= (uint16_t)(~DMA_CCR_EN);
  182. // Uarts[0].UartBase->ICR = UART_CLEAR_TCF;
  183. Uarts[devIndex].Status &= ~ApiUart_WriteBusy;
  184. if (Uarts[devIndex].AsyncWriteErrorCallback != 0)
  185. {
  186. Uarts[devIndex].AsyncWriteErrorCallback();
  187. }
  188. }