您的位置 首页 被动

ARM 串口驱动实质

ARM串口驱动本质1.LPC2000系列芯片的串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓…

ARM 串口驱动实质

1.LPC2000 系列芯片的串口的接纳模块包括接纳缓冲寄存器和移位寄存器。接纳的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,UART的FIFO是一个硬件环形的缓冲行列,物理上不行寻址,不行见,仅U0RBR这个FIFO出口可见。U0RBR便是接纳FIFO的第一位。FIFO的长度是可设的,也叫触发点,低于这个长度的字符串不会引起中止,但在实践使用中,不行能串口读入的数据长度总为触发点值的整数倍,为此,引入了CTI即字符接纳超时中止,当有缺乏触发点值规则的字符串读入时,将引起中止,其与串口的RDA中止具有相同的优先级,并会一起被使能。
2.那么,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就以为一个完好的字符串现已完毕了,这才是字符串超时的真实意义。

U0RBR:接纳器缓存寄存器

拜访时,先要设定 U0LCR 的除数锁存拜访位(DLAB)为 0。因为,U0DLL 与U0RBR/U0THR 在同一地址上。

DLAB = 1 时,挑选 U0DLL 和 U0DLM (U0DLM 和 U0IER 在同一个地址上);

DLAB = 0 时,挑选 U0RBR/U0THR 和 U0IER。

U0DLL 和 U0DLM:

构成一个 16 位的除数。

VPB时钟(pclk) 是产生波特率的时钟源,波特率时钟源有必要是波特率的16倍,所以有:

baud_rate = pclk/(16*设定的除数)

UART0 的中止:

有 4 个中止,分别是:

RBR 中止; THRE 中止; Rx 线中止;

其间 RBR 中止里边包括有2个中止:数据可用RDA中止 和 接纳超时 CTI 中止。

FAQ一:

1、什么是 RDA 中止?

当接纳的有用数据抵达接纳FIFO设置寄存器(U0FCR)中设置的触发点时,RDA中止被激活。

U0FCR[7:6]=00 触发点 0(1字节); U0FCR[7:6]=01 触发点 1(4字节);

U0FCR[7:6]=01 触发点 2(8字节);U0FCR[7:6]=01 触发点 1(14字节);

产生中止后,U0IIR[3:0] 内容为:0100。

假如产生中止后,读一下 U0RAR 寄存器,那么就会得到最早抵达的数据。这时,FIFO 中的有用数据小于预订触发点,清零 RDA 中止。

该中止的优先级为 2 。

2、什么是 CTI 中止?

在接纳 FIFO 中,有用的数据少于触发个数时,但至少有一个时,假如长时刻没有数据抵达,将触发 CTI 中止。这儿所说的“长时刻”是指在 接纳 3.5~4.5 个字节所需求的时刻。产生中止,则U0IIR[3:0] 内容为:1100。在中止后,若从 U0RBR 中读取接纳FIFO中的数据,或许有新的数据送入接纳FIFO中,这都将清零 CTI 中止。

该中止的优先级为 2。

3、什么是 THRE 中止?

THRE中止是发送中止。产生 THRE 中止的前提条件是FIFO 有必要为空。

假定刚刚产生了一次 THRE 中止,也便是说这时 FIFO 中为空。那么现在往 FIFO 中写入 1 个字节的数据,因为FIFO本来是空的,那这个字节的数据就会被直接写到移位寄存器 U0TSR中,这时 FIFO 必定又是空的。尔后,假如在发送完之前那个字节和中止位后,若还没有数据进来,就会触发 THRE 中止了。那为什么要等这段时刻呢?因为假如当即产生中止,而一起又有数据要进来,则中止就会打断数据的传送。

假定,本来 FIFO 中现已有2个或2个以上的数据,那么FIFO送出这两个数据后就空掉了,那就会当即触发中止。

当 THRE 中止为当时有用的最高优先级中止时,往 U0THR 写数据,或许对 U0IIR 的读操作,将使 HTRE中止复位。

在U0IIR 中,THRE的中止代码为:0110。

该中止的优先级为 3 。

4、什么是 RLS 中止。

RLS中止优先级最高。它产生在 UART0 产生了四个过错中的任何一个时。这四个过错是:

溢出过错(OE)、 奇偶过错(PE)、 帧过错(FE)、距离中止(BI)

产生RLS中止时,经过检查 线状况寄存器 U0LSR[4:1] 就可以知道是因为那个过错触发了 RLS 中止。读取 U0LSR 时铲除该中止。

FAQ二:

1、什么是 OE 溢出?

接纳时,在 U0RBR 寄存器中现已有新的字符安排妥当,而此刻接纳 FIFO 正好满了,就产生了溢出。这时 U0LSR[1]

= 1,另触发 RLS 中止。

2、什么是奇偶过错?

奇偶校验过错是在使能奇偶校验之后,对一切接纳的数据都进行奇偶校验,假如与 线状况控制器U0LCR 中的设置不符,将引起奇偶校验过错。(数据位+校验位)

U0LCR[3] = 1 使能奇偶产生和校验;0,则制止。

U0LCR[5:4] = 00 奇数校验; U0LCR[5:4] = 01 偶数校验; U0LCR[5:4] = 10 强制为 1;

U0LCR[5:4] = 11 强制为0。

强制为1或强制为0的意思便是强制校验必为奇或必为偶。

3、什么是帧过错?

当接纳字符的中止位为 0 时,产生帧过错

4、什么是距离过错?

在发送数据时,假如RXD0引脚坚持低电平,将产生距离中止。产生距离中止后,接纳模块中止数据接纳。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/276063.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部