从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:STM8单片机的UART静默模式与地址匹配应该怎么用?
在一个地址字节中,目标接收器的地址被放在4个LSB中。这个4位地址被接收器同它自己地址做比较,接收器的地址被编程在UART_CR2寄存器的ADD位域中。
如果接收到的字节与它的编程地址不匹配时,UART进入静默模式。该字节的接收既不会置1,RXNE标志也不会产生中断,因为UART已经在静默模式。
当接收到的字节与接收器内编程地址匹配时,UART退出静默模式。
RE:STM8单片机的UART静默模式与地址匹配应该怎么用?
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,将产生一个中断。
当接收到的字节与接收器内的编程地址匹配时,UART退出静默,手册上说这个地址字节不会触发接受中断(RXNE不会置位),不过我实际程序中却接收到到了这个地址字节,这是怎么回事呢。
看了官方UART1_MultiProcessor的例程,UART1发送UART3接收,9bit数据位通信。UART3作为从机接收,地址被设置为0x02。在按键中断里用UART1给USAT3发送0x102,UART3是能接收到该字节的。我觉得参考文档的意思是,只要检测到地址字节最高位为1时(8bit模式就是1000 xxxx,9bit就是1 0000 xxxx),接收器就已经退出静默,当完整的一帧地址字节接收到后就会产生一个RXNE置位。而不是接收到下一个字节才能置位。