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();
}