低功耗串口

1、概述

AW33N内置一路低功耗串口(LPUART),与普通 UART 不同,LPUART 只支持接收 (单工 RX),若要发送,需额外初始化一路普通 UART来实现 TX 发送功能。LPUART串口可在系统进入低功耗后继续工作,几乎不增加额外功耗;当串口接收到数据时会把系统从低功耗中唤醒,并且不会丢失接收的数据。适合AT指令、上位机数据等“低速率、偶发、需要唤醒、不丢失数据”的应用场景。

Note

LPUART 目前硬件只支持一路,应用示例通用串口和 AT 串口不可同时使用 LPUART 模式。

低功耗串口的接口原型、结构体字段及参数说明请参考 LPUART 接口参考。

2、板级配置

配置宏

LPUART 的使能、引脚和波特率在板级头文件(board_aw33n_*_cfg.h)中配置, 公用的”普通 UART 参数”由 LPUART 参数派生:

通用串口(common UART)相关宏

宏

取值

说明

TCFG_COMMON_UART_ENABLE

0/1

通用数据转串口模块总开关;为 0 时 common_uart_init() 整体不编译

TCFG_COMMON_LPUART_ENABLE

0/1

置 1 时通用串口接收走 LPUART

COMMON_LP_UART_RX_PIN

IO

LPUART 接收引脚

TCFG_COMMON_LPUART_BAUDRATE

≤115200

LPUART 波特率,不得高于 115200

COMMON_UART_RX_PIN

IO

普通 UART 接收引脚;LPUART 使能时等于 COMMON_LP_UART_RX_PIN

TCFG_COMMON_UART_BAUDRATE

普通 UART 波特率,LPUART 使能时等于 LPUART 波特率

COMMON_UART_TX_PIN

IO

发送引脚,始终由普通 UART 使用

COMMON_UART_INDEX

UART_NUM_x

普通 UART 硬件编号,发送仍走该串口

AT 串口相关宏

宏

取值

说明

TCFG_AT_LPUART_ENABLE

0/1

置 1 时 AT 串口接收走 LPUART

AT_LP_UART_RX_PIN

IO

LPUART 接收引脚

TCFG_AT_LPUART_BAUDRATE

≤115200

LPUART 波特率,不得高于 115200

UART_DB_RX_PIN

IO

调试(DB)/AT 串口接收引脚;LPUART 使能时等于 AT_LP_UART_RX_PIN

TCFG_AT_UART_BAUDRATE

AT 串口波特率,LPUART 使能时自动等于 LPUART 波特率

UART_DB_TX_PIN

IO

发送引脚,始终由普通 UART 使用

AT_UART_INDEX

UART_NUM_x

AT 串口使用的普通 UART 硬件编号

Note

COMMON_UART_INDEX / AT_UART_INDEX 以及 TX 引脚在 LPUART 模式下仍然 有效——LPUART 只接管 RX,应用调用 uart_send_bytes() 时依旧从普通 UART 的 TX 引脚发出。

波特率说明

场景

波特率限制

普通 UART(未启用 LPUART)

可配置为 1 / 2 Mbps 等高速率

LPUART

不得高于 115200,超出时编译报错

启用 LPUART 的普通 UART

与 LPUART 一致,同样不超过 115200

Note

LPUART 只支持 RX 接收,但 LPUART 模式下普通 UART 的波特率需与 LPUART 保持一致。 若要出低功耗后调整接收高于 115200 的波特率,可通过 void sleep_set_exit_call_api(void *call_api) 接口 注册退出低功耗回调函数,在回调函数中关闭 LPUART、改为使用普通 UART 做RX接收。

板级配置示例

AW33N demo 板(board_aw33n_demo_cfg.h)的 AT 串口 LPUART 配置:

#define TCFG_COMMON_UART_ENABLE             DISABLE_THIS_MODULE
#define TCFG_COMMON_LPUART_ENABLE           DISABLE_THIS_MODULE
#define COMMON_LP_UART_RX_PIN               IO_PORTA_07
#define TCFG_COMMON_LPUART_BAUDRATE         115200
#if TCFG_COMMON_LPUART_ENABLE
#define TCFG_COMMON_UART_BAUDRATE           TCFG_COMMON_LPUART_BAUDRATE
#define COMMON_UART_RX_PIN                  COMMON_LP_UART_RX_PIN
#else
#define COMMON_UART_RX_PIN                  IO_PORTA_07
#define TCFG_COMMON_UART_BAUDRATE           115200
#endif
#define COMMON_UART_TX_PIN                  IO_PORTA_06
#define COMMON_UART_INDEX                   UART_NUM_1

#define TCFG_AT_LPUART_ENABLE               ENABLE_THIS_MODULE
#define AT_LP_UART_RX_PIN                   IO_PORTA_07
#define TCFG_AT_LPUART_BAUDRATE             115200
#if TCFG_AT_LPUART_ENABLE
#define UART_DB_RX_PIN                      AT_LP_UART_RX_PIN
#define TCFG_AT_UART_BAUDRATE               TCFG_AT_LPUART_BAUDRATE
#else
#define UART_DB_RX_PIN                      IO_PORTA_07
#define TCFG_AT_UART_BAUDRATE               115200
#endif
#define UART_DB_TX_PIN                      IO_PORTA_06
#define AT_UART_INDEX                       UART_NUM_1

启用 LPUART :

/* 1. 打开模块 */
#define TCFG_COMMON_UART_ENABLE             ENABLE_THIS_MODULE
/* 2. 接收改走低功耗串口 */
#define TCFG_COMMON_LPUART_ENABLE           ENABLE_THIS_MODULE
/* 3. 指定 LPUART 接收脚和波特率 */
#define COMMON_LP_UART_RX_PIN               IO_PORTA_07
#define TCFG_COMMON_LPUART_BAUDRATE         115200

3、示例

/*************************************************************************************************/
/*!
*  \brief      uart初始化
*
*  \param      [in]
*
*  \return     true or false
*
*  \note
*/
/*************************************************************************************************/
void common_uart_init(uint32_t _baud_rate, uint16_t _tx_pin, uint16_t _rx_pin)
{
    const struct uart_config config = {
        .baud_rate = _baud_rate,
        .tx_pin = _tx_pin,
#if TCFG_COMMON_LPUART_ENABLE
        .rx_pin = 0xffff,
#else /* TCFG_COMMON_LPUART_ENABLE */
        .rx_pin = _rx_pin,
#endif  /* TCFG_COMMON_LPUART_ENABLE */
        .parity = UART_PARITY_DISABLE,
        .tx_wait_mutex = 0,/*!< 1:不支持中断调用,互斥,0:支持中断,不互斥 */
    };
    log_info(">>>>>>>>>>>>>>>>>>>>");
    log_info("uart_rx_ptr:0x%x", uart_rx_ptr);
    /* log_info("frame_ptr:%d", frame_ptr); */

    int ut = uart_init(COMMON_UART_INDEX, &config);
    common_uart_num = ut;
    if (ut < 0) {
        log_error("init error %d", ut);
    } else {
        log_info("init ok %d", ut);
    }

#if TCFG_COMMON_LPUART_ENABLE
    struct lpuart_config lpuart_cfg = {
        .rx_pin = _rx_pin, /*!< 不使用时配0xffff,当rx_pin == tx_pin 的时候为单线半双工通讯模式 */
        .baud_rate = _baud_rate,/*!< 不高于115200 */
        .idle_bit_num = 9, /*!< 空闲帧bit数 */
        .parity = LPUART_PARITY_DISABLE,
        .rx_inv = 0, /*!< 接收电平取反 */
        .rx_bypass = 0, /*!< 0:滤波输入, 1:直接输入 */
        .big_endian = 0, //0:LSB->MSB, 1:MSB->LSB
        .wken_type = LPUART_WKEN_START_BIT,//enum lpuart_wken_type
        .irq_priority = 7,//7
        .mute_mode = LPUART_MUTE_IDLE,
        .addr = 0x5b,/*!< 匹配地址 */

        .rx_cbuffer_size = COMMON_UART_RX_BUF_SIZE,
        .rx_cbuffer = uart_rx_ptr,
        .irq_callback = lpuart_irq_func,      /*!< 推送到调用者的线程执行 */
        .event_mask = LPUART_EVENT_RX_TIMEOUT | LPUART_EVENT_RX_FIFO_OVF | LPUART_EVENT_RX_CBUF_OVF,
    };

    int er = lpuart_init(&lpuart_cfg);
    if (er < 0) {
        log_error("lpuart init error %d", er);
    } else {
        log_info("lpuart init ok %d", er);
    }
#else /* TCFG_COMMON_LPUART_ENABLE */
    const struct uart_dma_config dma = {
        .rx_timeout_thresh = 100,
        .frame_size = COMMON_UART_RX_BUF_SIZE,
        .event_mask = UART_EVENT_TX_DONE | UART_EVENT_RX_DATA | UART_EVENT_RX_FIFO_OVF | UART_EVENT_RX_TIMEOUT,
        .irq_priority = 3,
        .irq_callback = common_uart_irq_func,
        .rx_cbuffer = uart_rx_ptr,
        .rx_cbuffer_size = COMMON_UART_RX_BUF_SIZE,
    };

    int r = uart_dma_init(COMMON_UART_INDEX, &dma);
    if (r < 0) {
        log_error("dma init error %d", ut);
    } else {
        log_info("dma init ok %d", ut);
    }
#endif  /* TCFG_COMMON_LPUART_ENABLE */

#if COMMON_UART_RX_POWERLOW_ENABLE
    p33_io_wakeup_port_init(&uart_rx_wakeup_config);
    p33_io_wakeup_enable(uart_rx_wakeup_config.gpio, 1);
#endif  /* COMMON_UART_RX_POWERLOW_ENABLE */

    uart_dump();
}

Note

示例初始化 LPUART 的接收路径,同时用uart_init()初始化普通 UART 的 TX 引脚。