LPC2000串口使用心得



针对zgpswh在串口使用上的一些难题,总结个人在前一阶段的理解,比较片面,不对的地方请高手指正。

1、LPC2000 系列芯片的串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,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就认为一个完整的字符串已经结束了,这才是字符串超时的真正含义。
   
2、为什么要用FIFO呢?我个人觉得,主要是为了提高串口的利用效率,同时可以避免一定程度上的丢包。比如,在用串口发送FIFO中断时,触发深度设为8,那么接收中断发生的条件是,FIFO里有了8个字符,但不是8个字节,因为串口异步通信的协议中,会加帧头和帧尾,但外表上还是以字符为单位。发送时,则是当FIFO里不满8个字符的时候要中断一次,所以利用FIFO发送时也要自建一个用来串口发送的缓冲池,发送中断服务程序里要做的就是从这个发送缓冲区里取数送进FIFO里,沿用上面的假设,触发深度设为8,一次性向FIFO里送15个字符,在送入第一批15个字符之后串口开始自动发送,当FIFO里只有7个字符时,立即发生中断,因此,在发送中断服务程序里要设个计数指针作为跳出中断的上限,这个上限不是8而是15。我认为,如果要发挥fifo的高效率,就必须把自设的缓冲区作成一个环状链表,即,不需要做移位处理使自设的缓冲区剩余的数据顶头。ZLG有详细的基于队列思想的例程。

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



另:8月6号写完串口发送程序后的总结——

LPC系列与STM32系列在串口发送中断机制上有不同,LPC系列要产生中断,要先往THR中写入一个数据,串口将该数据发送完成后才产生中断,而且一旦一帧数据发完,串口已经没有数据可发,所以中断此时已被关掉,当下一次数据到来时,并不能使能中断,因此采用一样的策略,首先发送一个前导字节给THR,待中断开了以后再用中断发送数据,所以每一帧数据都要分成前导字节和后续字节;而STM32只要THR为空,就会打开中断,不管数据有没有发送完成,由于在THR为空时就产生中断,即使没有数据可发,比如CPU在准备数据时,STM32会一直中断,明显地占用CPU的工作时间,因此,使用STM32时,要在中断处理完成后关掉中断,CPU准备好数据后再打开中断,避免CPU一直被中断而影响效率

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值