1. S3C2440串口FIFO模式概述
S3C2440是三星公司推出的一款基于ARM920T内核的嵌入式处理器,广泛应用于工业控制、消费电子等领域。其内置的UART模块支持FIFO(First In First Out)工作模式,相比传统非FIFO模式,能显著提高串口通信效率。
在FIFO模式下,UART模块内部集成了64字节的发送和接收缓冲区。这意味着:
- 发送数据时,可以一次性写入最多64字节到发送FIFO,由硬件自动完成数据发送
- 接收数据时,硬件会自动将接收到的数据存入接收FIFO,直到达到预设的中断触发条件
2. FIFO中断机制详解
2.1 接收中断触发机制
接收FIFO中断触发条件由UFCONn寄存器中的Rx FIFO Trigger Level位域控制,可设置为8、16、32或56字节。当接收FIFO中的数据量达到设定值时,将触发接收中断。
特别需要注意的是超时中断机制:如果在3个字符传输时间内没有新数据到达,即使FIFO中数据量未达到触发值,也会产生接收超时中断。这个机制对于处理不定长数据帧非常关键。
2.2 发送中断触发机制
发送FIFO中断触发机制存在一个常见的理解误区。根据英文原版手册:
- 当发送FIFO中的数据量减少到触发值(如16字节)时,才会产生发送中断
- 而非中文手册描述的"发送出N个字节后产生中断"
这个差异在实际编程中会导致完全不同的中断处理策略。实验证明英文手册的描述是正确的。
3. FIFO模式下的数据处理策略
3.1 接收数据处理策略
对于不定长数据接收,推荐采用"留一法"策略:
- 在接收深度满中断时,只读取(触发深度-1)个字节
- 保留1个字节在FIFO中,确保后续必定会触发超时中断
- 通过超时中断判断一帧数据的结束
示例代码片段:
void UART_ReceiveHandler(void) { uint8_t count = UFSTAT0 & 0x3F; // 获取当前FIFO中的数据量 if(count < TRIGGER_LEVEL) { // 超时中断处理 while(UFSTAT0 & 0x3F) { // 读取所有剩余数据 buffer[rx_index++] = URXH0; } frame_complete = 1; // 设置帧接收完成标志 } else { // 深度满中断处理 for(int i=0; i<TRIGGER_LEVEL-1; i++) { // 只读取N-1个字节 buffer[rx_index++] = URXH0; } } }3.2 发送数据处理策略
对于大数据量发送,建议采用"批量填充"策略:
- 计算总发送长度:Length = 48×Cycle + Remainder
- 首次填充48字节到发送FIFO
- 在发送中断中继续填充下一批48字节
- 最后填充剩余的Remainder字节
示例计算公式:
void UART_SendData(uint8_t *data, uint32_t length) { send_cycle = length / 48; send_remain = length % 48; // 首次填充 for(int i=0; i<48 && send_cycle>0; i++) { UTXH0 = data[send_index++]; } send_cycle--; } void UART_SendHandler(void) { if(send_cycle > 0) { for(int i=0; i<48; i++) { UTXH0 = data[send_index++]; } send_cycle--; } else if(send_remain > 0) { for(int i=0; i<send_remain; i++) { UTXH0 = data[send_index++]; } send_remain = 0; } }4. 实际应用中的注意事项
4.1 中断处理优化
- 中断服务程序应尽可能简短,避免复杂运算
- 对于实时性要求高的应用,可以考虑使用DMA配合FIFO
- 注意中断嵌套问题,必要时关闭其他中断
4.2 波特率设置建议
- 高波特率(>115200)时,建议使用更大的FIFO触发深度
- 低波特率(<9600)时,可适当减小触发深度以减少延迟
- 实际波特率误差应控制在3%以内
4.3 调试技巧
- 使用双串口调试法:一个串口用于通信,另一个输出调试信息
- 在关键位置插入调试字符(如'M'表示深度满中断,'T'表示超时中断)
- 使用逻辑分析仪捕获实际波形,验证时序
5. 性能优化建议
- 内存对齐:确保发送/接收缓冲区地址4字节对齐
- 缓存预热:在高速通信前先发送几个哑字节
- 中断优先级:合理设置UART中断优先级
- 电源管理:通信间隙可进入低功耗模式
通过合理配置FIFO参数和优化中断处理程序,S3C2440的UART模块在FIFO模式下可以达到最高3Mbps的稳定传输速率,满足大多数嵌入式应用的需求。