1.5. LPUART

低功耗串口只有接收。 详细的示例代码请参考SDK “lpuart_demo.c”

1.5.1. 串口基本接口

1.5.1.1. lpuart_init

初始化串口。

原型:

int lpuart_init(const struct lpuart_config *cfg)
参数:

cfg

串口配置信息

返回值

<0:串口初始化失败,=0:成功

示例:

struct lpuart_config lpuart_cfg_test = {
    .rx_pin = IO_PORTB_00, //不使用时配0xffff,当rx_pin == tx_pin 的时候为单线半双工通讯模式
    .baud_rate = 115200,//不高于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_ADDR,//enum lpuart_wken_type
    .irq_priority = 7,//7
    .mute_mode = LPUART_MUTE_IDLE_ADDR,
    .addr = 0x5b,//匹配地址

    .rx_cbuffer_size = sizeof(rx_pack_buf_test),
    .rx_cbuffer = rx_pack_buf_test,
    .irq_callback = irq_callback_test,      //推送到调用者的线程执行
    .event_mask = LPUART_EVENT_RX_TIMEOUT | LPUART_EVENT_RX_FIFO_OVF | LPUART_EVENT_RX_CBUF_OVF,
};

lpuart_init(&lpuart_cfg_test);

1.5.1.2. lpuart_deinit

关闭低功耗串口。

原型:

void lpuart_deinit()

1.5.1.3. lpuart_set_baudrate

设置串口波特率。

原型:

s32 lpuart_set_baudrate(u32 baud_rate, u8 idle_bit_num)
参数:

baud_rate

波特率

idle_bit_num

返回值

实际波特率,>0:成功,<0:失败

1.5.1.4. lpuart_get_recv_len

获取接收长度,支持中断调用。

原型:

//return,返回接收的长度 <0:error;
s32 lpuart_get_recv_len()
参数:

返回值

接收的长度<0:error; 0=< <len:ok

1.5.1.5. lpuart_recv_bytes

获取接收数据,支持中断调用。

原型:

s32 lpuart_recv_bytes(void *buf, u32 len)
参数:

buf

读取数据存放的buffer

len

需要读取数据长度

返回值

接收的长度<0:error; 0=< <len:ok

1.5.2. 示例

示例:

详细的示例代码请参考SDK “lpuart_demo.c”

//数据包格式:地址+数据+长度(除地址加crc)+crc(u8)(除地址)
void irq_callback_test(enum lpuart_event event)      //推送到调用者的线程执行
{
    if (event & LPUART_EVENT_RX_TIMEOUT) {
        log_info("lpuart[] rx timerout data");
        s32 rx_len = lpuart_get_recv_len();
        lpuart_recv_bytes(rx_buf_get_test, rx_len);
        log_info("rx_len:%d ?= %d", rx_len, rx_buf_get_test[rx_len - 2]);
        printf_buf(rx_buf_get_test, rx_len);
        rx_pack_cnt_test ++;
        //检查数据:
        if ((rx_len) && (rx_len == rx_buf_get_test[rx_len - 2])) {
            u8 crc_cal = CRC16(rx_buf_get_test, rx_len - 1); //长
            if (crc_cal == rx_buf_get_test[rx_len - 1]) {
                log_info("rx ok(%d,%d,%d)\n", rx_len_err_cnt_test, rx_crc_err_cnt_test, rx_pack_cnt_test);
                printf("\n\n");
            } else {
                rx_crc_err_cnt_test++;
                printf_buf(rx_buf_get_test, 8);
                log_error("crc error:%d,%d,%d\n\n", rx_len_err_cnt_test, rx_crc_err_cnt_test, rx_pack_cnt_test);
                /* while(1)wdt_clear(); */
            }
        } else {
            rx_len_err_cnt_test++;
            printf_buf(rx_buf_get_test, 8);
            log_error("len error:%d,%d,%d\n\n", rx_len_err_cnt_test, rx_crc_err_cnt_test, rx_pack_cnt_test);
            /* while(1)wdt_clear(); */
        }

    }

    if (event & LPUART_EVENT_RX_FIFO_OVF) {
        log_info("lpuart[] rx fifo ovf");
    }

    if (event & LPUART_EVENT_RX_CBUF_OVF) {
        log_info("lpuart[] cbuf ovf");
    }
}
void lpuart_test()
{
    struct lpuart_config lpuart_cfg_test = {
        .rx_pin = IO_PORTB_00, //不使用时配0xffff,当rx_pin == tx_pin 的时候为单线半双工通讯模式
        .baud_rate = 115200,//不高于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_ADDR,//enum lpuart_wken_type
        .irq_priority = 7,//7
        .mute_mode = LPUART_MUTE_IDLE_ADDR,
        .addr = 0x5b,//匹配地址

        .rx_cbuffer_size = sizeof(rx_pack_buf_test),
        .rx_cbuffer = rx_pack_buf_test,
        .irq_callback = irq_callback_test,      //推送到调用者的线程执行
        .event_mask = LPUART_EVENT_RX_TIMEOUT | LPUART_EVENT_RX_FIFO_OVF | LPUART_EVENT_RX_CBUF_OVF,
    };

    lpuart_init(&lpuart_cfg_test);

    log_info("init1:");
    printf_buf((u8 *)&P3_LPUART_RXCON0, 4 * 14);
    lpuart_dump();

}