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.

223 lines
5.7 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "zuart.hpp"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. using namespace iflytop;
  6. static ZUART *s_uart_table[10];
  7. static int s_numUart;
  8. static void prv_reg_uart(ZUART *uart) {
  9. if (s_numUart < 10) {
  10. s_uart_table[s_numUart++] = uart;
  11. }
  12. }
  13. ZUART *prv_find_uart(UART_HandleTypeDef *huart) {
  14. for (int i = 0; i < s_numUart; i++) {
  15. if (s_uart_table[i]->getHuart() == huart) {
  16. return s_uart_table[i];
  17. }
  18. }
  19. return NULL;
  20. }
  21. extern "C" {
  22. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
  23. ZUART *stm32uart = prv_find_uart(huart);
  24. if (stm32uart != NULL) stm32uart->HAL_UART_TxCpltCallback();
  25. }
  26. void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) {
  27. ZUART *stm32uart = prv_find_uart(huart);
  28. if (stm32uart != NULL) stm32uart->HAL_UART_TxHalfCpltCallback();
  29. }
  30. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  31. ZUART *stm32uart = prv_find_uart(huart);
  32. if (stm32uart != NULL) stm32uart->HAL_UART_RxCpltCallback();
  33. }
  34. void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) {
  35. ZUART *stm32uart = prv_find_uart(huart);
  36. if (stm32uart != NULL) stm32uart->HAL_UART_RxHalfCpltCallback();
  37. }
  38. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
  39. ZUART *stm32uart = prv_find_uart(huart);
  40. if (stm32uart != NULL) stm32uart->HAL_UART_ErrorCallback();
  41. }
  42. void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) {
  43. ZUART *stm32uart = prv_find_uart(huart);
  44. if (stm32uart != NULL) stm32uart->HAL_UART_AbortCpltCallback();
  45. }
  46. void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) {
  47. ZUART *stm32uart = prv_find_uart(huart);
  48. if (stm32uart != NULL) stm32uart->HAL_UART_AbortTransmitCpltCallback();
  49. }
  50. void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) {
  51. ZUART *stm32uart = prv_find_uart(huart);
  52. if (stm32uart != NULL) stm32uart->HAL_UART_AbortReceiveCpltCallback();
  53. }
  54. }
  55. IRQn_Type ZUART::getUartIRQType() {
  56. #ifdef USART1
  57. if (m_huart->Instance == USART1) {
  58. return USART1_IRQn;
  59. }
  60. #endif
  61. #ifdef USART2
  62. if (m_huart->Instance == USART2) {
  63. return USART2_IRQn;
  64. }
  65. #endif
  66. #ifdef USART3
  67. if (m_huart->Instance == USART3) {
  68. return USART3_IRQn;
  69. }
  70. #endif
  71. #ifdef UART4
  72. if (m_huart->Instance == UART4) {
  73. return UART4_IRQn;
  74. }
  75. #endif
  76. #ifdef UART5
  77. if (m_huart->Instance == UART5) {
  78. return UART5_IRQn;
  79. }
  80. #endif
  81. #ifdef USART6
  82. if (m_huart->Instance == USART6) {
  83. return USART6_IRQn;
  84. }
  85. #endif
  86. ZEARLY_ASSERT(false);
  87. return USART1_IRQn;
  88. }
  89. void ZUART::initialize(cfg_t *cfg, callback_t cb) {
  90. m_name = cfg->name;
  91. m_huart = cfg->huart;
  92. m_cb = cb;
  93. m_rxovertime_ms = cfg->rxovertime_ms;
  94. m_rxBuffer = (uint8_t *)malloc(cfg->rxbuffersize);
  95. memset(m_rxBuffer, 0, cfg->rxbuffersize);
  96. ZEARLY_ASSERT(m_rxBuffer != NULL);
  97. m_rxBufferLen = cfg->rxbuffersize;
  98. m_isRxing = false;
  99. m_dataIsReady = false;
  100. m_rxBufferPos = 0;
  101. m_lastRxTime = 0;
  102. onebyte = 0;
  103. ChipTimIrqShceduler::instance().regPeriodJob([this](ChipTimIrqShceduler::Job *job) { periodicJob(); }, 1);
  104. prv_reg_uart(this);
  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. ZEARLY_ASSERT(m_rxBuffer != NULL);
  117. ZEARLY_ASSERT(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 (zchip_clock_hasspassed(m_lastRxTime) > (uint32_t)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. if (m_isRxing) {
  150. if (!(HAL_UART_GetState(m_huart) == HAL_UART_STATE_BUSY_RX || HAL_UART_GetState(m_huart) == HAL_UART_STATE_BUSY_TX_RX)) {
  151. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  152. }
  153. }
  154. }
  155. /*******************************************************************************
  156. * *
  157. *******************************************************************************/
  158. void ZUART::HAL_UART_TxCpltCallback() {}
  159. void ZUART::HAL_UART_TxHalfCpltCallback() {}
  160. void ZUART::HAL_UART_RxCpltCallback() {
  161. if (m_dataIsReady) {
  162. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  163. return;
  164. }
  165. m_rxBuffer[m_rxBufferPos] = onebyte;
  166. m_rxBufferPos++;
  167. m_lastRxTime = zchip_clock_get_ticket();
  168. if (m_rxBufferPos >= m_rxBufferLen) {
  169. m_dataIsReady = true;
  170. }
  171. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  172. }
  173. void ZUART::HAL_UART_RxHalfCpltCallback() {}
  174. void ZUART::HAL_UART_ErrorCallback() {
  175. HAL_UART_AbortReceive_IT(m_huart);
  176. HAL_UART_Receive_IT(m_huart, &onebyte, 1);
  177. }
  178. void ZUART::HAL_UART_AbortCpltCallback() {}
  179. void ZUART::HAL_UART_AbortTransmitCpltCallback() {}
  180. void ZUART::HAL_UART_AbortReceiveCpltCallback() {}
  181. namespace iflytop {
  182. #if 0
  183. #ifdef USART1
  184. ZUART STM32_UART1("uart1", USART1);
  185. #endif
  186. #ifdef USART2
  187. ZUART STM32_UART2("uart2", USART2);
  188. #endif
  189. #ifdef USART3
  190. ZUART STM32_UART3("uart3", USART3);
  191. #endif
  192. #ifdef UART4
  193. ZUART STM32_UART4("uart4", UART4);
  194. #endif
  195. #ifdef UART5
  196. ZUART STM32_UART5("uart5", UART5);
  197. #endif
  198. #ifdef USART6
  199. ZUART STM32_UART6("uart6", USART6);
  200. #endif
  201. #endif
  202. } // namespace iflytop