USART串口的一般应用.docx
《USART串口的一般应用.docx》由会员分享,可在线阅读,更多相关《USART串口的一般应用.docx(49页珍藏版)》请在冰豆网上搜索。
USART串口的一般应用
第四章USART串口的一般应用
4.1USART介绍
通用同步异步收发器(USART),提供了一种灵活的方法,与使用工业标准的异步串行外部设备之间进行全双工数据交换。
USART利用分数波特率发生器提供宽范围的波特率选择。
它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。
它还允许多处理器通信。
使用多缓冲器配置的DMA方式,可以实现高速数据通信。
总之,STM32F10x系列芯片所提供的USART串口功能时分强大,基本上所知的串口功能,其都能通过硬件来实现。
4.1.1USART主要特性
1》全双工异步通信;
2》NRZ标准格式;
3》分数波特率发生器系统,发送和接收共用的可编程波特率,最高达4.5Mbits/s
4》可编程数据字长度(8位或9位)
5》可配置的停止位-支持1或2个停止位
6》LIN主发送同步断开符的能力以及LIN从检测断开符的能力,当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符
7》发送方为同步传输提供时钟
8》IRDASIR编码器解码器,在正常模式下支持3/16位的持续时间
9》智能卡模拟功能,智能卡接口支持ISO7816-3标准里定义的异步智能卡协议,智能卡用到的0.5和1.5个停止位
10》单线半双工通信
11》可配置的使用DMA的多缓冲器通信─在SRAM里利用集中式DMA缓冲接收/发送字节
12》单独的发送器和接收器使能位
13》检测标志,接收缓冲器满,发送缓冲器空,传输结束标志
14》校验控制,发送校验位,对接收数据进行校验
15》四个错误检测标志。
溢出错误;噪音错误;帧错误;校验错误;
16》10个带标志的中断源。
CTS改变、LIN断开符检测、发送数据寄存器空、发送完成、接收数据寄存器满、检测到总线为空闲、溢出错误、帧错误、噪音错误和校验错误;
17》多处理器通信--如果地址不匹配,则进入静默模式
18》从静默模式中唤醒(通过空闲总线检测或地址标志检测)
19》两种唤醒接收器的方式:
地址位(MSB,第9位),总线空闲
4.1.2USART功能概述
接口通过三个引脚与其他设备连接在一起。
任何USART双向通信至少需要两个脚:
接收数据输入(RX)和发送数据输出(TX)。
RX:
接收数据串行输。
通过过采样技术来区别数据和噪音,从而恢复数据。
TX:
发送数据输出。
当发送器被禁止时,输出引脚恢复到它的I/O端口配置。
当发送器被激活,并且不发送数据时,TX引脚处于高电平。
在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。
1.在异步模式中:
1》总线在发送或接收前应处于空闲状态
2》一个起始位
3》一个数据字(8或9位),最低有效位在前
4》0.5,1.5,2个的停止位,由此表明数据帧的结束
5》使用分数波特率发生器——12位整数和4位小数的表示方法
6》一个状态寄存器(USART_SR)
7》数据寄存器(USART_DR)
8》一个波特率寄存器(USART_BRR),12位的整数和4位小数
9》一个智能卡模式下的保护时间寄存器(USART_GTPR)
2.在同步模式中
需要用到SCLK引脚:
发送器时钟输出。
此引脚输出用于同步传输的时钟,(在Start位和Stop位上没有时钟脉冲,软件可选地,可以在最后一个数据位送出一个时钟脉冲)。
数据可以在RX上同步被接收。
这可以用来控制带有移位寄存器的外部设备(例如LCD驱动器)。
时钟相位和极性都是软件可编程的。
在智能卡模式里,SCLK可以为智能卡提供时钟。
3.在IrDA模式里需要下列引脚:
1》IrDA_RDI:
IrDA模式下的数据输入。
2》IrDA_TDO:
IrDA模式下的数据输出。
4.硬件流控模式中需要下列引脚在:
1》nCTS:
清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。
2》nRTS:
发送请求,若是低电平,表明USART准备好接收数据
4.1.3发送器
发送器根据M位的状态发送8位或9位的数据字。
当发送使能位(TE)被设置时,使能USART同步串口,这时发送移位寄存器中的数据在TX脚上输出,相应的时钟脉冲在SCLK脚上输出。
字符发送在TX引脚上首先移出数据的最低有效位。
每个字符之前都有一个低电平的起始位;之后跟着的停止位,其数目可配置。
注意:
1.在数据传输期间不能复位TE位,否则将破坏TX脚上的数据,因为波特率计数器停止计数。
正在传输的当前数据将丢失。
2.TE位被激活后将发送一个空闲帧。
4.1.3.1可配置的停止位
随每个字符发送的停止位的位数可以通过控制寄存器2的位13、12进行编程。
1.1个停止位:
停止位位数的默认值。
2.2个停止位:
可用于常规USART模式、单线模式以及调制解调器模式。
3.0.5个停止位:
在智能卡模式下接收数据时使用。
4.1.5个停止位:
在智能卡模式下发送数据时使用。
空闲帧包括了停止位。
断开帧是10位低电平,后跟停止位(当m=0时);或者11位低电平,后跟停止位(m=1时)。
不可能传输更长的断开帧(长度大于10或者11位)。
配置步骤:
1.通过在USART_CR1寄存器上置位UE位来激活USART
2.编程USART_CR1的M位来定义字长。
3.在USART_CR2中编程停止位的位数。
4.如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。
按多缓冲器通信中的描述配置DMA寄存器。
5.设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
6.利用USART_BRR寄存器选择要求的波特率。
7.把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。
在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
4.1.3.2单字节通信
清零TXE位总是通过对数据寄存器的写操作来完成的。
TXE位由硬件来设置,它表明:
1.数据已经从TDR移送到移位寄存器,数据发送已经开始
2.TDR寄存器被清空
3.下一个数据可以被写进USART_DR寄存器而不会覆盖先前的数据
如果TXEIE位被设置,此标志将产生一个中断。
如果此时USART正在发送数据,对USART_DR寄存器的写操作把数据存进TDR寄存器,并在当前传输结束时把该数据复制进移位寄存器。
如果此时USART没有在发送数据,处于空闲状态,对USART_DR寄存器的写操作直接把数据放进移位寄存器,数据传输开始,TXE位立即被置起。
当一帧发送完成时(停止位发送后),TC位被置起,并且如果USART_CR1寄存器中的TCIE位被置起时,中断产生。
先读一下USART_SR寄存器,再写一下USART_DR寄存器,可以完成对TC位的清零。
注意:
TC位也可以通过对它软件写’0’来清除。
此清零方式只在多缓冲器通信模式下推荐使用。
4.1.3.3断开符号
设置SBK可发送一个断开符号。
断开帧长度取决M位(见0)。
如果设置SBK=1,在完成当前数据发送后,将在TX线上发送一个断开符号。
断开字符发送完成时(在断开符号的停止位时)SBK被硬件复位。
USART在最后一个断开帧的结束处插入一逻辑’1’,以保证能识别下一帧的起始位。
注意:
如果在开始发送断开帧之前,软件又复位了SBK位,断开符号将不被发送。
如果要发送两个连续的断开帧,SBK位应该在前一个断开符号的停止位之后置起。
4.1.3.4空闲符号
置位TE将使得USART在第一个数据帧前发送一空闲帧
4.1.4接收器
4.1.4.1接收配置
在USART接收期间,数据的最低有效位首先从RX脚移进。
在此模式里,USART_DR寄存器包含的缓冲器位于内部总线和接收移位寄存器之间。
数据接收配置步骤:
1.将USART_CR1寄存器的UE置1来激活USART。
2.编程USART_CR1的M位定义字长
3.在USART_CR2中编写停止位的个数
4.如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。
按多缓冲器通信所要求的配置DMA寄存器。
5.利用波特率寄存器USART_BRR选择希望的波特率。
6.设置USART_CR1的RE位。
激活接收器,使它开始寻找起始位。
4.1.4.2当一字符被接收到时,
1.RXNE位被置位。
它表明移位寄存器的内容被转移到RDR。
换句话说,数据已经被接收并且可以被读出(包括与之有关的错误标志)。
2.如果RXNEIE位被设置,产生中断。
3.在接收期间如果检测到帧错误,噪音或溢出错误,错误标志将被置起,
4.在多缓冲器通信时,RXNE在每个字节接收后被置起,并由DMA对数据寄存器的读操作而清零。
5.在单缓冲器模式里,由软件读USART_DR寄存器完成对RXNE位清除。
RXNE标志也可以通过对它写0来清除。
RXNE位必须在下一字符接收结束前被清零,以避免溢出错误。
注意:
在接收数据时,RE位不应该被复位。
如果RE位在接收时被清零,当前字节的接收被丢失。
4.1.5分数波特率的产生
接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同。
Tx/Rx波特率=fPCLKx/(16*USARTDIV))
这里的fPCLKx(x=1、2)是给外设的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1)
USARTDIV是一个无符号的定点数。
这12位的值设置在USART_BRR寄存器。
如何从USART_BRR寄存器值得到USARTDIV
例1:
要求USARTDIV=25.62d,就有:
DIV_Fraction=16*0.62d=9.92d,近似等于10d=0x0A
DIV_Mantissa=mantissa(25.620d)=25d=0x19
于是,USART_BRR=0x19A
例2:
要求USARTDIV=50.99d
就有:
DIV_Fraction=16*0.99d=15.84d=>近似等于16d=0x10
DIV_Mantissa=mantissa(50.990d)=50d=0x32
注意:
更新波特率寄存器USART_BRR后,波特率计数器中的值也立刻随之更新。
所以在通信进行时不应改变USART_BRR中的值。
表4-1-1设置波特率的误差表
波特率
fPCLK=36MHz
fPCLK=72MHz
序号
Kbps
实际
置于波特率
寄存器中的值
误差%
实际
置于波特率
寄存器中的值
误差%
1
2.4
2.400
937.5
0%
2.4
1875
0%
2
9.6
9.600
234.375
0%
9.6
468.75
0%
3
19.2
19.2
117.1875
0%
19.2
234.375
0%
4
57.6
57.6
39.0625
0%
57.6
78.125
0%
5
115.2
115.384
19.5
0.15%
115.2
39.0625
0%
6
230.4
230.769
9.75
0.16%
230.769
19.5
0.16%
7
460.8
461.538
4.875
0.16%
461.538
9.75
0.16%
8
921.6
923.076
2.4375
0.16%
923.076
4.875
0.16%
9
2250
2250
1
0%
2250
2
0%
10
4500
不可能
不可能
不可能
4500
1
0%
注:
1.CPU的时钟频率越低某一特定波特率的误差也越低
2.只有USART1使用PCLK2(最高72MHz)。
其它USART使用PCLK1(最高36MHz)。
4.1.6多处理器通信
通过USART可以实现多处理器通信(将几个USART连在一个网络里)。
例如某个USART设备可以是主,它的TX输出和其他USART从设备的RX输入相连接;USART从设备各自的TX输出逻辑地与在一起,并且和主设备的RX输入相连接。
在多处理器配置中,通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的USART服务开销。
未被寻址的设备可启用其静默功能置于静默模式。
在静默模式里:
1.任何接收状态位都不会被设置。
2.所有接收中断被禁止。
3.USART_CR1寄存器中的RWU位被置1。
RWU可以被硬件自动控制或在某个条件下由软件写入。
根据USART_CR1寄存器中的WAKE位状态,USART可以用二种方法进入或退出静默模式。
4.如果WAKE位被复位:
进行空闲总线检测。
5.如果WAKE位被设置:
进行地址标记检测。
空闲总线检测(WAKE=0)
当RWU位被写1时,USART进入静默模式。
当检测到一空闲帧时,它被唤醒。
然后RWU被硬件清零,但是USART_SR寄存器中的IDLE位并不置起。
RWU还可以被软件写0。
地址标记(addressmark)检测(WAKE=1)。
在这个模式里,如果MSB是1,该字节被认为是地址,否则被认为是数据。
在一个地址字节中,目标接收器的地址被放在4个LSB中。
这个4位地址被接收器同它自己地址做比较,接收器的地址被编程在USART_CR2寄存器的ADD。
如果接收到的字节与它的编程地址不匹配时,USART进入静默模式。
该字节的接收既不会置起RXNE标志也不会产生中断或发出DMA请求,因为USART已经在静默模式。
当接收到的字节与接收器内编程地址匹配时,USART退出静默模式。
然后RWU位被清零,随后的字节被正常接收。
匹配的地址字节将置位RXNE位,因为RWU位已被清零。
当接收缓冲器不包含数据时(USART_SR的RXNE=0),RWU位可以被写0或1。
否则,该次写操作被忽略。
4.1.7LIN(局域互联网)模式
LIN模式是通过设置USART_CR2寄存器的LINEN位选择。
在LIN模式下,下列位必须保持为0:
1.USART_CR2寄存器的CLKEN位
2.USART_CR3寄存器的STOP[1:
0],SCEN,HDSEL和IREN
4.1.7.1LIN发送
LIN主发送和一般的串口发送基本相同,但和正常USART发送有以下区别:
1.清零M位以配置8位字长
2.置位LINEN位以进入LIN模式。
这时,置位SBK将发送13位’0’作为断开符号。
然后发一位’1’,以允许对下一个开始位的检测。
4.1.7.2LIN接收
当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’(这种情况发生于断开符号没有完整的发出来),或一个定界符(这种情况发生于已经检测到一个完整的断开符号)。
4.1.8USART同步模式
USART允许用户以主模式方式控制双向同步串行通信。
SCLK脚是USART发送器时钟的输出。
在起始位和停止位期间,SCLK脚上没有时钟脉冲。
根据USART_CR2寄存器中LBCL位的状态,决定在最后一个有效数据位期间产生或不产生时钟脉冲。
USART_CR2寄存器的CPOL位允许用户选择时钟极性,USART_CR2寄存器上的CPHA位允许用户选择外部时钟的相位(见图4-1-1、图4-1-2和图4-1-3)。
在总线空闲期间,实际数据到来之前以及发送断开符号的时候,外部SCLK时钟不被激活。
同步模式时,USART发送器和异步模式里工作一模一样。
但是因为SCLK是与TX同步的(根据CPOL和CPHA),所以TX上的数据是随SCLK同步发出的。
同步模式的USART接收器工作方式与异步模式不同。
如果RE=1,数据在SCLK上采样(根据CPOL和CPHA决定在上升沿还是下降沿),不需要任何的过采样。
但必须考虑建立时间和持续时间(取决于波特率,1/16位时间)。
注意:
1.SCLK脚同TX脚一起联合工作。
因而,只有在发送器被激活(TE=1),且数据被发送时(USART_DR寄存器被写入)才提供时钟。
这意味着在没有发送数据时是不可能接收一个同步数据的。
2.LBCL,CPOL和CPHA位的正确配置,应该在发送器和接收器都被禁止时;当发送器或接收器被激活时,这些位不能被改变
3.建议在同一条指令中设置TE和RE,以减少接收器的建立时间和保持时间。
4.USART只支持主模式:
它不能用来自其他设备的输入时钟接收或发送数据(SCLK永远是输出)。
图4-1-1USART同步传输的例
图4-1-2USART数据时钟时序示例(M=0)
图4-1-3USART数据时钟时序示例(M=1)
4.1.9单线半双工通信
USART可以配置成遵循单线半双工协议。
使用控制位“HALFDUPLEXSEL”选择半双工和全双工通信。
当HDSEL写’1’时
1.RX不再被使用
2.当没有数据传输时,TX总是被释放。
因此,它在空闲状态的或接收状态时表现为一个标准I/O口。
这就意味该I/O在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。
除此以外,通信与正常USART模式类似。
由软件来管理线上的冲突(例如通过使用一个中央仲裁器)。
特别的是,发送从不会被硬件所阻碍。
当TE位被设置时,只要数据一写到数据寄存器上,发送就继续。
4.1.10智能卡
设置USART_CR3寄存器的SCEN位选择智能卡模式。
在智能卡模式下,下列位必须保持清零:
1.USART_CR2寄存器的LINEN位
2.USART_CR3寄存器的HDSEL位和IREN位
此外,CLKEN位可以被设置,以提供时钟给智能卡。
智能卡接口设计成ISO7816-3标准所定义的那样支持异步协议的智能卡。
USART应该被设置为:
8位数据位加校验位:
此时USART_CR1寄存器M=1,PCE=1,并且下列条件满足其一:
1>接收时0.5个停止位:
即USART_CR2寄存器的STOP=01
2>发送时1.5个停止位:
即USART_CR2寄存器的STOP=11
图4-1-4给出的例子说明了数据线上,在有校验错误和没校验错误两种情况下的信号。
图4-1-4ISO7816-3异步协议
当与智能卡相连接时,USART的TX驱动一根智能卡也驱动的双向线。
为了做到这点,SW_RX必须和TX连接到相同的I/O口。
在发送开始位和数据字节期间,发送器的输出使能位TX_EN被置起,在发送停止位期间被释放(弱上拉),因此在发现校验错误的情况下接收器可以将数据线拉低。
如果TX_EN不被使用,在停止位期间TX被拉到高电平:
这样的话,只要TX配置成开漏,接收器也可以驱动这根线。
智能卡是一个单线半双工通信协议
1.从发送移位寄存器把数据发送出去,要被延时最小1/2波特时钟。
在正常操作时,一个满的发送移位寄存器将在下一个波特时钟沿开始向外移出数据。
在智能卡模式里,此发送被延迟1/2波特时钟。
2.如果在接收数据帧期间,检测到一校验错误,该帧接收完成后(也就是在0.5停止位结束时),发送线被拉低一个波特时钟周期。
这是告诉智能卡发送到USART的数据没有被正确接收到。
此NACK信号(拉低发送线一个波特时钟周期)在发送端将产生一个帧错误(发送端被配置成1.5个停止位)。
应用程序可以根据协议处理重新发送的数据。
如果NACK控制位被设置,发生校验错误时接收器会给出一个NACK信号;否则就不会发送NACK。
3.TC标志的置起可以通过编程保护时间寄存器得以延时。
在正常操作时,当发送移位寄存器变空并且没有新的发送请求出现时,TC被置起。
在智能卡模式里,空的发送移位寄存器将触发保护时间计数器开始向上计数,直到保护时间寄存器中的值。
TC在这段时间被强制拉低。
当保护时间计数器达到保护时间寄存器中的值时,TC被置高。
4.TC标志的撤销不受智能卡模式的影响。
5.如果发送器检测到一个帧错误(收到接收器的NACK信号),发送器的接收功能模块不会把NACK当作起始位检测。
根据ISO协议,接收到的NACK的持续时间可以是1或2波特时钟周期。
6.在接收器这边,如果一个校验错误被检测到,并且NACK被发送,接收器不会把NACK检测成起始位。
注意:
1.断开符号在智能卡模式里没有意义。
一个带帧错误的00h数据将被当成数据而不是断开符号。
2.当来回切换TE位时,没有IDLE帧被发送。
ISO协议没有定义IDLE帧。
在这个例子里,USART正在发送数据,并且被配置成1.5个停止位。
为了检查数据的完整性和NACK信号,USART的接收功能块被激活。
USART可以通过SCLK输出为智能卡提供时钟。
在智能卡模式里,SCLK不和通信直接关联,而是先通过一个5位预分频器简单地用内部的外设输入时钟来驱动智能卡的时钟。
分频率在预分频寄存器USART_GTPR中配置。
SCLK频率可以从fCK/2到fCK/62,这里的fCK是外设输入时钟。
4.1.11IrDASIRENDEC功能块
IrDASIR物理层规定使用反相归零调制方案(RZI),该方案用一个红外光脉冲代表逻辑’0’(见图4-5)。
SIR发送编码器对从USART输出的NRZ(非归零)比特流进行调制。
输出脉冲流被传送到一个外部输出驱动器和红外LED。
USART为SIRENDEC最高只支持到115.2Kbps速率。
在正常模式里,脉冲宽度规定为一个位周期的3/16。
SIR接收解码器对来自红外接收器