21.2. 功能特性¶
21.2.1. UART API 功能¶
支持指定端口收发数据,不同芯片端口数量不一样
可编程串口波特率
支持按单/多字节收发数据
支持同步/异步收发数据
支持 FIFO 中断触发门限配置
21.2.2. UART 数据收发流程¶
21.2.2.1. 同步收发¶
同步收发相关接口
// 输出一个字符
void gx_uart_putc(int port, int ch);
// 输出一个字符, 如果是换行,转换成回车输出
void gx_uart_compatible_putc(int port, int ch);
// 获取一个字符
int gx_uart_getc(int port);
// 尝试获取一个字符,如果没有获取到字符,立马返回
int gx_uart_try_getc(int port, char *c);
// 同步读取指定长度的数据
int gx_uart_read(int port, unsigned char *buf, int len);
//非阻塞试读取指定长度的数据
int gx_uart_read_non_block(int port, unsigned char *buf, int len, unsigned int timeout_ms);
// 同步写指定长度的数据
int gx_uart_write(int port, const unsigned char *buf, int len);
同步收发数据流程图
21.2.2.2. 异步收发¶
提供了两种异步收发的模式
中断模式
DMA 模式
21.2.2.2.1. 中断模式¶
中断模式收发数据调用的函数接口
// 开始异步发送串口数据
int gx_uart_start_async_send(int port, UART_CAN_SEND_CALLBACK callback, void *priv);
// 停止异步发送串口数据
int gx_uart_stop_async_send(int port);
// 开始异步接收串口数据
int gx_uart_start_async_recv(int port, UART_CAN_RECV_CALLBACK callback, void *priv);
// 停止异步接收串口数据
int gx_uart_stop_async_recv(int port);
// 发送串口数据,但是不检查 fifo 是否满
int gx_uart_send_buffer(int port, unsigned char *buffer, int length);
// 接收串口数据,但是不检查 fifo 中是否有数据
int gx_uart_recv_buffer(int port, unsigned char *buffer, int length);
中断模式收发数据流程图
21.2.2.2.2. DMA 模式¶
DMA 模式收发数据调用的函数接口
// 异步发送串口数据
int gx_uart_async_send_buffer(int port, unsigned char *buffer, int length, UART_SEND_DONE_CALLBACK callback, void *priv);
// 异步接收串口数据
int gx_uart_async_recv_buffer(int port, unsigned char *buffer, int length, UART_RECV_DONE_CALLBACK callback, void *priv);
// 停止串口异步发送接口
int gx_uart_async_send_buffer_stop(int port);
// 停止串口异步接收接口
int gx_uart_async_recv_buffer_stop(int port);
DMA 模式收发数据流程图
21.2.3. UART FIFO 操作¶
FIFO是先进先出缓冲区的意思,即串口接收到的数据可以先进入FIFO,不必马上进入中断服务程序接收,这样可以节省CPU时间。对于发送数据也一样可以把要发送的数据一起写入FIFO,串口控制器按照写入的顺序依次发送出去。
FIFO 相关接口
// 设置串口发送 fifo 中断触发门限
int gx_uart_set_send_fifo_threshold(int port, GX_UART_FIFO_SEND_THRESHOLD threshold);
// 设置接收 fio 中断触发门限
int gx_uart_set_recv_fifo_threshold(int port, GX_UART_FIFO_RECV_THRESHOLD threshold);
// 清空发送 fifo
void gx_uart_flush_send_fifo(int port);
// 清空接收 fifo
void gx_uart_flush_recv_fifo(int port);