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.

261 lines
7.0 KiB

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