241 lines
8.0 KiB
C
241 lines
8.0 KiB
C
/**
|
||
* @file cm_uart.h
|
||
* @brief UART接口
|
||
* @copyright Copyright © 2021 China Mobile IOT. All rights reserved.
|
||
* @author By ZHANGXW
|
||
* @date 2021/03/09
|
||
*
|
||
* @defgroup uart uart
|
||
* @ingroup PI
|
||
* @{
|
||
*/
|
||
|
||
#ifndef __CM_UART_H__
|
||
#define __CM_UART_H__
|
||
|
||
/****************************************************************************
|
||
* Included Files
|
||
****************************************************************************/
|
||
|
||
#include <stdint.h>
|
||
|
||
/****************************************************************************
|
||
* Pre-processor Definitions
|
||
****************************************************************************/
|
||
|
||
/** 标准波特率 */
|
||
#define CM_UART_BAUDRATE_300 (300U)
|
||
#define CM_UART_BAUDRATE_600 (600U)
|
||
#define CM_UART_BAUDRATE_1200 (1200U)
|
||
#define CM_UART_BAUDRATE_2400 (2400U)
|
||
#define CM_UART_BAUDRATE_4800 (4800U)
|
||
#define CM_UART_BAUDRATE_9600 (9600U)
|
||
#define CM_UART_BAUDRATE_14400 (14400U)
|
||
#define CM_UART_BAUDRATE_19200 (19200U)
|
||
#define CM_UART_BAUDRATE_28800 (28800U)
|
||
#define CM_UART_BAUDRATE_38400 (38400U)
|
||
#define CM_UART_BAUDRATE_57600 (57600U)
|
||
#define CM_UART_BAUDRATE_76800 (76800U)
|
||
#define CM_UART_BAUDRATE_115200 (115200U)
|
||
#define CM_UART_BAUDRATE_230400 (230400U)
|
||
#define CM_UART_BAUDRATE_460800 (460800U)
|
||
#define CM_UART_BAUDRATE_921600 (921600U)
|
||
|
||
/** 特殊波特率 */
|
||
/* 注意事项:受分频时钟影响,当某串口配置成某一特殊波特率后,分频时钟即被修改,即之后所有配置成普通模式的串口仅支持该特殊波特率。
|
||
* 配置成低功耗模式的串口采用单独的分频时钟,故不受该影响,即低功耗模式的串口依然可以使用115200及以下的标准波特率(不支持76800)。
|
||
* 若某串口配置成任意特殊波特率后,GNSS功能将无法正常使用。
|
||
* 示例:若某一串口配置成256000波特率的普通模式,则之后所有配置成普通模式的串口仅支持256000波特率,而配置成低功耗模式的串口依然支持115200及以下的标准波特率(不支持76800)。
|
||
*/
|
||
#define CM_UART_BAUDRATE_256000 (256000U)
|
||
#define CM_UART_BAUDRATE_2000000 (2000000U)
|
||
|
||
/****************************************************************************
|
||
* Public Types
|
||
****************************************************************************/
|
||
|
||
/** 设备ID ,详情参照资源综述*/
|
||
/* FOTA升级期间,可能会有数据从主串口吐出(对应ML307A、ML305A为UART0,ML302A为UART1),用户无需关注该数据,也不应处理该数据 */
|
||
/* 对于ML307A,UART2和GNSS有冲突,两者不可同时使用 */
|
||
typedef enum{
|
||
CM_UART_DEV_0, /*!< 设备0*/
|
||
CM_UART_DEV_1, /*!< 设备1*/
|
||
CM_UART_DEV_2, /*!< 设备2*/
|
||
CM_UART_DEV_NUM
|
||
} cm_uart_dev_e;
|
||
|
||
/** 数据位 */
|
||
typedef enum{
|
||
CM_UART_BYTE_SIZE_8 = 8,
|
||
CM_UART_BYTE_SIZE_7 = 7,
|
||
CM_UART_BYTE_SIZE_6 = 6,
|
||
CM_UART_BYTE_SIZE_5 = 5,
|
||
} cm_uart_byte_size_e;
|
||
|
||
/** 奇偶校验 */
|
||
typedef enum{
|
||
CM_UART_PARITY_NONE,
|
||
CM_UART_PARITY_ODD,
|
||
CM_UART_PARITY_EVEN,
|
||
CM_UART_PARITY_MARK, /*!< 不支持*/
|
||
CM_UART_PARITY_SPACE /*!< 不支持*/
|
||
} cm_uart_parity_e;
|
||
|
||
/** 停止位 */
|
||
typedef enum{
|
||
CM_UART_STOP_BIT_ONE,
|
||
CM_UART_STOP_BIT_ONE_HALF,
|
||
CM_UART_STOP_BIT_TWO
|
||
} cm_uart_stop_bit_e;
|
||
|
||
/** 流控制 */
|
||
typedef enum{
|
||
CM_UART_FLOW_CTRL_NONE,
|
||
CM_UART_FLOW_CTRL_HW, /*!< 当前不支持流控*/
|
||
} cm_uart_flow_ctrl_e;
|
||
|
||
/** 结果码 */
|
||
typedef enum{
|
||
CM_UART_RET_OK = 0,
|
||
CM_UART_RET_INVALID_PARAM = -1,
|
||
} cm_uart_ret_e;
|
||
|
||
/** 配置 */
|
||
typedef struct{
|
||
cm_uart_byte_size_e byte_size; /*!< 数据位,枚举*/
|
||
cm_uart_parity_e parity; /*!< 校验位,枚举*/
|
||
cm_uart_stop_bit_e stop_bit; /*!< 停止位,枚举*/
|
||
cm_uart_flow_ctrl_e flow_ctrl; /*!< 流控制,枚举*/
|
||
int baudrate; /*!< 波特率,支持的波特率见本文件中标准波特率宏定义和特殊波特率宏定义*/
|
||
int is_lpuart; /*!< 1:低功耗串口(仅支持115200以内的标准波特率(不支持76800));0:普通串口*/
|
||
} cm_uart_cfg_t;
|
||
|
||
/** 事件类型 */
|
||
typedef enum
|
||
{
|
||
CM_UART_EVENT_TYPE_RX_ARRIVED = (1 << 0), /*!< 接收到新的数据*/
|
||
CM_UART_EVENT_TYPE_RX_OVERFLOW = (1 << 1), /*!< 接收FIFO缓存溢出*/
|
||
CM_UART_EVENT_TYPE_TX_COMPLETE = (1 << 2)/*!< 不支持发送完成事件*/
|
||
}cm_uart_event_type_e;
|
||
|
||
/** 事件 */
|
||
typedef struct{
|
||
uint32_t event_type; /*!< 事件类型,数据可读等*/
|
||
void *event_param; /*!< 事件参数*/
|
||
void *event_entry; /*!< 事件执行入口*/
|
||
} cm_uart_event_t;
|
||
|
||
typedef void (*cm_uart_event_cb_t)(void *param, uint32_t evt);
|
||
|
||
/****************************************************************************
|
||
* Public Data
|
||
****************************************************************************/
|
||
|
||
|
||
/****************************************************************************
|
||
* Public Function Prototypes
|
||
****************************************************************************/
|
||
|
||
/****************************************************************************
|
||
***********************UART使用注意事项*************************************
|
||
* 1、UART引脚和SD卡控制引脚所用PIN脚存在复用关系,若用户使用此PIN脚进行
|
||
* UART功能开发,请阅知cm_sd.h中【SD卡使用注意事项】
|
||
* 2、UART引脚和SD卡控制引脚复用关系见《资源综述》
|
||
***************************************************************************/
|
||
|
||
|
||
#ifdef __cplusplus
|
||
#define EXTERN extern "C"
|
||
extern "C"
|
||
{
|
||
#else
|
||
#define EXTERN extern
|
||
#endif
|
||
|
||
/****************************************************************************/
|
||
|
||
/**
|
||
* @brief 打开串口
|
||
*
|
||
* @param [in] dev 串口设备ID
|
||
* @param [in] cfg 串口配置
|
||
*
|
||
* @return
|
||
* = 0 - 成功 \n
|
||
* < 0 - 失败, 返回值为错误码
|
||
*
|
||
* @details open之前必须先对引脚复用功能进行设置。\n
|
||
* 串口支持的波特率及模式见cm_uart_cfg_t结构体注释说明,请详细查看波特率宏定义处的注意事项
|
||
*/
|
||
int32_t cm_uart_open(cm_uart_dev_e dev, cm_uart_cfg_t *cfg);
|
||
|
||
/**
|
||
* @brief 注册串口事件
|
||
*
|
||
* @param [in] dev 串口设备ID
|
||
* @param [in] event 串口事件
|
||
*
|
||
* @return
|
||
* = 0 - 成功 \n
|
||
* < 0 - 失败, 返回值为错误码
|
||
*
|
||
* @details 事件包括串口数据可读/溢出等。需在open之前注册。\n
|
||
* 内置4K缓存区保存未读出的数据,若注册了溢出事件,缓存区满后将上报溢出,缓存区溢出状态下将丢弃新接收的数据。\n
|
||
* 回调函数中不可输出LOG、串口打印、执行复杂任务或消耗过多资源。
|
||
*/
|
||
int32_t cm_uart_register_event(cm_uart_dev_e dev, void *event);
|
||
|
||
/**
|
||
* @brief 关闭串口
|
||
*
|
||
* @param [in] dev 串口设备ID
|
||
*
|
||
* @return
|
||
* = 0 - 成功 \n
|
||
* < 0 - 失败, 返回值为错误码
|
||
*
|
||
* @details
|
||
*/
|
||
int32_t cm_uart_close(cm_uart_dev_e dev);
|
||
|
||
/**
|
||
* @brief 串口写数据
|
||
*
|
||
* @param [in] dev 串口设备ID
|
||
* @param [in] data 待写入数据
|
||
* @param [in] len 长度
|
||
* @param [in] timeout 超时时间(ms)(无效参数)
|
||
*
|
||
* @return
|
||
* = 实际写入长度 - 成功 \n
|
||
* < 0 - 失败, 返回值为错误码
|
||
*
|
||
* @details
|
||
*/
|
||
int32_t cm_uart_write(cm_uart_dev_e dev, const void *data, int32_t len, int32_t timeout);
|
||
|
||
/**
|
||
* @brief 串口读数据
|
||
*
|
||
* @param [in] dev 串口设备ID
|
||
* @param [out] data 待读数据
|
||
* @param [in] len 长度
|
||
* @param [in] timeout 超时时间(ms)(无效参数)
|
||
*
|
||
* @return
|
||
* = 实际读出长度 - 成功 \n
|
||
* < 0 - 失败, 返回值为错误码
|
||
*
|
||
* @details
|
||
*/
|
||
int32_t cm_uart_read(cm_uart_dev_e dev, void* data, int32_t len, int32_t timeout);
|
||
|
||
#undef EXTERN
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* __CM_UART_H__ */
|
||
|
||
/** @}*/
|