4G_module/include/cmiot/cm_uart.h

241 lines
8.0 KiB
C
Raw Permalink Normal View History

2024-09-02 17:54:29 +08:00
/**
* @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功能将无法正常使用
* 256000256000115200(76800)
*/
#define CM_UART_BAUDRATE_256000 (256000U)
#define CM_UART_BAUDRATE_2000000 (2000000U)
/****************************************************************************
* Public Types
****************************************************************************/
/** 设备ID ,详情参照资源综述*/
/* FOTA升级期间可能会有数据从主串口吐出对应ML307A、ML305A为UART0ML302A为UART1用户无需关注该数据也不应处理该数据 */
/* 对于ML307AUART2和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使用注意事项*************************************
* 1UART引脚和SD卡控制引脚所用PIN脚存在复用关系使PIN脚进行
* UART功能开发cm_sd.h中SD卡使用注意事项
* 2UART引脚和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__ */
/** @}*/