/* Includes ----------------------------------------------------------------- */ #include "uart_it.h" /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private typedef ---------------------------------------------------------- */ /* Private variables -------------------------------------------------------- */ static void (*UART_Callback[BSP_UART_NUM][BSP_UART_CB_NUM])(void); /*获取对应的 BSP_UART_t 类型 */ static BSP_UART_t UART_Get(UART_HandleTypeDef *huart) { if (huart->Instance == USART3) return BSP_UART_DR16; else if (huart->Instance == USART1) return BSP_UART_REF; else if (huart->Instance == USART6) return BSP_UART_AI; /* else if (huart->Instance == USARTX) return BSP_UART_XXX; */ else return BSP_UART_ERR; } /* 获取使用的串口 */ UART_HandleTypeDef *BSP_UART_GetHandle(BSP_UART_t uart) { switch (uart) { case BSP_UART_DR16: return &huart3; case BSP_UART_REF: return &huart1; case BSP_UART_AI: return &huart6; /* case BSP_UART_XXX: return &huartX; */ default: return NULL; } } /*UART 传输完成中断回调函数,当 UART 传输完成时会触发该回调*/ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_TX_CPLT_CB]) { UART_Callback[bsp_uart][BSP_UART_TX_CPLT_CB](); } } } /*是一个 UART 传输半完成中断回调函数*/ void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_TX_HALF_CPLT_CB]) { UART_Callback[bsp_uart][BSP_UART_TX_HALF_CPLT_CB](); } } } //在go里写了这个函数 // void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // BSP_UART_t bsp_uart = UART_Get(huart); // if (bsp_uart != BSP_UART_ERR) { // if (UART_Callback[bsp_uart][BSP_UART_RX_CPLT_CB]) { // UART_Callback[bsp_uart][BSP_UART_RX_CPLT_CB](); // } // } // } void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_RX_HALF_CPLT_CB]) { UART_Callback[bsp_uart][BSP_UART_RX_HALF_CPLT_CB](); } } } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_ERROR_CB]) { UART_Callback[bsp_uart][BSP_UART_ERROR_CB](); } } } /*传输中止*/ void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_ABORT_CPLT_CB]) { UART_Callback[bsp_uart][BSP_UART_ABORT_CPLT_CB](); } } } void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_ABORT_TX_CPLT_CB]) { UART_Callback[bsp_uart][BSP_UART_ABORT_TX_CPLT_CB](); } } } void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (bsp_uart != BSP_UART_ERR) { if (UART_Callback[bsp_uart][BSP_UART_ABORT_RX_CPLT_CB]) { UART_Callback[bsp_uart][BSP_UART_ABORT_RX_CPLT_CB](); } } } /* UART 空闲中断回调函数,当 UART 接收到数据并且总线空闲时会触发该回调 */ void BSP_UART_IdleCallback(UART_HandleTypeDef *huart) { BSP_UART_t bsp_uart = UART_Get(huart); if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) { __HAL_UART_CLEAR_IDLEFLAG(huart); UART_Callback[bsp_uart][BSP_UART_IDLE_LINE_CB](); } } /* 注册UART的回调函数 串口初始化 */ int8_t BSP_UART_RegisterCallback(BSP_UART_t uart, BSP_UART_Callback_t type, void (*callback)(void)) { if (callback == NULL) return BSP_ERR_NULL; UART_Callback[uart][type] = callback; return BSP_OK; }