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.

231 lines
5.6 KiB

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