你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6989|回复: 5

STM8单片机的UART静默模式与地址匹配应该怎么用?

[复制链接]

6

主题

11

回帖

0

蝴蝶豆

初级会员

最后登录
2019-12-10
发表于 2014-3-3 09:50:09 | 显示全部楼层 |阅读模式
 如题,求大神解答,最好有程序...
回复

使用道具 举报

22

主题

456

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-20
发表于 2014-3-3 16:31:12 | 显示全部楼层

RE:STM8单片机的UART静默模式与地址匹配应该怎么用?

UART静默模式一般用于总线空闲检测和多机通信哦,多机通信模式下,一般会用到地址匹配,不被寻址的设备会进入静默模式。这个还得想想看看STM8的参考手册,参考一下官网的程序。下面是一段解释:
    在一个地址字节中,目标接收器的地址被放在4个LSB中。这个4位地址被接收器同它自己地址做比较,接收器的地址被编程在UART_CR2寄存器的ADD位域中。
    如果接收到的字节与它的编程地址不匹配时,UART进入静默模式。该字节的接收既不会置1,RXNE标志也不会产生中断,因为UART已经在静默模式。
    当接收到的字节与接收器内编程地址匹配时,UART退出静默模式。
回复 支持 反对

使用道具 举报

23

主题

195

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2014-3-7 10:05:56 | 显示全部楼层

RE:STM8单片机的UART静默模式与地址匹配应该怎么用?

upup~hoho~ddddd
回复 支持 反对

使用道具 举报

23

主题

195

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2014-3-7 10:08:41 | 显示全部楼层

RE:STM8单片机的UART静默模式与地址匹配应该怎么用?

难度有点高, 参考下官方程序和事例。主要和接受地址的匹配相对应,
推荐给你看看STM32 UART整理说明!
该接口通过3个引脚连接到另外的外部设备上。
任何USART双向通信都至少需要两个引脚:接收数据输入RX和发送数据输出TX
当发送器禁能时输出引脚恢复到I/O端口配置。当发送器使能时且无数据发送,TX引脚为高电平。
字长可以通过设置USART_CR1寄存器中的M位来选择是8位还是9位
TX引脚在起始位期间为低,停止位期间为高
空闲符被认为是一个全“1”的帧,其后紧跟着包含数据的下一个帧的起始位(“1”的数目包含了停止位的数目)
间隙符被认为是一个帧周期都接收到“0”。在间隙帧之后,发送器插入1个或者2个的停止位(逻辑“1”)来应答起始位
发送器
发送器可以发送8或者9位的数据字,这取决于M位的状态。相关时钟脉冲在SCLK引脚输出
1、字符发送
USART发送期间,TX引脚先出现最低有效位。这种模式下,USART_DR寄存器包含了一个内部总线和发送移位寄存器之间的缓冲区TDR。每个字符之前都有一位逻辑低电平的起始位,以可设置数目的停止位结束。
TE位使能之后将发送一个空闲帧
2、可配置的停止位
1个停止位:这是陌生人的停止位数目
2个停止位:常规USART,单线和调制解调器模式下支持
0.5个停止位:当处于智能卡模式下接收数据时使用
1.5个停止位:当处于智能卡模式下发送数据时使用
空闲帧的发送包含了停止位。
间隙帧是10(11)个低位之后跟着配置的停止位
配置流程:通过把USART_CR1寄存器中的UE位写1来使能USART->配置USART_CR1寄存器中的M位来定义字长->配置USART_CR2寄存器中的停止位数目->若采用多缓冲通信选择USART_CR3寄存器中的DMA使能位(DMAT),按照多缓冲通信中解释的配置DMA寄存器->设置USART_CR1寄存器中的TE位来发送一个空闲帧来作为第一次发送->通过USART_BRR寄存器选择期望的波特率->往USART_DR寄存器中写入要发送的数据,这也将清除TXE位。
3、单字节通信
清除TXE位一般都是通过往数据寄存器中写入数据完成的
TXE是由硬件设置的,它表明:数据已经从TDR中转移到移位寄存器了,数据发送已经开始;TDR寄存器是空的;下一个数据可以写入USART_DR寄存器,而不会覆盖前面的数据
当发送在进行时,一个对USART_DR寄存器的写命令将数据保存到TDR寄存器中,并且当前传输完成之后,TDR寄存器中的数据将被复制到移位寄存器中。
当没有进行发送时,往USART_DR寄存器中写入一个数据,数据将直接被放入移位寄存器,发送开始,TXE位将被立即置1
当一个帧发送完成时(结束位之后),TC位被置1
清除TC位是通过下面的软件操作完成的1)读一次USART_SR寄存器(2)写一次USART_DR寄存器(TC位也可以通过对它写0清除,这个清除序列只建议在多缓存通信中使用)
4、间隙字符
设置SBK位将发送一个间隙字符。若SBK位被置1,在完成当前的发送之后将在TX线路上发送一个间隙字符。这一位在间隙字符发送完成时由硬件复位。USART在最后一个间隙帧的末端插入一个逻辑1,从而保证下一个帧的起始位能被识别
软件在间隙符发送之前复位SBK,间隙符将不会被发送
5、空闲符
设置TE位将驱动USART在第一个数据帧之前发送一个空闲帧
接收器
接收器可以接收8位或9位的数据字,这取决于USART_CR1寄存器中的M位
1、字符接收
在一次USART接收期间,RX引脚最先接收到最低有效位。这种模式下,USART_DR寄存器由一个内部总线和接收移位寄存器之间的缓冲区(RDR)构成
配置流程:通过把USART_CR1寄存器中的UE位写1来使能USART->配置USART_CR1寄存器中的M位来定义字长->配置USART_CR2寄存器中的停止位数目->若发生多缓冲通信,选择USART_CR3寄存器中的DMA使能位(DMAT)->通过波特率寄存器USART_BRR来选择期望的波特率->置位USART_CR1寄存器中的RE,这将使能接收器开始寻找起始位。
当接收到一个字符时:
RXNE位被置1,表明移位寄存器的内容被转移到RDR
如果RXNEIE位被置1,将产生一个中断
接收期间若发现帧错误,噪音或者溢出错误错误标志将会被置1
多缓冲接收中,RXNE在每接收到一个字节都会被置1并通过DMA读取数据寄存器来清除
在单缓冲模式,清除RXNE位是由软件读取USART_DR寄存器万层。RXNE标志也可以通过对它写0清除。RXNE位必须在下一个字符接收完成前被清除,否则将产生溢出错误
2、间隙符:
当接收到间隙符时,USART把它当做帧错误处理
3、空闲符:
当接收到空闲帧时,将和接收到数据一样处理,此外如果IDLEIE位被置1的话将产生一个中断
4、溢出错误
当接收到一个字符,而RXNE位还没有被复位,这时候将出现错误。在RXNE位被清除之前数据不能从移位寄存器转移到RDR寄存器
出现溢出错误时,ORE位被置1,通过在读USART_SR寄存器之后读USART_DR寄存器,ORE位被复位
ORE位被置1时,表明至少1个数据已经丢失:若RXNE=1,上一个有效数据存放在接收寄存器RDR,并且可读;RXNE=0,上一个有效数据已被读出,RDR中无可读数据
5、噪音错误
在帧内发现噪音:NE在RXNE位的上升沿被置1
无效的数据从移位寄存器转移到USART_DR寄存器
若为单字节通信,将不产生中断;多缓冲通信下,若USART_CR3寄存器中的EIE位准备置1,将导致一个中断
NE位通过依次读取USART_SR寄存器和USART_DR寄存器复位
6、帧错误
由于没有同步上或大量噪音的原因,停止位没有在与其的时间上接和收识别出来
当发现帧错误时:FE位被硬件置1;无效的数据从移位寄存器转移到USART_DR寄存器;若为单字节通信,将不会产生中断,但这一位将和自身产生中断的RXNE位一起上升,多缓冲通信中,若USART_CR3寄存器中的EIE位被置1,将导致一个中断
NE位通过一次读取USART_SR寄存器和USART_DR寄存器复位
7、接收期间配置停止位
要接收的停止位的数目可以通过控制寄存器2中的控制为配置。普通模式下可以是1位或者2位。智能卡模式下可能是0.5位或1.5位
分数波特率的产生
接收器和发送器(RX和TX)都是设置城USARTDIV整数和小数寄存器中配置的值。
TX/RX波特率=Fck/(16*USARTDIV)
例子:从BRR寄存器的值计算得到USARTDIV
如果DIV_Mantissa=27D,DIV_Fraction=12D(BRR=1BCH),那么
Mantissa(USARTDIV)=27D
Fraciton(USARTDIV)=12/16=0.75D
因此,USARTDIV=27.75D
在写入USART_BRR后,波特率计数器会被波特率寄存器中的新值更新,因此在处理期间不应改变波特率寄存器的值
只有USART1是由PCK2(最大位72MHZ)提供时钟,其他的都由PCLK1提供时钟(最大为36MHZ)
多处理器通信
利用USART可以进行多处理器通信(只需把多个USART连接城一个网络)。
未编址设备可以通过静默功能的方式置为静默模式。
静默模式下:所有接收状态位都不会被设置
所有的接收中断都被禁止
USART_CR1寄存器中的RWU位被置1,RWU可以硬件自动控制或者在某些条件下有软件写
USART可以通过两种方式进入和退出静默模式:如果WAKE位被复位,采用空闲线路检测模式
如果WAKE位被置位,采用地址标记检测模式
1、空闲线路检测模式(WAKE=0)
当RWU位被写1时,USART进入静默模式
当发现空闲帧时,USART退出静默模式,RWU位也将被硬件清除,但是USART_SR寄存器中的IDLE位不会被置1.RWU也可以被软件清0
2、地址标记检测(WAKE=1)
此模式下,MSB为1的字节被认为是地址,否则被认为是数据。
当接收到一个和预先设置在USART_CR2寄存器中ADD位中的地址不匹配的地址字符,USART进入静默模式。
当接收到一个和设置的地址匹配的地址字符,USART退出静默模式。RWU被清除,后面的字节也将正常接收,RXNE位会因为接收到地址字符被置1.
当接收端缓冲区没有数据时(USART_SR寄存器中的RXNE=0),RWU位可以被写0或者1,否则写操作会被忽略。
在选择静默模式之前(设置RWU位)。USART必须先接收一个数据字节,否则它不能运行在通过空闲线路检测唤醒的静默模式。
在地址标志检测唤醒配置中(WAKE=1),RWU位在RXNE位被置1时不能通过软件修改
奇偶控制
可以通过设置USART_CR1寄存器中的PCE位来使能奇偶控制。
发送模式:若USART_CR1的PCE位被置位,写进数据寄存器的数据MSB位被校验位替换后发送出去。
LIN模式
此模式通过USART_CR2寄存器的LINEN位选择。LIN模式下,CLKEN位,STOP[1:0]位,SCEN,HDSEL,IREN必须保持清除状态
1、LIN发送
与正常USART发送存在如下区别:清除M位来设置8位字长度;设置LINEN位进入LIN模式,此情况下,设置SBK位来发送13个“0”作为间隙符,然后发送一个“1”来开启其实检测
2、LIN接收
当LIN模式被使能时,间隙检测电路被激活。检测和正常USART接收器完全独立。间隙不管是在空闲时或者接收帧期间发生都能被检测到
检测起始位的方法和寻找间隙符或者数据是一样的。发现起始位后,电路采样下面的位。若10(LBDL=0)或者11位(LBDL=1)连续的位都是0,且金钩一个分隔符,USART_SR寄存器的LBD标志被置1
如果第10或者11次采样之前采样到1,间隙检测电路取消当前的检测而重新查找一个起始位
LIN模式被使能,一旦发生了帧错误,接收器不会停止直到间隙字没有完成时接收到一个“1”或检测到间隙后接收到一个分隔符
USART同步模式
同步模式是通过往USART_CR2寄存器中的CLKEN位写1来选择。此模式下,下面这些位必须保持清除状态:LINEN,SCEN,HDSEL,IREN
USART允许用户在主模式下控制双向同步串行通信。SCLK引脚是USART发送者时钟的输出。起始位和停止位期间不会往SCLK发送时钟脉冲。
在空闲,实际数据到来前和发送间隙期间,外部时钟不会被激活
SCLK和TX同步,TX上的数据也是同步的。USART接收器和异步模式采用不同的工作方式。若RE=1,数据在SCLK上采样而没有任何过采样
SCLK引脚和TX引脚一起工作,故只有在发送使能时且数据在发送时才会提供时钟,这就意味着不可能在不发送数据时接收到同步数据
LBCL,CPOL,CPHA必须在发送器和接收器都禁能时选择,这些为在发送器或者接收器使能时不能改变
建议在同一条指令中设置TE和RE位以保证接收器的建立时间和保持时间最小
单线半双工模式
此模式通过设置USART_CR3寄存器中的HDSEL位来选择。此模式下必须保持下面这些位的清除状态:LINEN,CLKEN,SCEN,HDSEL,IREN
一旦HDSEL被写1:RX不再被使用;无数据传输时,TX总是被释放的。因此,它在空闲状态或接收状态时表现为一个标准I/O口,该I/O口在不被USART驱动时,必须配置成悬空呼入或开漏的输出高。
特别的是,发送永远都不会被硬件阻止,一旦TE位被置1并且数据写入数据寄存器,发送就会连续发生
智能卡
智能卡模式是通过设置USART_CR3寄存器中的SCEN位来选择。此模式下,下面这些为必须保持清除状态:LINEN,HDSEL,IREN
CLKEN位可能被设置,从而为智能卡提供时钟
智能卡接口设计是支持ISO7816-3标准中定义的一部协议的智能卡。USART应做如下配置:8位数据家奇偶校验,USART_CR1寄存器中的M=1,PCE=1,并且满足如下条件之一:
接收时0.5停止位:USART_CR2中的STOP=01
发送时1.5停止位,USART_CR2中的STOP=11
当与智能卡相连时,USART的TX输出驱动一个智能卡也驱动的双向线(SW_RX和TX必须连接到相同的I/O)。在发送起始位和数据字节时,TX_EN被置有效,而在停止位被置无效。这样接收器只能在出现奇偶错误时才能驱动这条线路。若没有使用TX_EN,在停止位期间TX被拉高,这样只要TX被配置成开漏,接受者也可以驱动这条线路
智能卡是一个单线半双工通信协议
通过发送移位寄存器的数据发送至少延迟1/2的波特时钟
如果在接收1/2停止位帧时检测到奇偶错误,发送线路在完成接收帧时拉低并保持一个波特时钟
置TC标记有效可以通过设置保护时间寄存器延迟
TC标志的撤销不会受智能卡模式影响
如果发送器检测到帧错误,NACK不会被发送器的接收模块当做起始位
在接收器端,若检测到奇偶错误并且发送了NACK,接收器不会把NACK当做起始位
智能卡模式下,间隙符是没有意义的,带帧错误的00H数据被看做是数据而不是间隙符
当来回切换TE位时,不会发送空闲帧。ISO协议没有定义空闲帧
USART能够通过SCLK输出位智能卡提供时钟。在智能卡模式下,SCLK和通信无关,而是先通过一个5位预分频器简单地用内部的外设输入时钟来驱动智能卡的时钟。
IrDA SIR ENDEC模块
IrDA模式是通过设置USART_CR3寄存器中的IREN位来选择的。此模式下,下面这些位必须保持清除状态:LINE,STOP,CLKEN,SCEN,HDSEL
SIR发送编码器对从USART输出的NRZ比特流进行调制。正常模式下,发送的脉宽定义在3/16位周期
SIR接收解码器借条来自红外检测器归零位流,且向USART输出NRZ串行比特流。在空闲状态里,解码器的输入就通常是高。发送器输出和解码器输入有相反的极性。
IrDA是一个半双工通信协议,如果发送器忙,IrDA解码器将忽略所有IRDA接收线路上的数据。如果接收器忙,TX上从USART到IrDA的数据不会被IrDA编码。在接收数据时,应避免发送数据,否则要发送的数据可能被破坏
“0”是作为高脉冲发送,而“1”是作为“0”发送
SIR解码器把IrDA兼容的接收信号转变成USART的比特流
SIR接收逻辑把高状态逻辑“1”,而低脉冲看做逻辑“0”
发送编码器输出和解码器输入有相反的极性。空闲时SIR的输出是低电平
IrDA规范要求可接受的脉冲大于1.41微秒,可接受的脉冲宽度是可设置的。
接收器可以和低功耗发送器通信
在IrDA模式下,USART_CR2寄存器中的STOP位必须设置城1停止位
IrDA低功耗模式叙述如下:
发送器:脉宽3倍于低功耗波特率。低功耗模式下可设置预分频值对系统时钟分频
接收器:与正常模式下接收类似。USART应忽略宽度小于1PSC的脉冲
使用DMA的连续通信
USART可以利用DMA进行连续通信。RX和TX缓冲器可以独立产生DMA请求
1、使用DMA发送
DMA模式发送可以通过设置USART_CR3寄存器中的DMAT位使能。只要TXE位被置1,数据就可以通过DMA外设从配置好的SARM区域导入到USART_DR寄存器。使用下面的流程映射一个用于发送的DMA通道
把USART_DR寄存器的地址写到DMA控制寄存器,配置成传输的目标地址,每次TXE事件发生时,数据将从存储器转移到这个地址
把存储器的地址写到DMA控制寄存器,配置成传输的源地址,每次TXE时间发生时,数据将从这个存储器区域转移到USART_DR寄存器
把要发送的字节总数写入DMA控制寄存器
在DMA寄存器中设置通道的优先级
根据应用需要,设置半/全传输的DMA中断
利用DMA寄存器激活通道
当传输的数目达到DMA控制寄存器中设置的值时,DMA控制寄存器在DMA通道中断向量上产生一个中断。
若要使用DMA来发送,不要使能TXEIE
2、使用DMA接收
DMA模式接收可以通过设置USART_CR3寄存器中的DMAR位使。只要接收到一个数据字节,数据就可以通过DMA外设从USART_DR寄存器导入到配置好的SARM区域。使用下面的流程映射一个用于USART接收的DMA通道
把USART_DR寄存器的地址写到DMA控制寄存器,配置成传输的目标地址,每次RXNE事件发生时,数据将从这个地址转移到存储器
把存储器的地址写到DMA控制寄存器,配置成传输的目标地址,每次RXNE事件发生时,数据将从USART_DR寄存器转移到这个存储器区域
把要发送的字节总数写入DMA控制寄存器
在DMA寄存器中设置通道的优先级
根据应用需要,设置半/全传输的DMA中断
当传输的数目达到DMA控制寄存器中设置的值时,DMA控制寄存器在DMA通道中断向量上产生一个中断。
若使用DMA来接收,不要使能RXNEIE位
3、多缓冲通信中的错误标志和中断产生
在多缓冲通信情况下,传输过程中发生任何错误,错误标志都将在当前字节之后置有效。在单字节接收中,和RXNE一起置有效的帧错误,溢出错误和噪音错误,它们有独立的错误标志中断使能位,若被使能,初相任何一个错误,都会在当前字节传输之后产生中断
硬件流控制
可以通过nCTS输入和nRTS输出来控制两个设备之间的串行数据流
RTS和CTS流控制可以分别通过USART_CR3寄存器中的RTSE和CTSE位来使能
1、RTS流控制
若RTS流控制被使能,那么只要USART接收器准备好了接收新数据,nRTS有效。当接收寄存器为空时,nTRS无效,表明希望在发送当前帧结束后停止传输
2、CTS流控制
若CTS流控制被使能,那么发送器在发送下一个帧之前检查nCTS输入。若nCTS有效,那么下一个数据将被发送,否则发送不会发生。若nCTS在发送期间变为无效,当前的传输完成之后停止发送
当CTSE=1时,一旦nCTS输入翻转,CTSIF状态位自动被硬件置位,这表明接收器是否准备好了通信。若USART_CR3寄存器中的CTSIE位被置1,将产生一个中断。
回复 支持 反对

使用道具 举报

1

主题

3

回帖

0

蝴蝶豆

初级会员

最后登录
2020-7-16
发表于 2018-4-12 11:51:34 | 显示全部楼层
本帖最后由 无门可取 于 2018-4-12 12:00 编辑
fengye5340 发表于 2014-3-3 16:31
UART静默模式一般用于总线空闲检测和多机通信哦,多机通信模式下,一般会用到地址匹配,不被寻址的设备会进 ...

当接收到的字节与接收器内的编程地址匹配时,UART退出静默,手册上说这个地址字节不会触发接受中断(RXNE不会置位),不过我实际程序中却接收到到了这个地址字节,这是怎么回事呢。
QQ截图20180412120012.png
回复 支持 反对

使用道具 举报

1

主题

3

回帖

0

蝴蝶豆

初级会员

最后登录
2020-7-16
发表于 2018-4-12 13:12:20 | 显示全部楼层
无门可取 发表于 2018-4-12 11:51
当接收到的字节与接收器内的编程地址匹配时,UART退出静默,手册上说这个地址字节不会触发接受中断(RXNE ...

看了官方UART1_MultiProcessor的例程,UART1发送UART3接收,9bit数据位通信。UART3作为从机接收,地址被设置为0x02。在按键中断里用UART1给USAT3发送0x102,UART3是能接收到该字节的。我觉得参考文档的意思是,只要检测到地址字节最高位为1时(8bit模式就是1000 xxxx,9bit就是1 0000 xxxx),接收器就已经退出静默,当完整的一帧地址字节接收到后就会产生一个RXNE置位。而不是接收到下一个字节才能置位。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版