235 lines
6.1 KiB
C
235 lines
6.1 KiB
C
#include "bsp_uart.h"
|
|
|
|
#include "main.h"
|
|
#include "stm32f4xx_hal_dma.h"
|
|
#include "stm32f4xx_it.h"
|
|
|
|
extern UART_HandleTypeDef huart2;
|
|
extern UART_HandleTypeDef huart1;
|
|
extern UART_HandleTypeDef huart6;
|
|
extern UART_HandleTypeDef huart4;
|
|
extern UART_HandleTypeDef huart3;
|
|
extern UART_HandleTypeDef huart5;
|
|
|
|
extern DMA_HandleTypeDef hdma_usart3_rx;
|
|
extern DMA_HandleTypeDef hdma_usart3_tx;
|
|
extern DMA_HandleTypeDef hdma_uart5_rx;
|
|
extern DMA_HandleTypeDef hdma_uart5_tx;
|
|
|
|
extern DMA_HandleTypeDef hdma_uart4_rx;
|
|
extern DMA_HandleTypeDef hdma_usart1_tx;
|
|
extern DMA_HandleTypeDef hdma_usart1_rx;
|
|
extern DMA_HandleTypeDef hdma_usart2_tx;
|
|
extern DMA_HandleTypeDef hdma_usart2_rx;
|
|
extern DMA_HandleTypeDef hdma_usart6_rx;
|
|
extern DMA_HandleTypeDef hdma_usart6_tx;
|
|
|
|
static bsp_callback_t callback_list[BSP_UART_NUM][BSP_UART_CB_NUM];
|
|
|
|
static bsp_uart_t uart_get(UART_HandleTypeDef *huart) {
|
|
if (huart->Instance == UART4) {
|
|
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 == USART2) {
|
|
return BSP_UART_EXT;
|
|
} else if (huart->Instance == USART3) {
|
|
return BSP_UART_CAN3;
|
|
} else if (huart->Instance == UART5) {
|
|
return BSP_UART_CAN4;
|
|
} /*
|
|
else if (huart->Instance == USARTX)
|
|
return BSP_UART_XXX;
|
|
*/
|
|
else {
|
|
return BSP_UART_ERR;
|
|
}
|
|
}
|
|
|
|
static void bsp_uart_callback(bsp_uart_callback_t cb_type,
|
|
UART_HandleTypeDef *huart) {
|
|
bsp_uart_t bsp_uart = uart_get(huart);
|
|
if (bsp_uart != BSP_UART_ERR) {
|
|
bsp_callback_t cb = callback_list[bsp_uart][cb_type];
|
|
|
|
if (cb.fn) {
|
|
cb.fn(cb.arg);
|
|
}
|
|
}
|
|
}
|
|
|
|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_TX_CPLT_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_TX_HALF_CPLT_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_RX_CPLT_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_RX_HALF_CPLT_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_ERROR_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_ABORT_CPLT_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_ABORT_TX_CPLT_CB, huart);
|
|
}
|
|
|
|
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) {
|
|
bsp_uart_callback(BSP_UART_ABORT_RX_CPLT_CB, huart);
|
|
}
|
|
|
|
void bsp_uart_irq_handler(UART_HandleTypeDef *huart) {
|
|
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) {
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
bsp_uart_callback(BSP_UART_IDLE_LINE_CB, huart);
|
|
}
|
|
}
|
|
|
|
UART_HandleTypeDef *bsp_uart_get_handle(bsp_uart_t uart) {
|
|
switch (uart) {
|
|
case BSP_UART_DR16:
|
|
return &huart4;
|
|
case BSP_UART_REF:
|
|
return &huart1;
|
|
case BSP_UART_AI:
|
|
return &huart6;
|
|
case BSP_UART_EXT:
|
|
return &huart2;
|
|
case BSP_UART_CAN3:
|
|
return &huart3;
|
|
case BSP_UART_CAN4:
|
|
return &huart5;
|
|
/*
|
|
case BSP_UART_XXX:
|
|
return &huartX;
|
|
*/
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void bsp_uart_init() {
|
|
HAL_UART_RegisterUserCallback(bsp_uart_irq_handler);
|
|
__HAL_UART_ENABLE_IT(bsp_uart_get_handle(BSP_UART_REF), UART_IT_IDLE);
|
|
__HAL_UART_ENABLE_IT(bsp_uart_get_handle(BSP_UART_CAN3), UART_IT_IDLE);
|
|
__HAL_UART_ENABLE_IT(bsp_uart_get_handle(BSP_UART_CAN4), UART_IT_IDLE);
|
|
}
|
|
|
|
bsp_status_t bsp_uart_register_callback(bsp_uart_t uart,
|
|
bsp_uart_callback_t type,
|
|
void (*callback)(void *arg),
|
|
void *callback_arg) {
|
|
assert_param(callback);
|
|
assert_param(type != BSP_UART_CB_NUM);
|
|
|
|
callback_list[uart][type].fn = callback;
|
|
callback_list[uart][type].arg = callback_arg;
|
|
return BSP_OK;
|
|
}
|
|
|
|
bsp_status_t bsp_uart_abort_receive(bsp_uart_t uart) {
|
|
HAL_UART_AbortReceive_IT(bsp_uart_get_handle(uart));
|
|
|
|
switch (uart) {
|
|
case BSP_UART_DR16: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_uart4_rx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_REF: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart1_rx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_AI: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart6_rx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_EXT: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart2_rx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_CAN3: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart3_rx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_CAN4: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_uart5_rx, 0);
|
|
break;
|
|
}
|
|
default:
|
|
return BSP_ERR;
|
|
}
|
|
return BSP_OK;
|
|
}
|
|
|
|
bsp_status_t bsp_uart_abort_transmit(bsp_uart_t uart) {
|
|
HAL_UART_AbortTransmit_IT(bsp_uart_get_handle(uart));
|
|
|
|
switch (uart) {
|
|
case BSP_UART_DR16: {
|
|
return BSP_ERR;
|
|
break;
|
|
}
|
|
case BSP_UART_REF: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart1_tx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_AI: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart6_tx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_CAN3: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_usart3_tx, 0);
|
|
break;
|
|
}
|
|
case BSP_UART_CAN4: {
|
|
__HAL_DMA_SET_COUNTER(&hdma_uart5_tx, 0);
|
|
break;
|
|
}
|
|
default:
|
|
return BSP_ERR;
|
|
}
|
|
|
|
return BSP_OK;
|
|
}
|
|
|
|
bsp_status_t bsp_uart_transmit(bsp_uart_t uart, uint8_t *data, size_t size,
|
|
bool block) {
|
|
if (block) {
|
|
return HAL_UART_Transmit(bsp_uart_get_handle(uart), data, size, 10) !=
|
|
HAL_OK;
|
|
} else {
|
|
return HAL_UART_Transmit_DMA(bsp_uart_get_handle(uart), data, size) !=
|
|
HAL_OK;
|
|
}
|
|
}
|
|
|
|
bsp_status_t bsp_uart_receive(bsp_uart_t uart, uint8_t *buff, size_t size,
|
|
bool block) {
|
|
if (block) {
|
|
return HAL_UART_Receive(bsp_uart_get_handle(uart), buff, size, 10) !=
|
|
HAL_OK;
|
|
} else {
|
|
return HAL_UART_Receive_DMA(bsp_uart_get_handle(uart), buff, size) !=
|
|
HAL_OK;
|
|
}
|
|
}
|
|
|
|
uint32_t bsp_uart_get_count(bsp_uart_t uart) {
|
|
return bsp_uart_get_handle(uart)->RxXferSize -
|
|
__HAL_DMA_GET_COUNTER(bsp_uart_get_handle(uart)->hdmarx);
|
|
}
|