关于串口FIFO中断

来源:本站
导读:目前正在解读《关于串口FIFO中断》的相关信息,《关于串口FIFO中断》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于串口FIFO中断》的详细说明。
简介:串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,UART的FIFO是一个硬件环形的缓冲队列,物理上不可寻址,不可见,仅U0RBR这个FIFO出口可见。

串口FIFO中断有;RDA CTI

串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,UART的FIFO是一个硬件环形的缓冲队列,物理上不可寻址,不可见,仅U0RBR这个FIFO出口可见。U0RBR就是接收FIFO的第一位。FIFO的长度是可设的,也叫触发点,低于这个长度的字符串不会引起中断,但在实际应用中,不可能串口读入的数据长度总为触发点值的整数倍,为此,引入了CTI即字符接收超时中断,当有不足触发点值规定的字符串读入时,将引起中断,其与串口的RDA中断具有相同的优先级,并会同时被使能。

那么,LPC2000的UART机制是如何判断串口读入数据的一次性容量呢?如果接收FIFO里已经有了1个字符,它可在一定的时间内等待下一个字符的读入,也就是说,不超过一定的时间就不会触发CTI中断,这个时间是在本次通讯协议设置的前提下,接收3.5到4.5个字符所用的时间。比如,需串口接收GPRS数传状态成功建立后的返回值“Ok_Info_WaitingForData”22个字符组成的字符串,FIFO触发点设置为14,在前14个字符读入之后,立即触发RDA中断(接收中断),跳转至RDA中断服务子程序将这14个字符放入我所预设的缓冲区内,接着,后8个字符读入,这时CPU并不立刻中断,它需等待在本次串口通讯协议设置的前提下,接收3.5到4.5个字符所用的时间(需根据波特率和帧格式具体计算),这个时间一到,立刻触发CTI中断(超时中断),换句话说,超过这个时间的等待,CPU就认为一个完整的字符串已经结束了,这才是字符串超时的真正含义。

CTI触发的前提是接收FIFO里已经有了1个字符,在等待下一个字符的进入

用FIFO发送数据时,需要保证接受端的FIFO不溢出,则发送过快,接受端FIFO满后中断末取走数据,发送端就又发数据。其只能由发送端来保证

不过接受端FIFO有2个Buffer,循环接收.

3、个人觉得,当FIFO的触发深度设为1时和不用FIFO时的效果是一样的。

4、串口发送时,推荐第一个字符要在打开串口中断前送(不懂???),否则可能中断只来一次。比如下面的这个用串口中断发送字符串的函数为:

/****************************************************************************************************

** 函数名称 :UART0_SendStr()

** 函数功能 :向串口发送字符串

** 入口参数 :str 要发送的字符串的首地址指针

** 出口参数 :无

*****************************************************************************************************

void UART0_SendStr( CHAR const *str)

{

Str_Send_P = str;

U0THR = *Str_Send_P++;

U0IER |= 0x02; //开发送中断

}

在中断发送程序中的处理为:

SWITCH(IIR & 0x0e)

{

case 0x02: //利用串口发送中断,发送字符串

if((*Str_Send_P)!='')

U0THR = *Str_Send_P++;

else

U0IER &= (~0x02); //关发送中断

break;

这种做法的道理不太明白,但实验证明,不这么做就只发一次!~

提醒:《关于串口FIFO中断》最后刷新时间 2024-03-14 01:11:50,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于串口FIFO中断》该内容的真实性请自行鉴别。