44b0 uart 启用FIFO 使用小体会

  开始我把FIFO看得过于神秘(虽然定义很明确,先入先出缓冲区),外加发送缓冲区和FIFO入口地址一样。发送缓冲区时16位的,低8位为数据区,而FIFO单位以字节算起(实际是字符,因为每帧数据有起始位和停止位等等)。搞得我一头雾水,它的工作机制是怎么样的? 本人实在是能力有限,搞一下午才弄明白。FIFO定义说了,先入先出缓冲区,在UART中有什么用呢。我们可以用它来批量发送数据(而非FIFO模式,只能一字节一字节的发,而且发每个字节都需要等待缓冲区变空才能发送下一字节),这样能在一定程度上提高数据发送速度。还有就是避免数据包的的丢失(这个问题,目前还没体会)。

    对于使用,说一下原理,代码很简单可用轮询或中断模式。

   1、再轮询模式下的FIFO,首先我们需要配置相关寄存器,这个我就不多说了我想大家都知道该怎么配置。然后对于FIFO我们基本不需要关心什么,只要保证FIFO缓冲区不溢出就可以了。如何查询溢出?通过查询UFSTATn BIT[7:4]即可。或bit【9】。可以在FIFO中数据满8字节做一下停顿 (做个小延迟让FIFO发送,可避免发送溢出,但不适于高速场合)  用   while(rUFSTAT0&0x0010);   来实现,也可以在9字节,10字节等等 。当然一字节也可以(1字节貌似没多大意思,跟没用FIFO一样了)。喜欢在容纳第几个字节做停顿都可以,不过要考虑传输速度的最优化。做短暂停顿目的是,避免FIFO溢出。要是不做停顿,会溢出(写入失败)丢失数据。

  2、在中断模式下的FIFO原理跟轮询差不多,在FIFO中数据=UFCON中设置的触发字节时,进入中断,全部数据的传输的结束是在中断中完成的。这样也是避免了FIFO的溢出,达到触发时进入中断服务,在中断服务内完成如下

void __irq Uart0_TxFifoInt(void)
{
  /* 判断FIFO发送缓冲区是否为满或字符串结束 */
  while( !(rUFSTAT0 & 0x200) && (*uart0TxStr !='/0'))//如果缓冲区满,退出中断,满足触发条件即=触发字节时再进入中断,使FIFO数据量稳定在一个水平,而又不至于溢出(本人片解,不排除理解错误)
  {
  rUTXH0=*uart0TxStr++;
  for(i=0;i<700;i++);  //延迟,防止FIFO误写
  }
  rI_ISPC=BIT_UTXD0;
  if(*uart0TxStr == '/0')
  {   
              rINTMSK |= BIT_UTXD0;
              rI_ISPC=BIT_UTXD0;
      }
}

用FIFO发送数据时,若所用为轮询法(用在非高速场合,高速场合最好用BDMA或中断法,故此轮询法很少用)需要保证接受FIFO不溢出,类似中断法,通过软件来设置触发条件。例如if(rUFSTAT0&0x000f>0x0008)触发读为FIFO内有8字节数据。但是我们同时还要考虑,不能空读接收FIFO,例如while((rUFSTAT0&0x000F)>0x0000){ 读接收FIFO}。这种轮询法比较山寨,稳定性不咋地,适用低速。不提倡使用。

                                                                              DIY

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值