三. 中断方式的串口编程 1.用中断方式编写串口程序由那几部分组成 2.硬件上的支持 1>UART0 发送FIFO缓冲区 A. UART0含有1个16字节的发送FIFO缓冲区 B. U0THR是UART0发送FIFO的最高字节 C. UART的发送FIFO是一直使能的 2>UART0接收FIFO缓冲区 A. UART0含有一个16字节的接收FIFO缓冲区。 B. 软件设置接收FIFO缓冲区的触发字节。
3> 中断接口:UART0的中断接口包含中断使能寄存器(U0IER)和中断标识寄存器(U0IIR)。 l U0IIR:提供状态码用于指示一个挂起中断的中断源和优先级。 l U0IER可以控制UART0的4个中断源。 4> UART0有4个中断源: A. RLS(接收线状态)中断: (1) 优先级最高 (2) 它在以下条件发生时产生错误 l 帧错误(FE) l 溢出错误(OE) l 奇偶错误(PE) l 间隔中断(BI) 注: Ø 可以通过查看U0LSR[4:1]中的值看到产生该中断的错误条件 Ø 读取U0LSR寄存器时清除该中断。 B. RDA(接收数据可用)中断: (1)与CTI中断并列第二优先级。 (2)在以下情况触发中断: l 当接收的有效数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复位。 l 中断过程: 1> 移位寄存器(U0RSR)从RxD引脚接收串行数据后,送入接收FIFO中 2> 当接收FIFO中的有效数据数量达到预定的触发点时,置位RDA中断。 3> 从U0RBR寄存器中读取FIFO中最早到达的数据,当FIFO中的有效数据小于触发点时,清零RDA中断。 C. CTI(字符超时指示)中断 (1) 优先级为2. (2) 在以下情况发生中断: l 当接收FIFO中的有效数据少于预定的触发点数量时,如果在一定时间内仍没有接收到新的数据,那将触发该中断。 (3) 上面的时间指的是:3.5~4.5个字节所需要的时间。 (4) 对接收FIFO的任何操作都会清零该中断标志。 (5) 中断过程: l 移位寄存器(U0RSR)从RxD0引脚接收串行数据后,送入接收FIFO中。 l 当接收FIFO中的有效数据少于触发个数,但如果长时间没有数据到达,则触发CTI中断。 l 从U0RBR中读取接收FIFO中的数据,或者有新的数据送入接收FIFO,都将清零CTI中断。 注: Ø 3.5~4.5个字节的时间:指在串口当前的波特率下,发送3.5~4.5个字节所需要的时间。 Ø 当接收FIFO中存放多个数据,从U0RBR读取数据,但是没有读完所有数据,那么在经过3.5~4.5个字节的时间后触发CTI中断。 D. THRE(发送)中断 (1) 优先级为第三级优先级。 (2) 当FIFO为空并且在以下情况触发中断: l 系统启动时,虽然发送FIFO为空,但不会产生THRE中断。 l 在上一次发生THRE中断后,向发送FIFO中写入1个字节数据,将在一个字节加上一个停止位后发生THRE中断 (because:如果发送移位寄存器为空,那么写入发送FIFO的数据将直接进入发送移位寄存器。此时发送FIFO仍然为空,如果立即产生THRE中断,就会影响紧接着写入发送FIFO的数据。 所以在发送完该一个字节以及一个停止位后,才产生THRE中断。 l 如果在发送FIFO中有过两个字节以上的数据,但是现在发送FIFO为空时,将立即触发THRE中断。 l 当THRE中断为当前有效的最高优先级中断时,往U0THR写数或者对U0IIR的读操作,将使THRE中断复位 我们来看看这些中断源与存储器之间的关系: 注: Ø 由上图可知:UART0有4个中断源:分别是RLS(线状态)中断,RDA(接收数据)中断,CTI(字符超时)中断,THRE(发送数据)中断。 Ø 4个中断源的优先级如下图所示:
|