4G_module/include/cmiot/cm_uart.h

241 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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为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使用注意事项*************************************
* 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__ */
/** @}*/