LPC2138的串口带有16字节的接收和发送FIFO,并且接收FIFO的触发点可设为1,4,8,14字节。
1)接收
当接收到的字节数达到设置的触发点(通过FCR寄存器设置)时,就会产生接收中断;而当接收到的字节数未能达到设置的触发点(比如触发点设置为14,但是只接收到了10个字节的数据),那么经过短暂的等待时间后会产生超时中断。在这两种情况下需要正确读取RBR寄存器,妥善保存接收到的数据。
举例来说,假设接收FIFO的触发点设置为14,而要接收的数据一共有16字节。那么接收过程中会产生两次中断:第一次是当接收到第14个字节时产生的接收中断;之后只剩2个字节要接收,达不到触发点14,所以经过等待时间后会产生超时中断。
中断服务程序里,对于这两种中断可进行如下的处理(假设使用UART1):
switch (U1IIR & 0x0E)
{
case 0x0C: // 若为超时中断(注意此处不要加break)
case 0x04: // 若为接收中断
while ((U1LSR & 0x01) == 1) // 若U1RBR包含有效数据
Rec_Buffer[index++] = U1RBR; // 保存接收到的数据
}
2)发送
发送FIFO并没有触发点的问题。要发送数据时,首先把数据写入THR寄存器,之后MCU会将其移入发送FIFO缓冲区中,一旦THR寄存器被移空,就会产生发送中断。换句话说,在使能了发送中断的情况下,每向THR寄存器写一个字节就会引起一次发送中断。所以要发送一系列的数据时,只需要发送第一个字节来启动发送过程,剩余的字节由中断服务程序来完成就可以了。
假设Send_Length为要发送的总字节数,程序中的处理如下:
U1THR = Txd_Buffer[0];
index = 1;
void __irq Uart1_isp(void) // 中断服务程序
{
if ((U1IIR & 0x0E) == 0x02) // 判断是否为发送中断
{
if (index != Send_Length)
{
U1THR = Txd_Buffer[index];
index ++;
}
}
}
个人觉得,使能发送中断会导致MCU的工作效率变低。因为一旦THR寄存器为空就会进入中断服务程序,会出现连续的无效中断。(如果理解有错误,还请指正)
在不使能发送中断的情况下,可用查询方式实现以上的发送过程:
int i;
for (i = 0; i < Send_Length; i++)
{
U1THR = Txd_Buffer[i];
while (!(U1LSR & 0x20)); // 等待当前字节发送完毕
}
上一篇:基于微处理器和射频收发芯片近程无线数传系统设计
下一篇:用单片机S3C44BOX控制红外线通信接口电路设计
推荐阅读最新更新时间:2024-03-16 13:44
设计资源 培训 开发板 精华推荐
- 柔灵科技陈涵:将小型、柔性的脑机接口睡眠设备,做到千家万户
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计