Files
chrg/apps/boot/board/bsp_uart.h
T
2025-09-17 09:11:22 +08:00

146 lines
5.3 KiB
C

#ifndef __BSP_UART_H__
#define __BSP_UART_H__
#include "bsp_common.h"
#include "bsp_uart_config.h"
#define UART_INIT_PARA(x) \
{ \
.id = BSP_UART##x, \
.rx_buff = _uart##x##_buff, \
.rx_buff_max_len = BSP_UART_BUFF_SIZE, \
}
#define UART(x) _uart##x
#define UART_CREATE(x) static uint8_t _uart##x##_buff[BSP_UART_BUFF_SIZE]; \
static struct UART_STRUCT _uart##x = UART_INIT_PARA(x);
/* 定义项 */
typedef enum
{
#if (BSP_USING_UART1)
BSP_UART1 = 0x01,
#endif
#if (BSP_USING_UART2)
BSP_UART2 = 0x02,
#endif
#if (BSP_USING_UART2_RE)
BSP_UART2_RE = 0x82,
#endif
#if (BSP_USING_UART3)
BSP_UART3 = 0x03,
#endif
#if (BSP_USING_UART3_RE)
BSP_UART3_RE = 0x83,
#endif
#if (BSP_USING_UART4)
BSP_UART4 = 0x04,
#endif
#if (BSP_USING_UART5)
BSP_UART5 = 0x05,
#endif
#if (BSP_USING_UART6)
BSP_UART6 = 0x06,
#endif
} BSP_UART_ID;
typedef enum
{
BSP_UART_ERR_OK = 0x00U,
BSP_UART_ERR_COMM_ERR = 0x01U, /* 通讯错误(源自 HAL 库) */
BSP_UART_ERR_BUSY = 0x02U, /* UART 外设忙碌(源自 HAL 库) */
BSP_UART_ERR_TIMEOUT = 0x03U, /* 处理时间超时(源自 HAL 库) */
BSP_UART_ERR_NOT_FOUND = 0x04U, /* 未找到对应的 UART 对象 */
BSP_UART_ERR_LOCK_INIT_ERR = 0x05U, /* 通讯信号锁初始化失败 */
BSP_UART_ERR_LOCK_ERR = 0x06U, /* 通讯信号上锁失败 */
BSP_UART_ERR_UNLOCK_ERR = 0x07U, /* 通讯信号解锁失败 */
BSP_UART_ERR_NO_RECV_FRAME = 0x08U, /* 还未收到一帧完整的数据 */
BSP_UART_ERR_NO_INIT = 0x09U, /* 使用的 UART 对象还未初始化 */
BSP_UART_ERR_NAME_DUPLICATE = 0x0AU, /* UART 对象命名重复 */
} BSP_UART_ERR;
struct UART_STRUCT
{
UART_HandleTypeDef handle;
/* 串口唯一标识信息 */
const uint8_t id;
/* 用户串口数据,需要用户传入(二级缓存),当一级缓存半满和全满时,将会写入二级缓存 */
uint8_t *rx_data;
uint16_t * volatile rx_data_len;
uint16_t rx_data_max_len;
/* 一些标志位 */
volatile uint8_t init :1; /* 串口组件初始化标志位 */
volatile uint8_t rx_init :1; /* 串口组件的接收功能初始化标志位 */
// volatile uint8_t user_buff_full :1; /* 暂无使用 */
volatile uint8_t idle_flag :1; /* 是否发生空闲中断的标志位 */
volatile uint8_t :0;
/* 串口数据一级缓存(由 DMA 无条件写入) */
const uint8_t *rx_buff;
const uint16_t rx_buff_max_len;
/* 环形缓存的“写”位置 */
uint16_t old_pos;
/* 回调函数 */
uint8_t (*RX_Indicate)(struct UART_STRUCT *uart);
uint8_t (*TX_Complete)(struct UART_STRUCT *uart);
void *user_data;
};
typedef void (*UART_Callback_t)(struct UART_STRUCT *uart);
/**
* BSP UART 用户接口
*/
BSP_UART_ERR BSP_UART_Init (BSP_UART_ID id);
BSP_UART_ERR BSP_UART_EnableReceive (BSP_UART_ID id, uint8_t *data, uint16_t *len, uint16_t max_len);
BSP_UART_ERR BSP_UART_DisableReceive (BSP_UART_ID id);
BSP_UART_ERR BSP_UART_LinkUserData (BSP_UART_ID id, void *user_data);
BSP_UART_ERR BSP_UART_Send (BSP_UART_ID id, const uint8_t *data, uint16_t len, uint16_t timeout);
#if (ENABLE_DEBUG_PRINT)
void BSP_Printf (const char *fmt, ...);
#endif
BSP_UART_ERR BSP_UART_SetTxIndicate (BSP_UART_ID id, uint8_t (*TX_Complete)(struct UART_STRUCT *uart));
BSP_UART_ERR BSP_UART_ClearUserBuff (BSP_UART_ID id);
BSP_UART_ERR BSP_UART_IsFrameEnd (BSP_UART_ID id);
/**
* BSP UART 移植接口,不对外使用
*/
void BSP_UART_Port_Init ( struct UART_STRUCT *uart,
UART_Callback_t rx_callback,
UART_Callback_t rx_idle_callback,
UART_Callback_t dma_rx_callback,
UART_Callback_t dma_tx_callback);
BSP_UART_ERR BSP_UART_Port_EnableReceive (struct UART_STRUCT *uart);
BSP_UART_ERR BSP_UART_Port_DisableReceive (struct UART_STRUCT *uart);
BSP_UART_ERR BSP_UART_Port_Send (struct UART_STRUCT *uart, const uint8_t *data, uint16_t len, uint16_t timeout);
uint32_t BSP_UART_Port_GetDmaCounter (struct UART_STRUCT *uart);
uint32_t BSP_UART_Port_GetOneByte (struct UART_STRUCT *uart);
struct UART_STRUCT *BSP_UART_Port_GetHandle (BSP_UART_ID id);
/* 通讯锁 */
BSP_UART_ERR BSP_UART_Port_LockInit (struct UART_STRUCT *uart);
BSP_UART_ERR BSP_UART_Port_RxLock (struct UART_STRUCT *uart);
BSP_UART_ERR BSP_UART_Port_RxUnlock (struct UART_STRUCT *uart);
BSP_UART_ERR BSP_UART_Port_TxLock (struct UART_STRUCT *uart);
BSP_UART_ERR BSP_UART_Port_TxUnlock (struct UART_STRUCT *uart);
#endif