低功耗串口
1、概述
AW33N内置一路低功耗串口(LPUART),与普通 UART 不同,LPUART 只支持接收 (单工 RX),若要发送,需额外初始化一路普通 UART来实现 TX 发送功能。LPUART串口可在系统进入低功耗后继续工作,几乎不增加额外功耗;当串口接收到数据时会把系统从低功耗中唤醒,并且不会丢失接收的数据。适合AT指令、上位机数据等“低速率、偶发、需要唤醒、不丢失数据”的应用场景。
Note
LPUART 目前硬件只支持一路,应用示例通用串口和 AT 串口不可同时使用 LPUART 模式。
低功耗串口的接口原型、结构体字段及参数说明请参考 LPUART 接口参考。
2、板级配置
配置宏
LPUART 的使能、引脚和波特率在板级头文件(board_aw33n_*_cfg.h)中配置,
公用的”普通 UART 参数”由 LPUART 参数派生:
宏 |
取值 |
说明 |
|---|---|---|
|
0/1 |
通用数据转串口模块总开关;为 0 时 |
|
0/1 |
置 1 时通用串口接收走 LPUART |
|
IO |
LPUART 接收引脚 |
|
≤115200 |
LPUART 波特率,不得高于 115200 |
|
IO |
普通 UART 接收引脚;LPUART 使能时等于 |
|
普通 UART 波特率,LPUART 使能时等于 LPUART 波特率 |
|
|
IO |
发送引脚,始终由普通 UART 使用 |
|
|
普通 UART 硬件编号,发送仍走该串口 |
宏 |
取值 |
说明 |
|---|---|---|
|
0/1 |
置 1 时 AT 串口接收走 LPUART |
|
IO |
LPUART 接收引脚 |
|
≤115200 |
LPUART 波特率,不得高于 115200 |
|
IO |
调试(DB)/AT 串口接收引脚;LPUART 使能时等于 |
|
AT 串口波特率,LPUART 使能时自动等于 LPUART 波特率 |
|
|
IO |
发送引脚,始终由普通 UART 使用 |
|
|
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 引脚。