首页 理论教育 STM系列:USART功能概述

STM系列:USART功能概述

时间:2023-11-23 理论教育 版权反馈
【摘要】:USART接口通过3个引脚与其他设备连接在一起。关于以下寄存器中每个位的具体定义,请参考USART寄存器描述。USART支持0.5、1、1.5和2个停止位可配置。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。使用下列软件过程清除TC位:图6.45发送时TC/TXE的变化情况①读一次USART_SR寄存器;②写一次USART_DR寄存器。

STM系列:USART功能概述

STM32F1系列微控制器USART接口的结构框图如图6.42所示。USART接口通过3个引脚与其他设备连接在一起。任何USART双向通信至少需要2个脚:接收数据输入(RX)和发送数据输出(TX)。

RX:接收数据输入。通过过采样技术来区别数据和噪声,从而恢复数据。

TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O端口被同时用于数据的发送和接收。

关于以下寄存器中每个位的具体定义,请参考USART寄存器描述。

图6.42 USART结构框图

总线在发送或接收前应处于空闲状态;

一个起始位;

一个数据字(8或9位),最低有效位在前;

0.5、1.5、2个停止位,用以表明数据帧的结束;

使用分数波特率发生器——12位整数和4位小数的表示方法;

一个状态寄存器(USART_SR);

数据寄存器(USART_DR);

一个波特率寄存器(USART_BRR),12位的整数和4位小数;

一个智能卡模式下的保护时间寄存器(USART_GTPR)。

在同步模式中需要下列引脚:

CK:发送器时钟输出。此引脚输出用于同步传输的时钟(在Start位和Stop位上没有时钟脉冲,软件可选地,可以在最后一个数据位送出一个时钟脉冲)。数据可以在RX上同步被接收。这可以用来控制带有移位寄存器的外部设备(例如LCD驱动器)。时钟相位和极性都是软件可编程的。在智能卡模式里,CK可以为智能卡提供时钟。

在IrDA模式里需要下列引脚:

IrDA_RDI:IrDA模式下的数据输入;

IrDA_TDO:IrDA模式下的数据输出。

下列引脚在硬件流控模式中需要:

nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。

nRTS:发送请求,若是低电平,表明USART准备好接收数据。

1)USART特性描述

USART通信的数据字长可以通过编程USART_CR1寄存器中的M位,选择成8位或9位。在起始位期间,TX脚处于低电平,在停止位期间处于高电平。

空闲符号被视为完全由1组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位(1的位数也包括了停止位的位数)。

断开符号被视为在一个帧周期内全部收到0(包括停止位期间,也是0)。在断开帧结束时,发送器再插入1或2个停止位(1)来应答起始位。

发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使能位分别置位时,分别为其产生时钟。

字长设置如图6.43所示。

图6.43 字长设置

2)发送器

发送器根据M位的状态发送8位或9位的数据字。当发送使能位(TE)被设置时,发送移位寄存器中的数据在TX脚上输出,相应的时钟脉冲在CK脚上输出。

(1)字符发送

在USART发送期间,在TX引脚上首先移出数据的最低有效位。在此模式里,USART_DR寄存器包含了一个内部总线和发送移位寄存器之间的缓冲器(图6.42)。每个字符之前都有一个低电平的起始位,之后跟着的停止位,停止位的数目可配置。USART支持0.5、1、1.5和2个停止位可配置。

TE位被激活后将发送一个空闲帧。在数据传输期间不能复位TE位,否则将破坏TX脚上的数据,因为波特率计数器停止计数,正在传输的当前数据将丢失。

(2)可配置的停止位

随每个字符发送的停止位的位数可以通过控制寄存器2的位13、12进行编程。

1个停止位:停止位位数的默认值;

2个停止位:可用于常规USART模式、单线模式以及调制解调器模式;

0.5个停止位:在智能卡模式下接收数据时使用;

1.5个停止位:在智能卡模式下发送和接收数据时使用。

空闲帧包括了停止位。断开帧是10位低电平,后跟停止位(当M=0时);或者11位低电平,后跟停止位(M=1时)。不可能传输更长的断开帧(长度大于10位或者11位)。

配置停止位如图6.44所示。

图6.44 配置停止位

发送的配置步骤:

①通过在USART_CR1寄存器上置位UE位来激活USART。

②编程USART_CR1的M位来定义字长。

③在USART_CR2中编程停止位的位数。

④如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。

⑤利用USART_BRR寄存器选择要求的波特率。

⑥设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。

⑦把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。

⑧在只有一个缓冲器的情况下,对每个待发送的数据重复步骤⑦。

⑨在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。

(3)单字节通信

清零TXE位总是通过对数据寄存器的写操作来完成的。TXE位由硬件来设置,它表明:

①数据已经从TDR移送到移位寄存器,数据发送已经开始;

②TDR寄存器被清空;

③下一个数据可以被写进USART_DR寄存器而不会覆盖先前的数据。

如果TXEIE位被设置,此标志将产生一个中断。如果此时USART正在发送数据,对USART_DR寄存器的写操作把数据存进TDR寄存器,并在当前传输结束时把该数据复制进移位寄存器。如果此时USART没有发送数据,处于空闲状态,则对USART_DR寄存器的写操作直接把数据放进移位寄存器,数据传输开始,TXE位立即被置1。当一帧发送完成时(停止位发送后),如果TXE位为1,则TC位被置1;如果USART_CR1寄存器中的TCIE位被置1时,则会产生中断。

在USART_DR寄存器中写入了最后一个数据字后,在关闭USART模块之前或设置微控制器进入低功耗模式之前,必须先等待TC=1,如图6.45所示。使用下列软件过程清除TC位:

图6.45 发送时TC/TXE的变化情况

①读一次USART_SR寄存器;

②写一次USART_DR寄存器。

TC位也可以通过软件对它写0来清除。此清零方式只推荐在多缓冲器通信模式下使用。

(4)断开符号

设置SBK可发送一个断开符号。断开帧长度取决M位,如图6.2所示。如果设置SBK=1,则在完成当前数据发送后,将在TX线上发送一个断开符号。断开符号发送完成时(在断开符号的停止位时)SBK被硬件复位。USART在最后一个断开帧的结束处插入一逻辑1,以保证能识别下一帧的起始位。

如果在开始发送断开帧之前,软件又复位了SBK位,断开符号将不被发送。如果要发送两个连续的断开帧,SBK位应该在前一个断开符号的停止位之后置1。

(5)空闲符号

置位TE将使得USART在第一个数据帧前发送一空闲帧。

3)接收器

USART可以根据USART_CR1的M位接收8位或9位的数据字。

(1)起始位侦测

在USART中,如果辨认出一个特殊的采样序列,那么就认为侦测到一个起始位。该序列为“1110x0x0x0000”,如图6.46所示。

图6.46 起始位侦测

如果该序列不完整,那么接收端将退出起始位侦测并回到空闲状态(不设置标志位)等待下降沿。如果3个采样点都为0(第3、5、7位的第一次采样和第8、9、10位的第二次采样都为0),则确认收到起始位,这时设置RXNE标志位,如果RXNEIE=1,则产生中断。

如果两次3个采样点上仅有2个是0(第3、5、7位的采样点和第8、9、10位的采样点),那么起始位仍然是有效的,但是会设置NE噪声标志位。如果不能满足这个条件,则中止起始位的侦测过程,接收器会回到空闲状态(不设置标志位)。

如果有一次3个采样点上仅有2个是0(第3、5、7位的采样点或第8、9、10位的采样点),那么起始位仍然是有效的,但是会设置NE噪声标志位。

(2)字符接收

在USART接收期间,数据的最低有效位首先从RX脚移进。在此模式里,USART_DR寄存器包含的缓冲器位于内部总线和接收移位寄存器之间。

接收的配置步骤如下:

①将USART_CR1寄存器的UE置1来激活USART。

②编程USART_CR1的M位定义字长。

③在USART_CR2中编写停止位的个数。

④如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信所要求的配置DMA寄存器。

⑤利用波特率寄存器USART_BRR选择希望的波特率。

⑥设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。

当一字符被接收到时:

RXNE位被置位,它表明移位寄存器的内容被转移到RDR。换句话说,数据已经被接收并且可以被读出(包括与之有关的错误标志);

如果RXNEIE位被设置,产生中断;

在接收期间如果检测到帧错误、噪声或溢出错误,错误标志将被置1;

在多缓冲器通信时,RXNE在每个字节接收后被置1,并由DMA对数据寄存器的读操作而清零;

在单缓冲器模式里,由软件读USART_DR寄存器完成对RXNE位清除。RXNE标志也可以通过对它写0来清除。RXNE位必须在下一字符接收结束前被清零,以避免溢出错误。

(3)断开符号

当接收到一个断开帧时,USART像处理帧错误一样处理它。

(4)空闲符号

当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE位被设置,将产生一个中断。

(5)溢出错误

如果RXNE还没有被复位,又接收到一个字符,则发生溢出错误。数据只有当RXNE位被清零后才能从移位寄存器转移到RDR寄存器。RXNE标记是接收到每个字节后被置位的。如果下一个数据已被收到或先前DMA请求还没被服务时,RXNE标志仍是置1的,溢出错误产生。

当溢出错误产生时:

①ORE位被置位;

②RDR内容将不会丢失,读USART_DR寄存器仍能得到先前的数据;

③移位寄存器中以前的内容将被覆盖,随后接收到的数据都将丢失;

④如果RXNEIE位被设置或EIE和DMAR位都被设置,中断产生;

⑤顺序执行对USART_SR和USART_DR寄存器的读操作,可复位ORE位。

当ORE位置位时,表明至少有1个数据已经丢失。有两种可能性:

①如果RXNE=1,上一个有效数据还在接收寄存器RDR上,可以被读出;

②如果RXNE=0,这意味着上一个有效数据已经被读走,RDR已经没有东西可读。当上一个有效数据在RDR中被读取的同时又接收到新的(也就是丢失的)数据时,此种情况可能发生。在读序列期间(在USART_SR寄存器读访问和USART_DR读访问之间)接收到新的数据,此种情况也可能发生。

(6)噪声错误

使用过采样技术(同步模式除外),通过区别有效输入数据和噪声来进行数据恢复。

检测噪声的数据采样如图6.47及表6.14所示。

图6.47 检测噪声的数据采样

表6.14 检测噪声的数据采样

当在接收帧中检测到噪声时:

①在RXNE位的上升沿设置NE标志。

②无效数据从移位寄存器传送到USART_DR寄存器。

③在单个字节通信情况下,没有中断产生。然而,因为NE标志位和RXNE标志位是同时被设置,RXNE将产生中断。在多缓冲器通信情况下,如果已经设置了USART_CR3寄存器中EIE位,将产生一个中断。

④先读出USART_SR,再读出USART_DR寄存器,将清除NE标志位。

(7)帧错误

当以下情况发生时检测到帧错误:由于没有同步上或大量噪声的原因,停止位没有在预期的时间上将接和收识别出来。

当帧错误被检测到时:

①FE位被硬件置1。

②无效数据从移位寄存器传送到USART_DR寄存器。

③在单字节通信时,没有中断产生。然而,这个位和RXNE位同时置起,后者将产生中断。在多缓冲器通信情况下,如果USART_CR3寄存器中EIE位被置位的话,将产生中断。

④顺序执行对USART_SR和USART_DR寄存器的读操作,可复位FE位。

(8)接收期间的可配置的停止位

被接收的停止位的个数可以通过控制寄存器2的控制位来配置,在正常模式时,可以是1或2个,在智能卡模式里可能是0.5或1.5个。

0.5个停止位(智能卡模式中的接收):不对0.5个停止位进行采样。因此,如果选择0.5个停止位则不能检测帧错误和断开帧。

1个停止位:对1个停止位的采样在第8、第9和第10位采样点上进行。

1.5个停止位(智能卡模式):当以智能卡模式发送时,器件必须检查数据是否被正确地发送出去。所以接收器功能块必须被激活(USART_CR1寄存器中的RE=1),并且在停止位的发送期间采样数据线上的信号。如果出现校验错误,智能卡会在发送方采样NACK信号时,即总线上停止位对应的时间内时,拉低数据线,以此表示出现了帧错误。FE在1.5个停止位结束时和RXNE一起被置1。对1.5个停止位的采样是在第16、第17和第18采样点进行的。1.5个的停止位可以被分成2部分:一个是0.5个时钟周期,其间不做任何事情;随后是1个时钟周期的停止位,在这段时间的中点处采样。

2个停止位:对2个停止位的采样是在第一停止位的第8、第9和第10个采样点完成的。如果第一个停止位期间检测到一个帧错误,帧错误标志将被设置。第二个停止位不再检查帧错误。在第一个停止位结束时RXNE标志将被设置。

4)接收器分数波特率的产生

接收器和发送器的波特率应设置为一致,即应将USARTDIV的整数和小数部分的值设置为相同。

由上式可知,接收器和发送器的波特率是通过USARTDIV对fCK分频得到,这里的fCK是给外设的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1),USARTDIV是一个无符号的定点数,通过对寄存器USART_BRR的设置得到。在写入USART_BRR之后,波特率计数器会被波特率寄存器的新值替换。因此,不要在通信进行中改变波特率寄存器的数值。

(1)如何从USART_BRR寄存器值得到USARTDIV

例:已知USART_BRR=0x1BC,即DIV_Mantissa=0x1B,DIV_Fraction=0xC

则 USARTDIV整数部分=27

USARTDIV小数部分=12/16=0.75

可得USARTDIV=27.75

(2)如何由USARTDIV得到USART_BRR寄存器的值

例:已知USARTDIV=25.62

则 DIV_Fraction=16×0.62=9.92≈10=0x0A

DIV_Mantissa=25=0x19

可得 USART_BRR=0x19A

例:已知USARTDIV=50.99

则 DIV_Fraction=16×0.99=15.84≈16=0x10=>DIV_frac[3:0]溢出=>进位加到整数部分

DIV_Mantissa=50+进位=51=0x33

可得 USART_BRR=0x330

只有USART1使用PCLK2(最高72 MHz)。其他USART使用PCLK1(最高36 MHz)。不同时钟频率能达到的波特率上限可由表6.15得到。

表6.15 设置波特率时的误差计算

5)USART接收器容忍时钟的变化

只有当整体的时钟系统的变化处于USART异步接收器能够容忍的范围时,USART异步接收器才能正常地工作。影响这些变化的因素有:

DTRA:由于发送器误差而产生的变化(包括发送器端振荡器的变化);

DQUANT:接收器端波特率取整所产生的误差;

DREC:接收器端振荡器的变化;

DTCL:由于传输线路产生的变化(通常是由于收发器在由低变高的转换时序与由高变低转换时序之间的不一致造成的)。

需要满足:DTRA+DQUANT+DREC+DTCL<USART接收器的容忍度。(www.xing528.com)

对于正常接收数据,USART接收器的容忍度等于最大能容忍的变化,它依赖于下述选择:

由USART_CR1寄存器的M位定义的10或11位字符长度;

是否使用分数波特率产生。

在特殊的情况下,即当收到的帧包含一些M=0时,正好是10位(M=1时是11位)的空闲帧,表6.16、表6.17中的数据可能会有少许出入。

表6.16 当DIV_Fraction=0时,USART接收器的容忍度

表6.17 当DIV_Fraction!=0时,USART接收器的容忍度

6)多处理器通信

通过USART可以实现多处理器通信(将几个USART连在一个网络里)。例如某个USART设备可以是主,它的TX输出与其他USART从设备的RX输入相连接;USART从设备各自的TX输出逻辑地与在一起,并且和主设备的RX输入相连接。

在多处理器配置中,通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的USART服务开销。未被寻址的设备可启用其静默功能处于静默模式。在静默模式里:

任何接收状态位都不会被设置;

所有接收中断被禁止;

USART_CR1寄存器中的RWU位被置1。RWU可以被硬件自动控制或在某个条件下由软件写入。

根据USART_CR1寄存器中的WAKE位状态,USART可以用以下两种方法进入或退出静默模式:

如果WAKE位被复位:进行空闲总线检测;

如果WAKE位被设置:进行地址标记检测。

(1)空闲总线检测(WAKE=0)

当RWU位被写1时,USART进入静默模式。当检测到一空闲帧时,它被唤醒。然后RWU被硬件清零,但是USART_SR寄存器中的IDLE位并不置1。RWU还可以被软件写0。图6.48给出了利用空闲总线检测来唤醒和进入静默模式的一个例子。

图6.48 利用空闲总线检测的静默模式

(2)地址标记检测(WAKE=1)

在此模式里,如果MSB是1,则该字节被认为是地址,否则被认为是数据。在一个地址字节中,目标接收器的地址被放在4个LSB中。这个4位地址被接收器同它自己的地址做比较,接收器的地址被编程在USART_CR2寄存器的ADD。

当接收到的字节与它的编程地址不匹配时,USART进入静默模式。此时,硬件设置RWU位。接收该字节既不会设置RXNE标志也不会产生中断或发出DMA请求,因为USART已经在静默模式;当接收到的字节与接收器内编程地址匹配时,USART退出静默模式,然后RWU位被清零,随后的字节被正常接收。收到这个匹配的地址字节时将设置RXNE位,因为RWU位已被清零。

当接收缓冲器不包含数据时(USART_SR的RXNE=0),RWU位可以被写0或1。否则,该次写操作被忽略。图6.49给出了利用地址标记检测来唤醒和进入静默模式的例子。

图6.49 利用地址标记检测的静默模式

7)校验控制

设置USART_CR1寄存器上的PCE位,可以使能奇偶控制(发送时生成一个奇偶位,接收时进行奇偶校验)。根据M位定义的帧长度,可能的USART帧格式列在表6.18中。

表6.18 帧格式

在用地址标记唤醒设备时,地址的匹配只考虑到数据的MSB位,而不用关心校验位,MSB是数据位中最后发出的,后面紧跟校验位或者停止位。

偶校验:校验位使一帧中的7或8个LSB数据位以及校验位中1的个数为偶数。例如:数据=00110101,有4个1,如果选择偶校验(在USART_CR1中的PS=0),校验位将是0。

奇校验:校验位使一帧中的7或8个LSB数据以及校验位中1的个数为奇数。例如:数据=00110101,有4个1,如果选择奇校验(在USART_CR1中的PS=1),校验位将是1。

传输模式:如果USART_CR1的PCE位被置位,写进数据寄存器的数据的MSB位被校验位替换后发送出去(如果选择偶校验有偶数个1,如果选择奇校验有奇数个1)。如果奇偶校验失败,USART_SR寄存器中的PE标志被置1,并且如果USART_CR1寄存器的PEIE再被预先设置的话,中断产生。

8)LIN(局域互联网)模式

LIN模式是通过设置USART_CR2寄存器的LINEN位选择。在LIN模式下,下列位必须保持为0:

USART_CR2寄存器的CLKEN位;

USART_CR3寄存器的STOP[1:0]、SCEN、HDSEL和IREN。

(1)LIN发送

前述“2)”里所描述的发送步骤同样适用于LIN主发送,但和正常USART发送有以下区别:

清零M位以配置8位字长;

置位LINEN位以进入LIN模式。这时,置位SBK将发送13位0作为断开符号,然后发一位1,以允许对下一个开始位的检测。

(2)LIN接收

当LIN模式被使能时,断开符号检测电路被激活。该检测完全独立于USART接收器。断开符号只要一出现就能检测到,不管是在总线空闲时,还是在发送某数据帧期间,数据帧还未完成,又插入了断开符号的发送。

当接收器被激活时(USART_CR1的RE=1),电路监测RX上的起始信号。监测起始位的方法同检测断开符号或数据是一样的。当起始位被检测到后,电路对每个接下来的数据位,在每个位的第8、9、10个采样时钟点上进行采样。如果10个(当USART_CR2的LBDL=0)或11个(当USART_CR2的LBDL=1)连续位都是0,并且又跟着一个定界符,USART_SR的LBD标志被设置。如果LBDIE位=1,则中断产生。在确认断开符号前,要检查定界符,因为它意味RX线已经回到高电平。

如果在第10或11个数据位之前采样到了1,检测电路取消当前检测并重新寻找起始位。如果LIN模式被禁止,接收器继续如正常USART那样工作,不需要考虑检测断开符号。

如果LIN模式没有被激活(LINEN=0),接收器仍然正常工作于USART模式,不会进行断开检测。

如果LIN模式被激活(LINEN=1),只要一发生帧错误(也就是停止位检测到0,这种情况出现在断开帧),接收器就停止,直到断开符号检测电路接收到一个1(这种情况发生于断开符号没有完整地发出来),或一个定界符(这种情况发生于已经检测到一个完整的断开符号),LIN模式下的断开检测如图6.50所示,LIN模式下的断开检测与帧错误的检测如图6.51所示。

9)USART同步模式

通过在USART_CR2寄存器上写CLKEN位选择同步模式。在同步模式里,下列位必须保持清零状态:

USART_CR2寄存器中的LINEN位;

USART_CR3寄存器中的SCEN、HDSEL和IREN位。

图6.50 LIN模式下的断开检测(11位断开长度——设置了LBDL位)

图6.51 LIN模式下的断开检测与帧错误的检测

USART允许用户以主模式方式控制双向同步串行通信。CK脚是USART发送器时钟的输出。在起始位和停止位期间,CK脚上没有时钟脉冲。根据USART_CR2寄存器中LBCL位的状态,决定在最后一个有效数据位期间产生或不产生时钟脉冲。USART_CR2寄存器的CPOL位允许用户选择时钟极性,USART_CR2寄存器上的CPHA位允许用户选择外部时钟的相位,如图6.52—图6.54所示。在总线空闲期间,实际数据到来之前以及发送断开符号的时候,外部CK时钟不被激活。

图6.52 USART同步传输的例子

图6.53 USART数据时钟时序示例(M=0)

同步模式时,USART发送器和异步模式里工作相同。但是因为CK是与TX同步的(根据CPOL和CPHA),所以TX上的数据是随CK同步发出的。

同步模式的USART接收器工作方式与异步模式不同。如果RE=1,则数据在CK上采样(根据CPOL和CPHA决定在上升沿还是在下降沿),不需要任何的过采样。但必须考虑建立时间和持续时间(取决于波特率,1/16位时间)。RX数据采样/保持时间如图6.55所示。

在使用同步模式时应注意:

CK脚同TX脚一起联合工作。因此,只有在使能了发送器(TE=1),并且发送数据时(写入数据至USART_DR寄存器)才提供时钟。这意味着在没有发送数据时是不可能接收一个同步数据的(有别于异步模式)。

LBCL、CPOL和CPHA位的正确配置,应该在发送器和接收器都被禁止时,当使能了发送器或接收器时,这些位不能被改变。

最好在同一条指令中设置TE和RE,以减少接收器的建立时间和保持时间。

图6.54 USART数据时钟时序示例(M=1)

图6.55 RX数据采样/保持时间

USART只支持主模式:它不能用来自其他设备的输入时钟接收或发送数据(CK永远是输出)。

在智能卡模式下CK的功能不同,有关细节请参考智能卡模式部分。

10)单线半双工通信

单线半双工模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态:

USART_CR2寄存器的LINEN和CLKEN位;

USART_CR3寄存器的SCEN和IREN位。

USART可以配置成遵循单线半双工协议。在单线半双工模式下,TX和RX引脚在芯片内部互连。使用控制位“HALF DUPLEX SEL”(USART_CR3中的HDSEL位)选择半双工和全双工通信。当HDSEL为1时:

RX不再被使用;

当没有数据传输时,TX总是被释放。因此,它在空闲状态的或接收状态时表现为一个标准I/O端口。这就意味该I/O端口在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。

除此以外,通信与正常USART模式类似。由软件来管理线上的冲突(例如通过使用一个中央仲裁器)。特别的是,发送从不会被硬件所阻碍。当TE位被设置时,只要数据一写到数据寄存器上,发送就继续。

11)智能卡

设置USART_CR3寄存器的SCEN位选择智能卡模式。在智能卡模式下,下列位必须保持清零:

USART_CR2寄存器的LINEN位;

USART_CR3寄存器的HDSEL位和IREN位。

此外,CLKEN位可以被设置,以提供时钟给智能卡。

智能卡接口符合ISO 7816-3标准,支持智能卡异步协议,如图6.56所示。USART应该被设置为:

8位数据位加校验位,此时USART_CR1寄存器中M=1、PCE=1;

发送和接收时为1.5个停止位,即USART_CR2寄存器的STOP=11。

也可以在接收时选择0.5个停止位,但为了避免在2种配置间转换,建议在发送和接收时使用1.5个停止位。

图6.56 ISO 7816-3异步协议

当与智能卡相连接时,USART的TX与智能卡均驱动一根双向线。为了做到这点,SW_RX必须和TX连接到相同的I/O端口。在发送开始位和数据字节期间,发送器的输出使能位TX_EN被置位,在发送停止位期间被释放(弱上拉),因此在发现校验错误的情况下接收器可以将数据线拉低。如果TX_EN不被使用,则在停止位期间TX被拉到高电平,这样的话,只要TX配置成开漏,接收器也可以驱动这根线。

智能卡是一个单线半双工通信协议

①从发送移位寄存器把数据发送出去,要被延时最小1/2波特时钟。在正常操作时,一个满的发送移位寄存器将在下一个波特时钟沿开始向外移出数据。在智能卡模式里,此发送被延迟1/2波特时钟。

②如果在接收一个设置为0.5或1.5个停止位的数据帧期间,检测到一奇偶校验错误,在完成接收该帧后(即停止位结束时),发送线被拉低一个波特时钟周期。这是告诉智能卡发送到USART的数据没有被正确地接收到。此NACK信号(拉低发送线一个波特时钟周期)在发送端将产生一个帧错误(发送端被配置成1.5个停止位)。应用程序可以根据协议处理重新发送数据。如果设置了NACK控制位,发生校验错误时接收器会给出一个NACK信号,否则就不会发送NACK。

③TC标志的置位可以通过编程保护时间寄存器得以延时。在正常操作时,当发送移位寄存器变空并且没有新的发送请求出现时,TC被置位。在智能卡模式里,空的发送移位寄存器将触发保护时间计数器开始向上计数,直到保护时间寄存器中的值。TC在这段时间被强制拉低。当保护时间计数器达到保护时间寄存器中的值时,TC被置高。

④TC标志的撤销不受智能卡模式的影响。

⑤如果发送器检测到一个帧错误(收到接收器的NACK信号),发送器的接收功能模块不会把NACK当作起始位检测。根据ISO协议,接收到的NACK的持续时间可以是1或2波特时钟周期。

⑥在接收器这边,如果一个校验错误被检测到,并且NACK被发送,接收器不会把NACK检测成起始位。

断开符号在智能卡模式里没有意义。一个带帧错误的00h数据将被当成数据而不是断开符号。当来回切换TE位时,没有IDLE帧被发送,ISO协议没有定义IDLE帧。图6.57详述了USART是如何采样NACK信号的,在这个例子里,USART正在发送数据,并且被配置成1.5个停止位。为了检查数据的完整性和NACK信号,USART的接收功能块被激活。

图6.57 使用1.5个停止位检测奇偶检验错

USART可以通过CK输出为智能卡提供时钟。在智能卡模式里,CK不和通信直接关联,而是先通过一个5位预分频器简单地用内部的外设输入时钟来驱动智能卡的时钟。分频率在预分频寄存器USART_GTPR中配置。CK频率可以从fCK/2到fCK/62,这里的fCK是外设输入时钟。

12)IrDA SIR ENDEC功能模块

通过设置USART_CR3寄存器的IREN位选择IrDA模式。在IrDA模式里,下列位必须保持清零:

USART_CR2寄存器的LINEN、STOP和CLKEN位;

USART_CR3寄存器的SCEN和HDSEL位。

IrDA SIR物理层规定使用反相归零调制方案(RZI),该方案用一个红外光脉冲代表逻辑0,如图6.58所示。SIR发送编码器对从USART输出的NRZ(非归零)比特流进行调制。输出脉冲流被传送到一个外部输出驱动器和红外LED。USART为SIR ENDEC最高只支持到115.2 kb/s速率。在正常模式里,脉冲宽度规定为一个位周期的3/16。

SIR接收解码器对来自红外接收器的归零位比特流进行解调,并将接收到的NRZ串行比特流输出到USART。在空闲状态里,解码器输入通常是高(标记状态)。发送编码器输出的极性和解码器的输入相反。当解码器输入低时,检测到一个起始位。

IrDA是一个半双工通信协议。如果发送器忙(也就是USART正在送数据给IrDA编码器),IrDA接收线上的任何数据将被IrDA解码器忽视。如果接收器忙(也就是USART正在接收从IrDA解码器来的解码数据),从USART到IrDA的TX上的数据将不会被IrDA编码。当接收数据时,应该避免发送,因为将被发送的数据可能被破坏。

图6.58 IrDA SIR ENDEC框图

SIR发送逻辑把0作为高脉冲发送,把1作为低电平发送。脉冲的宽度规定为正常模式时位周期的3/16,如图6.59所示。

图6.59 IrDA数据调制(3/16)——普通模式

SIR接收逻辑把高电平状态解释为1,把低脉冲解释为0。

发送编码器输出与解码器输入有着相反的极性。当空闲时,SIR输出处于低状态。

SIR解码器把IrDA兼容的接收信号转变成给USART的比特流。

IrDA规范要求脉冲要宽于1.41 μs。脉冲宽度是可编程的。接收器端的尖峰脉冲检测逻辑滤除宽度小于2个PSC周期的脉冲(PSC是在IrDA低功耗波特率寄存器USART_GTPR中编程的预分频值)。宽度小于1个PSC周期的脉冲一定被滤除掉,但是那些宽度大于1个而小于2个PSC周期的脉冲可能被接收或滤除,那些宽度大于2个周期的将被视为一个有效的脉冲。当PSC=0时,IrDA编码器/解码器不工作。

接收器可以与一低功耗发送器通信。

在IrDA模式里,USART_CR2寄存器上的STOP位必须配置成1个停止位。

13)利用DMA连续通信

USART可以利用DMA连续通信。Rx缓冲器和Tx缓冲器的DMA请求是分别产生的。如果所用产品无DMA功能,应按前面章节所描述的发送和接收方法使用USART。在USART2_SR寄存器里,可以清零TXE/RXNE标志来实现连续通信。

(1)利用DMA发送

使用DMA进行发送,如图6.60所示,可以通过设置USART_CR3寄存器上的DMAT位激活。当TXE位被置为1时,DMA就从指定的SRAM区传送数据到USART_DR寄存器。为USART的发送分配一个DMA通道的步骤如下(x表示通道号):

图6.60 利用DMA发送

①在DMA控制寄存器上将USART_DR寄存器地址配置成DMA传输的目的地址。在每个TXE事件后,数据将被传送到这个地址;

②在DMA控制寄存器上将存储器地址配置成DMA传输的源地址,在每个TXE事件后,将从此存储器区读出数据并传送到USART_DR寄存器;

③在DMA控制寄存器中配置要传输的总的字节数;

④在DMA寄存器上配置通道优先级

⑤根据应用程序的要求,配置在传输完成一半还是全部完成时产生DMA中断;

⑥在DMA寄存器上激活该通道。

当传输完成DMA控制器指定的数据量时,DMA控制器在该DMA通道的中断向量上产生一中断。在发送模式下,当DMA传输完所有要发送的数据时,DMA控制器设置DMA_ISR寄存器的TCIF标志;监视USART_SR寄存器的TC标志可以确认USART通信是否结束,这样可以在关闭USART或进入停机模式之前避免破坏最后一次传输的数据;软件需要先等待TXE=1,再等待TC=1。

(2)利用DMA接收

如图6.61所示,可以通过设置USART_CR3寄存器的DMAR位激活使用DMA进行接收,每次接收到一个字节,DMA控制器就把数据从USART_DR寄存器传送到指定的SRAM区。为USART的接收分配一个DMA通道的步骤如下(x表示通道号):

通过DMA控制寄存器把USART_DR寄存器地址配置成传输的源地址,在每个RXNE事件后,将从此地址读出数据并传输到存储器;

通过DMA控制寄存器把存储器地址配置成传输的目的地址,在每个RXNE事件后,数据将从USART_DR传输到此存储器区;

在DMA控制寄存器中配置要传输的总的字节数;

在DMA寄存器上配置通道优先级;

图6.61 利用DMA接收

根据应用程序的要求配置在传输完成一半还是全部完成时产生DMA中断;

在DMA控制寄存器上激活该通道;

当接收完成DMA控制器指定的传输量时,DMA控制器在该DMA通道的中断矢量上产生一中断。

(3)多缓冲器通信中的错误标志和中断产生

在多缓冲器通信的情况下,通信期间如果发生任何错误,在当前字节传输后将置起错误标志。如果中断使能位被设置,将产生中断。在单个字节接收的情况下,和RXNE一起被置起的帧错误、溢出错误和噪声标志,有单独的错误标志中断使能位;如果设置了,会在当前字节传输结束后产生中断。

14)硬件流控制

利用nCTS输入和nRTS输出可以控制2个设备间的串行数据流。图6.62表明在这个模式里如何连接2个设备。

图6.62 两个USART间的硬件流控制

通过将UASRT_CR3中的RTSE和CTSE置位,可以分别独立地使能RTS流控制和CTS流控制。

(1)RTS流控制

如果RTS流控制被使能(RTSE=1),只要USART接收器准备好接收新的数据,nRTS就变成有效(接低电平)。当接收寄存器内有数据到达时,nRTS被释放,由此表明希望在当前帧结束时停止数据传输。图6.63是一个启用RTS流控制通信的例子。

图6.63 RTS流控制

(2)CTS流控制

如果CTS流控制被使能(CTSE=1),发送器在发送下一帧前检查nCTS输入。如果nCTS有效(被拉成低电平),则下一个数据被发送(假设那个数据是准备发送的,也就是TXE=0),否则下一帧数据不被发出去。若nCTS在传输期间被变成无效,则当前的传输完成后停止发送。

当CTSE=1时,只要nCTS输入一变换状态,硬件就自动设置CTSIF状态位。它表明接收器是否准备好进行通信。如果设置了USART_CT3寄存器的CTSIE位,则产生中断。图6.64是一个启用CTS流控制通信的例子。

图6.64 CTS流控制

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈