×
单片机 > 单片机程序设计 > 详情

STM32F10xxx架构:通用同步异步收发器USART--USART通用

发布时间:2020-06-06 发布时间:
|
USART简介:
USART利用分数波特率发生器提供宽范围的波特率选择。支持同步单向通信和半双工单线通信,也支持LIN(局部互联网)、智能卡协议、IrDA(红外数据组织)SIR ENDEC规范、调制解调器(CTS/RTS)操作。允许多处理器通信。使用多级缓冲配置的DMA方式,可以实现高速数据通信。
 
USART主要特性:
全双工异步通信,NRZ标准格式,分数波特率发生器系统(发生和接收共用的可编程波特率,最高达4.5Mbits/s),8-9位数据长度,1-2位停止位,LIN主发送同步断开符的能力及LIN从检测断开符的能力(当配置成LIN时生成13位断开符,检测10/11位断开符),发送方为同步传输提供时钟,IRDA SIR编解码器(正常模式下支持3/16位持续时间),智能卡模拟功能(支持ISO7816-3标准的异步智能卡协议,用到0.5/1.5个停止位),单线半双工通信,可配置的使用DMA的多缓冲器通信(在SRAM里利用集中式DMA缓冲接收/发送字节),单独的发送器和接收器使能位,检测标志(接收缓冲器满,发送缓冲器空,传输结束标志),校验控制(发送校验位,对接收数据进行校验),四个错误检测标志(溢出,噪音,帧错误,校验错误),10个带标志中断源(CTS改变,LIN断开符检测,发送数据寄存器空,发送完成,接收数据寄存器满,检测到总线为空闲,溢出错误,帧错误,噪音错误,校验错误),多处理器通信(如果地址不匹配,则进入静默模式),从静默模式中唤醒(通过总线检测和地址标志检测),两种唤醒接收器的方式(地址位MSB 第9位,总线空闲)。
 
USART功能概述:
1、USART双向通信至少需要两个脚:RX(接收数据输入)、TX(发送数据输出)。
RX:接收数据串行输入,通过采样技术来区别数据和噪音,从而恢复数据。
TX:发送数据输出,当发送器被禁止时,输出引脚恢复到它的IO端口配置。当发送器被激活并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此引脚被同时用于数据的发送和接收。
总线在发送和接收前应处于空闲状态,起始位(1个),数据位(1个,8-9位,最低有效位在前),停止位(0.5,1.5,2位,表明数据帧结束),分数波特率发生器(12位整数和4位小数的表示方法),状态寄存器1个(USART_SR),数据寄存器1个(USART_DR),波特率寄存器1个(USART_BRR,12位整数和4位小数)。一个智能卡模式下的保护时间寄存器(USART_GTPR)。
2、USART工作于同步模式时,需要一个引脚:CK。
CK:发送器时钟的输出,此引脚输出用于同步传输的时钟。在start和stop位上没有时钟脉冲,软件可选地,可以在最后一个数据位送出一个时钟脉冲。数据可以在RX上同步被接收。这可以用来控制带移位寄存器的外部设备(例如LCD驱动器),时钟相位和极性都是软件可编程的。在智能卡模式里,CK可以为智能卡提供时钟。
3、USART工作于IRDA模式时,需要两个引脚:IRDA_RDI(数据输入),IRDA_TDO(数据输出)
4、USART工作于硬件流控模式时,需要两个引脚:nCTS,nRTS。
nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。
nRTS:发送请求,若是低电平,表明USART准备好接受数据。
 
USART特性描述:
字长可以通过编程USART_CR1寄存器中的M位,选择成8位或者9位。在起始位期间,TX脚处于低电平,在停止位期间处于高电平。
空闲符号被视为完全由“1”组成的完整的数据帧,后面跟着包含了数据的下一帧的开始位(“1”的位数也包含了停止位的位数)。
断开符号被视为在一个帧周期内全部接收到“0”(包括停止位期间,也是“0”)。在断开帧结束时,发送器再插入1或2个停止位(“1”)来应答起始位。
发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使能分别置位时,分别为其产生时钟。
 
USART寄存器描述:
1、USART状态寄存器(USART_SR)
1】地址偏移:0x00,复位值:0x00C0
2】位31-位10:保留位,硬件强制为0
位9:CTS(CTS标志位):在USART4和USART5上不存在这一位。参照上文所述的硬件流模式(USART功能概述里面)。如果设置了“CTSE位”,当nCTS输入变化状态时,该位被硬件置高。由软件将其清零。如果USART_CR3中的CTSIE为“1”,则产生中断。   置为0时,表示nCTS状态线上没有变化,置为1时,表示nCTS状态线上发生变化。
位8:LBD(LIN断开检测标志):当探测到LIN断开时,该位由硬件置“1”,由软件清“0”(向该位写0)。如果USART_CR3中的LBDIE为“1”,则产生中断。 置为0时,表示没有检测到LIN断开,置为1时,表示检测到LIN断开。
位7:TXE(发送数据寄存器空):当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位,如果USART_CR1寄存器的TXEIE为1,则产生中断。对USART_DR的写操作,将该位清零。注意在单缓冲器传输中使用该位。  置为0时表示数据还没有被转移到移位寄存器,置为1时,表示数据已经被转移到移位寄存器。
位6:TC(发送完成):当包含数据的一帧发送完成后,并且TXE=1时,由硬件将该位置1。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写“0”来清除,只有在多缓冲通讯中才推荐这种清除程序。置为0时,表示发送未完成,置为1时,表示发送完成。
位5:RXNE(读数据寄存器非空):当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清0。RXNE位也可以通过写0来清除,只有在多缓冲通讯录中才推荐这种清除程序。置为0表示数据没有收到,置为1表示收到数据,且可以读出。
位4:IDLE(检测到总线空闲):当检测到总线空闲时,该位被硬件置位。如果USART_CR1中的IDLEIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后读USART_DR)。置为0时,表示没有检测到空闲总线,为1时表示检测到空闲总线。备注:IDLE位不会被置高直到RXNE位被置起(即又一次检测到空闲总线)
位3:ORE(过载错误):当RXNE仍然是1的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬件将该位置位。如果USART_CR1中的RXNEIE为1的话,则产生中断。由软件序列将其清零(先读USART_SR,然后读USART_CR)。置为0时表示没有过载错误,置为1时表示检测到过载错误。备注:如果该位被置位时,RDR寄存器的值不会丢失。但是移位寄存器中的数据会被覆盖。如果设置了EIE位,在多缓冲器通信模式下,ORE标志置位会产生中断。
位2:NE(噪声错误标志):当接收到的帧检测到噪音时,由硬件对该位置位。由软件序列对其清零(先读USART_SR,然后读USART_DR)。置为0时表示没有检测到噪声,置为1时表示检测到噪声。备注:该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。在多缓冲区通信模式下,如果设置了EIE位,则设置NE标志时会产生中断。
位1:FE(帧错误):当检测到同步错位,过多的噪声或者检测到断开符,该位被硬件置位,由软件序列将其清零,先读USART_SR,再读USART_DR。为0时表示没有检测到帧错误,为1时表示检测到帧错误或者break符。备注:该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。如果当前传输的数据既产生了帧错误,又产生了过载错误,硬件还是会挤出该数据的传输,并且只设置ORE标志位。在多缓冲区通信模式下,如果设置了EIE位,则设置FE标志会产生中断。
位0:PE(校验错误):在接收模式下,如果出现奇偶校验错误,硬件对该位置位。由软件序列对其清零(依次读USART_SR和USART_DR)。在清除PE位前,软件必须等待RXNE标志位被置“1”。如果USART_CR1中的PEIE为“1”,则产生中断。置为0时表示没有奇偶校验错误,置为1时表示存在奇偶校验错误。
 
2、USART数据寄存器(USART_DR)
1】地址偏移:0x04,复位值:不定
2】位31-9:保留位,硬件强制为0;
位8-0:DR[8:0],数据值。包含了发送和接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接受用(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR寄存器提供了输出移位寄存器和内部总线之间的并行接口。当使能校验位(USART_CR1中的PCE位被置位)进行发送时,写到MSB的值(根据数据长度不同,MSB是第7位或者第8位)会被后来的校验位所取代。当使能校验位进行接收时,读到MSB位时接收到的校验位。
 
3、波特比率寄存器(USART_BRR)
1】地址偏移:0x08,复位值:0x0000
2】位31-16:保留位,硬件强制置为0;
位15-4:DIV_Mantissa[11:0],USARTDIV的整数部分。这12位定义了USART分频器除法因子(USARTDIV)的整数部分。
位3-0:DIV_Fraction[3:0],USARTDIV的小数部分。
 
分数波特率的产生:
接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同。
Tx/Rx 波特率 = fck/(16*USARTDIV)
这里的fck是给外设的时钟(PCLK1用于USART2,3,4,5),(PCLK2用于USART1)。
USARTDIV是一个无符号的定点数,则12位的值设置在USART_BRR寄存器。备注在写入USART_BRR之后,波特率计数器会被波特率寄存器的值所替换。因此,不要再通信进行中改变波特率寄存器的数值。
从USART_BRR寄存器得到USARTDIV
例1:若DIV_Mantissa = 27,DIV_Fraction=12(USART_BRR = 0x1BC),则:
Mantissa(USARTDIV) = 27
Fraction(USARTDIV) = 12/16 = 0.75
所以此时USARTDIV = 27.75
例2:要求USARTDIV = 25.62,则:
DIV_Fraction = 16*0.62 = 9.92,最接近的整数是10 = 0x0A
DIV_Mantissa = mantissa(25.620) = 25 = 0x19
于是USART_BRR = 0x19A
例3:要求USARTDIV = 50.99,则:
DIV_Fraction = 16*0.99 = 15.84,最接近的整数是16 = 0x10 => DIV_frac[3:0]溢出 => 进位必须加到小数部分。
DIV_Mantissa = mantissa(50.990+进位) = 51 = 0x33
于是USART_BRR = 0x330,USARTDIV = 51
 
4、控制寄存器1(USART_CR1)
1】地址偏移:0x0C,复位值:0x0000
2】位31-14:保留位,硬件强制为0
位13:UE(USART使能):当该位被清零,在当前字节传输完成后的USART的分频器和输出停止工作,以减少功耗。该位由软件设置和清零。置0时,USART分频器和输出被禁止,置1时,USART模块使能。
位12:M(字长):该位定义了数据字的长度,由软件对其设置和清零。置为0时表示一个起始位,8个数据位,n个停止位。置位1时,表示一个起始位,9个数据位,n个停止位。注意在数据传输过程中(发送和接收时)不能修改这个位。
位11:WAKE(唤醒的方法):该位决定了把USART唤醒的方法,由软件对该位设置和清零。为0时,表示被空闲总线唤醒,为1时表示被地址标记唤醒。
位10:PCE(检验控制使能):用该位选择是否进行硬件校验控制(对于发送来说就是校验位的产生,对于接受来说,就是校验位的检测)。当使能了该位,在发送数据的最高位(如果M=1,最高位是第9位,如果M是0,最高位是第8位)插入校验位。对接受到的数据检查其检验位。软件对它置“1”或者清“0”,一旦设置了该位,当前直接传输完成后,校验控制才生效。置0时表示禁止校验控制,置为1时表示使能校验控制。
位9:PS(校验选择):当校验控制使能后,该位用来选择采用偶校验还是奇校验。软件对它置1或清0.当前字节传输完成后,该选择生效。置为0时表示为偶校验,置为1时表示为奇校验。
位8:PEIE(PE中断使能):该位由软件设置或清除。置为0时禁止产生中断,置为1时,当USART_SR中的PE为“1”时,产生USART中断。
位7:TXEIE(发送缓冲区空中断使能):该位由如软件设置或清除。为0时禁止产生中断,为1时,当USART_SR中的TXE为“1”时,产生USART中断。
位6:TCIE(发送完成中断使能):该位由软件设置或清除。置为0时表示禁止产生中断,置为1时表示当USART_SR中的ORE或者RXNE为1时,产生USART中断。
位5:RXNEIE(接收缓冲区非空中断使能):该位由软件设置或清除,为0时表示禁止产生中断,为1时表示当USART_SR中的IDLE为1时,产生USART中断。
位4:IDLEIE(IDLE,总线空闲中断使能):该位由软件设置或清除。当为0时表示禁止产生中断,为1时当USART_SR中的IDLE为1时,产生USART中断。
位3:TE(发送使能):该位使能发送器,由软件设置或清除。为0时表示禁止发送,为1时表示使能发送。备注在数据传输过程中,除了在智能卡模式下,如果TE位上有个0脉冲(即设置为“0”之后,再设置为“1”),会在当前数据字传输完成后,发送一个前导符(空闲总线)。另外,在当TE被设置后,在真正的数据发送开始前,有一个比特时间的延迟。
位2:RE(接收使能):该位由软件设置或清除。当设置为0时,禁止接收,当设置为1时,使能接收并开始搜寻RX引脚上的起始位。
位1:RWU(接收唤醒):该位用来决定是否把USART设置为静默模式。该位由软件设置或清除,当唤醒序列到来时,硬件也会将其清零。置为0时表示接收器处于正常工作模式,置为1时,表示接收器处于静默模式。备注,在把USART置于静默模式(设置RWU位)之前,USART要已经先接受了一个数据字节,否则在静默模式下,不能被空闲总线检测唤醒。另外当配置为地址标记检测唤醒(wake位 = 1),在RXNE位被置位时,不能用软件修改RWU位。
位0:SBK(发送断开帧):使用该位来发送断开字符,该位可以由软件设置或清除。操作过程应该是软件设置位,然后再断开帧的停止位时,由硬件将其复位。当该位被设置为0时,表示没有发送断开字符,当设置为1时,表示将要发送断开字符。
 
5、控制寄存器2(USART_CR2)
1】地址偏移:0x10,复位值:0x0000
2】位31-15:保留位,硬件强制为0;
位14:LINEN(LIN模式使能):该位由软件设置或清除。设置为0表示禁止LIN模式,设置为1表示使能LIN模式。在LIN模式下,可以用USART_CR1寄存器中的SBK位发送LIN断开符(低13位),以及检测LIN同步断开符。
位13-12:STOP(停止位):这两位用来设置停止位的位数。00表示一个停止位,01表示0.5个停止位,10表示2个停止位,11表示1.5个停止位。备注:USART4和USART5不能用0.5停止位和1.5停止位。
位11:CLKEN(时钟使能):用来使能CK引脚。为0时表示禁止CK引脚,为1表示使能CK引脚。备注,在USART4和USART5上不存在这一位。
位10:CPOL(时钟极性):在同步模式下,可以用该位选择SLCK引脚上时钟输出的极性。和CPHA位一起配合来产生需要的时钟/数据采样关系。为0时表示总线空闲时CK引脚上保持低电平。为1时表示总线空闲时CK引脚上保持高电平。USART4和USART5上不存在这一位。
位9:CPHA(时钟相位):在同步模式下,可以用该位选择SLCK引脚上时钟输出的相位。和CPOL位一起配合来产生需要的时钟/数据的采样关系。为0时表示在时钟的第一个边沿进行数据捕获,为1时表示在时钟的第二个边沿进行数据捕获。备注在USART4和USART5上不存在这一位。
位8:LBCL(最后一位时钟脉冲):在同步模式下,使用该位来控制是否在CK引脚上输出最后最后那个数据字节(MSB)对应的时钟脉冲。为0时表示最后一位数据的时钟脉冲不从CK输出。为1时表示最后一位数据的时钟脉冲会从CK输出。备注:最后一个数据位就是第8或者第9个发送的位(根据USART_CR1寄存器中的M位所定义的8或9位数据帧格式),在USART4和USART5上不存在这一位。
位7:保留位,硬件强制为0。
位6:LBDIE(LIN断开符检测中断使能):断开符中断屏蔽(使用断开分隔符来检测断开符),为0时表示禁止中断,为1时表示只要USART_SR寄存器中的LBD为1就产生中断。
位5:LBDL(LIN断开符检测长度):该位用来选择是11位还是10位断开符检测。为0时表示为10位断开符检测,为1时表示为11位的断开符检测。
位4:保留位,硬件强制为0。
位3-0:ADD[3:0]:本设备的USART节点地址。该位域给出本设备USART节点的地址。这是在多处理器通信下的静默模式中使用的,使用地址标记来唤醒某个USART设备。
3】备注:在使能发送后不能再改写CPOL,CPHA,LBCL三个位。
 
6、控制寄存器3(USART_CR3)
1】地址偏移:0x14,复位值:0x0000
2】位31-11:保留位,硬件强制为0;
位10:CTSIE(CTS中断使能):为0时禁止中断,为1时USART_SR寄存器中的CTS为1时产生中断。备注,在USART4和USART5上不存在这一位。
位9:CTSE(CTS使能):为0时禁止CTS硬件流控制,为1时CTS模式使能。只有nCTS输入信号有效(拉成低电平)时才能发送数据。如果在数据传输过程中,nCTS信号变为无效,那么发送完这个数据后,传输就停止下来。如果当nCTS为无效时,往数据寄存器里面写数据,则要等到nCTS有效时才会发送这个数据。备注,在USART4和USART5上不存在这一位。
位8:RTSE(RTS使能):为0时表示禁止RTS硬件流控制,为1时表示RTS中断使能,只有接受缓冲区内有空余空间时才请求下一个数据。当前数据发送完成后,发送操作就需要暂停下来,如果可以接受数据了,将nRTS输出置为有效(拉至低电平)。备注,在USART4和USART5上不存在这一位。
位7:DMAT(DMA使能发送):该位由软件设置或清除。为0时表示禁止发送时的DMA模式,为1时表示为使能发送时的DMA模式。备注,在USART4和USART5上不存在这一位。
位6:DMAR(DMA使能接收):该位由软件设置或清除。为0时表示禁止接收时的DMA模式,为1时表示使能接收时的DMA模式。备注在USART4和USART5上不存在这一位。
位5:SCEN(智能卡模式使能):该位用来设置智能卡模式。为0时表示禁止智能卡模式,为1时表示使能智能卡模式。备注在USART4和USART5上不存在这一位。
位4:NACK(智能卡NACK使能):为0时表示校验出错时,不发送NACK,为1时表示校验错误出现时,发送NACK。备注,在USART4和USART5上不存在这一位。
位3:HDSEL(半双工选择):选择单线半双工模式,为0表示不选择半双工模式,为1表示选择半双工模式。
位2:IRLP(红外低功耗):用来选择普通模式还是低功耗红外模式。为0时表示为普通模式,为1时表示为低功耗模式。
位1:IREN(红外模式使能):该位由软件设置或清零。为0时表示不使能红外模式,为1时表示使能红外模式。
位0:EIE(错误中断使能):在多缓冲区通信模式下,当有帧错误,过载或者噪声错误时(USART_SR状态寄存器中的FE=1,或者ORE=1,或者NE=1)产生中断。为0时表示禁止中断,为1时表示只要USART_CR3中的DMAR=1,并且USART_SR中的FE=1,或者ORE=1,或者NE=1,则产生中断。
 
7、保护时间和预分频寄存器(USART_GPTR)
1】地址偏移:0x18,复位值:0x0000
2】位31-16:保留位,硬件强制为0
位15-8:GT[7:0]:保护时间值,该位规定了以波特时钟为单位的保护时间,在智能卡模式下,需要这个功能。当保护时间过去后,才会设置发送完成标志。
位7-0:PSC[7:0]:预分频值。
a、在红外(IRDA)低功耗模式下,PSC[7:0] = 红外低功耗波特率,对系统时钟分频以获得低功耗模式下的频率:源时钟被寄存器中的值(仅有8位有效)分频。00000000:保留-不要写入该值;00000001:对源时钟1分频;00000010:对源时钟2分频。
b、在红外(IRDA)正常模式下,PSC只能设置为00000001
c、在智能卡模式下,PSC[4:0]:预分频值,对系统时钟进行分频,给智能卡提供时钟。寄存器中给出的值(低5位有效)乘以2后,作为对源时钟的分频因子。00000:保留-不要写入该值;00001:对源时钟进行二分频;00010:对源时钟进行4分频;00011:对源时钟进行6分频。。。。备注,在智能卡模式下位[7:5]在智能卡模式下没有意义,UART4和UART5上不存在这一位。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容