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)); // 等待当前字节发送完毕
}
上一篇:LPC51U68使用HID bootloader的步骤
下一篇:12位串行高速A/D转换器ADS7822的功能特点及应用设计
推荐阅读最新更新时间:2024-11-09 23:24
推荐帖子
- 【聊聊DSP】聊聊DSP入门必读文档 与 最小系统设计
- D妹恋爱使用说明书:入门篇【使用申明】:此乃和DSP妹妹恋爱的至尊宝典,TI出品,Starcool(Q工)整理校订,审核,公布,乃为使更多人能走上和D妹家族的妹子们踏入爱的殿堂,本文重在告诉您如何从驳杂的文档之海中找到需要的,并借助有限的很少的资料,进行最有效的学习。首发于EEWORLD未经允许不得转载!因个人知识与眼界有限,故也许有诸多不足,还望批评指正。【附件】:将通用文档已提供于二楼,请移步下载【适用人群】:没有女朋友的屌丝们,有女朋友的慎入~
- starcool DSP 与 ARM 处理器
- 为何我的Jlink可以下载程序到Flash重新上电可运行,但不能仿真
- IAR4.4.2环境下,可用Jlink下载程序到Flash,进入调试窗口后可以单步/全速执行,但没有实际效果(应该是程序没有被正确运行),而我重新给目标板上电后,程序可以正确运行.这是什么原因造成的?查了下linkarm_flash.xcl和其它配置好象没发现异常.为何我的Jlink可以下载程序到Flash重新上电可运行,但不能仿真我也是,经常莫名其妙的这样什么芯片?什么程序功能?
- heyan0902 stm32/stm8
- 大家有没有fpga控制DM9000的程序
- 网上搜到最多的只是那个verilog实现的程序,但也只有部分程序,好像有个top文件没有,而且功能貌似也不好,不知道哪位大牛能共享下程序,万分感谢大家有没有fpga控制DM9000的程序直接驱动程序还是容易的。我只能写出初始化程序,其他部分的就不会了,纠结啊回复沙发eeleader的帖子还是要看懂口ATASHEET啊!才能随心所纹。
- aluowell FPGA/CPLD
- 懂VB的近来帮下忙
- 本人用VS2005编译了一个串口通讯的小软件用VB写的为什么当串口一收到数据的时候就弹出以下错误错误Temper11.exeNotSupportedExceptionControl.Invoke必须用于与在独立线程上创建的控件交互。位于Microsoft.AGL.Common.MISC.HandleAr()位于System.Windows.Forms.Control.get_Text()位于System.Windows.Forms.Control.set_Text(
- bbslee888 嵌入式系统
- How to Make 3 Partition SD Card中文手册
- HowtoMake3PartitionSDCard中文手册HowtoMake3PartitionSDCard中文手册
- 鑫海宝贝 DSP 与 ARM 处理器
- AD导入brd文件提示cadence allegro installation not found ……错误
- 求大佬们给下意见,或者帮我转一下AD格式,我用了AD13、10、18这几个版本的AD导入还是一样的提示。实在没有办法了AD导入brd文件提示cadenceallegroinstallationnotfound……错误能在Allegro能打开么楼主的这么多AD软件版本都打不看,其他人也一样需要先成功安装Cadence,保证Candence能成功打开本设计文件,然后在AD中用File-InportWizard导入。这是因为没有安装allegro软件白天没有时间转换,
- IJK PCB设计
设计资源 培训 开发板 精华推荐
- 使用微功率仪表放大器的可配置 4-20 mA 回路供电发送器/接收器
- STM32CoreBoard—V1.0.0
- TA8126SG 3V DC/DC转换器电调典型应用
- 使用 ROHM Semiconductor 的 BD48K33G-TL 的参考设计
- TPS5430降压模块
- AP1694AEV11,基于 AP1694 230VAC TRIAC 可调光 GU10 LED 驱动器的评估板
- 用于开/关控制应用的 AM2G-2409DZ ±9V 2 瓦 DC-DC 转换器的典型应用
- 使用 NXP Semiconductors 的 FS32V234 的参考设计
- 使用 Infineon Technologies AG 的 OMR9601SCPPBF 的参考设计
- 使用 ON Semiconductor 的 RC4190 的参考设计