You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
5.4 KiB

2 years ago
  1. #include "zuart.hpp"
  2. #include <stdio.h>
  3. #include <string.h>
  4. using namespace iflytop;
  5. static ZUART *s_uart_table[10];
  6. static int s_numUart;
  7. static void prv_reg_uart(ZUART *uart) {
  8. if (s_numUart < 10) {
  9. s_uart_table[s_numUart++] = uart;
  10. }
  11. }
  12. ZUART *prv_find_uart(UART_HandleTypeDef *huart) {
  13. for (int i = 0; i < s_numUart; i++) {
  14. if (s_uart_table[i]->getHuart() == huart) {
  15. return s_uart_table[i];
  16. }
  17. }
  18. return NULL;
  19. }
  20. extern "C" {
  21. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
  22. ZUART *stm32uart = prv_find_uart(huart);
  23. if (stm32uart != NULL) stm32uart->HAL_UART_TxCpltCallback();
  24. }
  25. void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) {
  26. ZUART *stm32uart = prv_find_uart(huart);
  27. if (stm32uart != NULL) stm32uart->HAL_UART_TxHalfCpltCallback();
  28. }
  29. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  30. ZUART *stm32uart = prv_find_uart(huart);
  31. if (stm32uart != NULL) stm32uart->HAL_UART_RxCpltCallback();
  32. }
  33. void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) {
  34. ZUART *stm32uart = prv_find_uart(huart);
  35. if (stm32uart != NULL) stm32uart->HAL_UART_RxHalfCpltCallback();
  36. }
  37. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
  38. ZUART *stm32uart = prv_find_uart(huart);
  39. if (stm32uart != NULL) stm32uart->HAL_UART_ErrorCallback();
  40. }
  41. void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) {
  42. ZUART *stm32uart = prv_find_uart(huart);
  43. if (stm32uart != NULL) stm32uart->HAL_UART_AbortCpltCallback();
  44. }
  45. void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) {
  46. ZUART *stm32uart = prv_find_uart(huart);
  47. if (stm32uart != NULL) stm32uart->HAL_UART_AbortTransmitCpltCallback();
  48. }
  49. void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) {
  50. ZUART *stm32uart = prv_find_uart(huart);
  51. if (stm32uart != NULL) stm32uart->HAL_UART_AbortReceiveCpltCallback();
  52. }
  53. }
  54. IRQn_Type ZUART::getUartIRQType() {
  55. #ifdef USART1
  56. if (m_huart->Instance == USART1) {
  57. return USART1_IRQn;
  58. }
  59. #endif
  60. #ifdef USART2
  61. if (m_huart->Instance == USART2) {
  62. return USART2_IRQn;
  63. }
  64. #endif
  65. #ifdef USART3
  66. if (m_huart->Instance == USART3) {
  67. return USART3_IRQn;
  68. }
  69. #endif
  70. #ifdef UART4
  71. if (m_huart->Instance == UART4) {
  72. return UART4_IRQn;
  73. }
  74. #endif
  75. #ifdef UART5
  76. if (m_huart->Instance == UART5) {
  77. return UART5_IRQn;
  78. }
  79. #endif
  80. #ifdef USART6
  81. if (m_huart->Instance == USART6) {
  82. return USART6_IRQn;
  83. }
  84. #endif
  85. ZASSERT(false);
  86. return USART1_IRQn;
  87. }
  88. void ZUART::initialize(cfg_t *cfg, callback_t cb) {
  89. m_name = cfg->name;
  90. m_huart = cfg->huart;
  91. m_cb = cb;
  92. m_rxovertime_ms = cfg->rxovertime_ms;
  93. m_rxBuffer = (uint8_t *)malloc(cfg->rxbuffersize);
  94. memset(m_rxBuffer, 0, cfg->rxbuffersize);
  95. ZASSERT(m_rxBuffer != NULL);
  96. m_rxBufferLen = cfg->rxbuffersize;
  97. m_isRxing = false;
  98. m_dataIsReady = false;
  99. m_rxBufferPos = 0;
  100. m_lastRxTime = 0;
  101. onebyte = 0;
  102. ChipTimIrqShceduler::instance().regPeriodJob([this](ChipTimIrqShceduler::Job *job) { periodicJob(); }, 1);
  103. prv_reg_uart(this);
  104. }
  105. void ZUART::initialize(cfg_t *cfg) { initialize(cfg, NULL); }
  106. bool ZUART::tx(uint8_t *data, size_t len) {
  107. HAL_UART_Transmit(m_huart, data, len, 0xffff);
  108. return true;
  109. }
  110. bool ZUART::tx(const char *data) {
  111. HAL_UART_Transmit(m_huart, (uint8_t *)data, strlen(data), 0xffff);
  112. return true;
  113. }
  114. bool ZUART::startRxIt() {
  115. ZASSERT(m_rxBuffer != NULL);
  116. ZASSERT(NVIC_GetEnableIRQ(getUartIRQType()) != 0);
  117. if (m_isRxing) return true;
  118. m_isRxing = true;
  119. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  120. return true;
  121. }
  122. bool ZUART::dataIsReady() {
  123. // CriticalContext criticalContext;
  124. if (m_dataIsReady) {
  125. return true;
  126. }
  127. if (!m_dataIsReady && m_rxBufferPos != 0) {
  128. if (zchip_clock_hasspassed(m_lastRxTime) > (uint32_t)m_rxovertime_ms) {
  129. m_dataIsReady = true;
  130. return true;
  131. }
  132. }
  133. return false;
  134. }
  135. void ZUART::clearRxData() {
  136. // ZCriticalContext criticalContext;
  137. m_dataIsReady = false;
  138. memset(m_rxBuffer, 0, m_rxBufferLen);
  139. m_rxBufferPos = 0;
  140. }
  141. void ZUART::periodicJob() {
  142. if (dataIsReady()) {
  143. if (m_cb) {
  144. m_cb(m_rxBuffer, m_rxBufferPos);
  145. }
  146. clearRxData();
  147. }
  148. }
  149. /*******************************************************************************
  150. * *
  151. *******************************************************************************/
  152. void ZUART::HAL_UART_TxCpltCallback() {}
  153. void ZUART::HAL_UART_TxHalfCpltCallback() {}
  154. void ZUART::HAL_UART_RxCpltCallback() {
  155. if (m_dataIsReady) {
  156. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  157. return;
  158. }
  159. m_rxBuffer[m_rxBufferPos] = onebyte;
  160. m_rxBufferPos++;
  161. m_lastRxTime = zchip_clock_get_ticket();
  162. if (m_rxBufferPos >= m_rxBufferLen) {
  163. m_dataIsReady = true;
  164. }
  165. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  166. }
  167. void ZUART::HAL_UART_RxHalfCpltCallback() {}
  168. void ZUART::HAL_UART_ErrorCallback() {
  169. HAL_UART_AbortReceive_IT(m_huart);
  170. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  171. }
  172. void ZUART::HAL_UART_AbortCpltCallback() {}
  173. void ZUART::HAL_UART_AbortTransmitCpltCallback() {}
  174. void ZUART::HAL_UART_AbortReceiveCpltCallback() {}
  175. namespace iflytop {
  176. #if 0
  177. #ifdef USART1
  178. ZUART STM32_UART1("uart1", USART1);
  179. #endif
  180. #ifdef USART2
  181. ZUART STM32_UART2("uart2", USART2);
  182. #endif
  183. #ifdef USART3
  184. ZUART STM32_UART3("uart3", USART3);
  185. #endif
  186. #ifdef UART4
  187. ZUART STM32_UART4("uart4", UART4);
  188. #endif
  189. #ifdef UART5
  190. ZUART STM32_UART5("uart5", UART5);
  191. #endif
  192. #ifdef USART6
  193. ZUART STM32_UART6("uart6", USART6);
  194. #endif
  195. #endif
  196. } // namespace iflytop