s3c2440的uart知识点

本文详细介绍了S3C2440微处理器的UART特性,包括三个独立UART模块,支持查询、中断和DMA模式。讲解了UART的时钟来源、波特率计算、FIFO模式、自动流控制以及中断和错误处理机制。还提到了FIFO与非FIFO模式的区别,并探讨了UART的工作流程和状态信号。最后,概述了UART的相关寄存器和配置,如ULCON、UMCON、UFCON等。

s3c2440的uart和stm32、51的uart都是大同小异的。但是还是专门写一下。其实是自己作总结而已。(本文只是涉及uart的基本情况,程序的话,只有查询模式。fifo、中断、DMA还没学,后面可能会补上)

以下是它的特点:
s3c2440有三个独立的uart模块,都支持查询、中断模式或者DMA模式。
这三个uart都可以选择(非)fifo模式。Fifo适用于大规模数据传送,可能在DMA需要用到。
uart0和uart1可支持自动流控制(Auto Flow Control)模式,用来检测是否可用。有特殊的位的对应引脚。(但好像stm32的uart功能更多点,深入学习后作比较)

  • 时钟来源和时钟频率的设定
    uart的时钟源有两个选择:内部的PCLK分配的单元时钟(不管FCLK是晶振提供的,还是EXTCLK提供的),或者直接由外部EXTCLK提供的时钟频率。使用前者,uart的baud rate可以达到921.6kbps(最高),而接EXTCLK,可以达到更多的baud rate。
    存储波特率的寄存器是16位的UBRDIVn ,具体应该存放的值,是如下计算的:
    UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
    ( UART clock: PCLK, FCLK/n or UEXTCLK )

  • 中断
    具体的中断情况实际中是一定要用的,等到以后学了中断,再补充(后面寄存器那里,有稍微提及)。
    在no-fifo mode下产生的中断(就是说,有多种error情况,但都是进入这两个interrupt里,再读取对应的位,做判断):
    Rx interrupt :当数据从移位器shifter在代码的控制下,成功传给其他地区时,产生中断(这时的shifter还没有清空,需要程序清除)
    Tx interrupt :当数据在代码的控制下成功地从其他地区传给shifter时,产生中断。
    Error interrupt:所有报错的error都会导致中断,但是一次只能有一个。
    在fifo mode下产生的中断(就是说,有多种error情况,但都是进入这两个interrupt里,再读取对应的位,做判断):
    Rx interrupt :当fifo接收的数据达到溢出/触发中断标准时,产生中断。或者是没有达到溢出,但是等待了3个word的时间,仍没有收到数据。
    Tx interrupt :当fifo所有待发送的数据都发送出去时,产生中断
    Error interrupt:所有报错的error都会导致中断
    UART除了Rx FIFO寄存器外,还有FIFO错误状态寄存器。错误状态FIFO表示其中的哪些数据具有一个错误(具体的错误就是上面写的那些frame error之类的)。只有当数据有错误时,才会发出错误中断,准备好读出来了。要清除错误状态FIFO,必须读出带有错误和UERSTATn的URXHn(就是上面写的那些frame error之类的)

  • DMA
    DMA也是很重要的,学了后要补充。

  • fifo与非fifo的区别
    S3C2440A的UART内部对于接收和发送各有64字节的缓冲区,当使用FIFO模式时,UART将使用这个缓冲区进行数据暂存操作,这样可以增加数据吞吐量,提高传输速率。其实,非FIFO模式也可以看作是特殊的FIFO模式,即只有一个字节(注意,只有一个字节)缓冲区的FIFO模式。
    二者的主要不同在于读取缓冲区状态的方式:非FIFO模式下,通过UTRSTAT寄存器得知收发缓冲区状态;FIFO模式下,则从UFSTAT寄存器获得缓冲区状态。要注意的是,在FIFO模式下,只有达到触发级别后才会发起Rx或Tx中断。比如说,如果设置接收触发级别为16字节,则只有在接收缓冲区中有16个字节以上数据时,才会发起Rx中断请求。如果需要进行输入回显,即是立即显示,则可能导致不能立即回显用户在串口工具中输入的字符(如果用fifo模式的话,字节数达不到中断,即回复的要求)。所以这时,就要使用非fifo模式。

  • Auto Flow Control(自动流控制)
    用于通讯双方都是使用uart口时。S3C2440中的UART用nRTS(发送请求信号)和nCTS(清除发送信号)来支持自动流控制,以此实现UART之间的互联。
    在AFC模式下,nRTS依赖于接收器的条件和nCTS信号控制发送器的运行。UART的发送器只当nCTS信号被激活(AFC模式下,nCTS信号意味另一个UART的FIFO已经准备好接收数据了)才发送数据到另一个UART的FIFO里。在UART接收数据的时候,当接收FIFO有大于32-byte的空闲空间时nRTS必须被激活 ,在接收FIFO的空闲空间小于32-byte(在AFC模式下,nRTS信号意味自己的接收FIFO准备好接收数据)时nRTS必须被取消激活。
    UART2不支持AFC功能。

  • uart的工作流程
    首先,发射器和接收器各包含64字节(不是64位,是64字节)的fifo和数据移位器。
    如果是fifo,初始化uart之后,是先将数据写入FIFO,然后复制到传输移位器在传输之前。然后由传输数据pin (TxDn)将数据移出。同时,接收数据为从接收数据pin (RxDn)进行移位,然后从移位器复制到FIFO。
    使用的是非fifo模式的话,其实也是用了FIFO中的一个字节的空间,作为先存进去的地方而已,不存在直接放进传输移位器的做法(如果是这样做的话,就是需要通过程序一位一位放进去了)。
    接收到的数据是放到接收缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中。由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,读取出来的结果是不同的(有默认的情况,不修改就好了)。

  • Uart的状态和与interrupt、DMA的对应
    每个uart都有7种状态信号(其实也是一些1位的寄存器位): Overrun error, Parity error, Frame error, Break, Receive buffer data ready, Transmit buffer empty, and Transmit shifter empty。分别是overrun错误,校验错误,帧错误,断点,接收缓冲区准备好,发送缓冲区为空,发送移位寄存器为空
    前面四个是作为错误信号的,有相应的寄存器位,所以当这四个位被自动置1时,且中断允许位被打开,如果发生错误,就会去进入receive error status中断(硬件自身检测的),然后需要在中断子程序里代码自己去if()查询对应的位,到底是哪个error,并作出解决方案。
    后面三个是作为正确信号的,通过读取,来执行下一步的程序,当然都可以进入中断。一般判断发送是否完成的是,判断Transmit buffer empty对应的那个位,因为这个位是Transmit shifter empty成立前提下,才会成立的。

  • 自己之前的疑问:如果不是auto-flow的模式的话,要关闭auto-flow的位,但是, nRTS 和nCTS还要不要在程序里进行控制?
    看了些资料发现是,如果不是auto-flow的模式的话,要关闭auto-flow的位,但是在fifo模式下,nRTS 和nCTS还要在程序里进行控制,非fifo不需要。

没有使用自动流

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值