目录
FIFO定义
UART通信的过程中,数据的传输速度是非常的关键。在实际的应用中,我们需要使用一些技巧来提高UART的传输效率,FIFO(First-In-First-Out)技术就是其中之一。
FIFO(First-In First-Out)是一种先进先出的数据缓冲区,用于在UART通信中缓存收发数据。其核心目标是减少CPU中断频率,提升通信效率。

FIFO基础配置
FIFO功能使能
FCR_ENABLE_FIFO: 激活UART的FIFO缓冲功能,提升数据传输效率。
// 典型应用:高速通信场景(如115200bps及以上波特率)
trigger = FCR_ENABLE_FIFO;
总线位宽配置
FCR_BUS_8BIT: 设置数据帧为8N1格式(8数据位、无校验、1停止位),需注意此处并非总线物理宽度,而是UART数据帧格式定义
// 数据格式示例:ASCII字符传输通常使用8N1
trigger |= FCR_BUS_8BIT;
FIFO中断使能
FCR_TRAIL_INT: 在FIFO数据接收完成后触发中断,适合批量数据处理场景。
// 应用场景:接收完整数据包后通知CPU处理
trigger |= FCR_TRAIL_INT;
FIFO空中断
FCR_TX_ZERO_INT:实现零延迟发送中断响应,确保发送完成后立即释放总线
// 配置示例(假设FCR_TX_ZERO_INT对应bit3)
UART->FCR |= FCR_TX_ZERO_INT; // 启用空中断
FIFO超时中断
FCR_TX_ZERO_INT:实现零延迟发送中断响应,确保发送完成后立即释放总线
// 使能超时中断
UART->IER |= IER_TIME_OUT;
FIFO trigger level中断
| 触发级别 | 宏定义 | 典型应用场景 |
| 1字节触发 (L1) | FCR_INT_TRIGGER_L0 | 实时性要求极高的控制指令 |
| 8字节触发 (L8) | FCR_INT_TRIGGER_L8 | 中等速率数据传输 |
| 16字节触发 (L16) | FCR_INT_TRIGGER_L16 | 文件传输或日志记录 |
| 32字节触发 (L32) | FCR_INT_TRIGGER_L32 | 大数据块传输 |
switch(config->triggerLevel )
{
case UART_INT_TRIGGER_L1:
trigger |= FCR_INT_TRIGGER_L0;
break;
case UART_INT_TRIGGER_L8:
trigger |= FCR_INT_TRIGGER_L8;
break;
case UART_INT_TRIGGER_L16:
trigger |= FCR_INT_TRIGGER_L16;
break;
case UART_INT_TRIGGER_L32:
trigger |= FCR_INT_TRIGGER_L32;
break;
}
FIFO数据流
UART一般有两个FIFO,TX_FIFO和RX_FIFO,和上位机交互如下所示:

- 发送流程:CPU将数据批量写入TX_FIFO,UART自动按顺序将数据从缓冲区转移到发送移位器,逐位发送到物理线路上。
- 接收流程:接收移位器逐位捕获数据,缓存到RX_FIFO中,达到预设触发条件(如数据量阈值或超时)后通知CPU读取。
FIFO优势
降低中断频率:不使用FIFO,每收发1字节就会触发一次中断,频繁占用CPU资源。使用FIFO模式,仅当FIFO数据量达到预设阈值或超时才会触发中断,大幅减少中断次数。CPU 利用更多的时 间处理关键的实时任务而不是专职服务UART。
防止数据丢失:不使用FIFO,大数据高速通信场景,CPU来不及处理数据会丢数据,使用FIFO模式,缓存多个字节,当达到预设阈值或超时中断CPU会主动读取数据,避免新数据覆盖旧数据。
曾子:人非人不济,马非马不走,土非土不高,水非水不流。(一个人没有别人的帮助,就不可能成功;一匹马没有别的马竞争,就不会快跑;一个土台,没有别的土在下堆起,便高不起来;一泓池水,没有别的水相激荡,便流动不起来。) ——曾子《大戴礼记》

1万+

被折叠的 条评论
为什么被折叠?



