STM32 USART外设

USART是通用同步/异步收发器 ,同步模式很少应用,和UART差别不大 

波特率,数据位长度,停止位长度,校验位,可以用结构体配置

支持同步模式,硬件流控制,智能卡,IrDA,LIN,可以了解一下;

左边的Tx和RX是发送和接收引脚,SW_RX和IRDA_OUT和IRDA_IN是用于智能卡和IRDA通信的引脚,有兴趣可以去了解。

接着是编解码模块右边的数据寄存器,TDR和RDR占用同一块地址,跟51单片机中的SBUF一样,在程序中只表现为一个寄存器DR,实际上是两个数据寄存器,

下面的发送移位寄存器的作用是:把一个字节的数据一位一位的移出去,正好对应于串口协议波形的数据位。

举例应用:

发送端:比如说在某时刻给TDR写入0x55,在寄存器中是01010101,那么此时,硬件检测到你写入数据了,他就会检查,当前移位寄存器是不是有数据正在移位,如果没有那么这01010101就会立刻发送到移位寄存器,准备发送。当数据从TDR发送到发送移位寄存器时,会置一个标志位,TXE(TX empty),发送寄存器空,如果检测到这个标志位为1,我们就可以在TDR下,写入下一个数据,然后发送移位寄存器就会在下面的发送器控制的驱动下,向右移位,一位一位的把数据输出到TX引脚,这里时向右移位,所以正好和串口通信的低位先行一致,当数据移位完成后,新的数据就会再一次自动地从TDR转移到发送移位寄存器中,如果当前寄存器地移位还没有完成,TDR的数据就会开始等待,一旦移位完成,就会立刻转移出来

接收端:数据从RX引脚通向接收移位寄存器,在接收器控制的驱动下,一位一位的读取RX的电平,向放在最高位,然后往右移,移位八次之后,就是接收到一个字节了,同样满足串口通信的低位先行,所以移位寄存器是从高位到低位这个方向移动的,当一个字节移位完成之后,这一个字节的数据就会一起转移到RDR寄存器中,在转移的过程中,也会置一个标志位RXNE,接收数据寄存器非空,当我们检测到RXNE置1之后,就可以把数据读走了1,同样这里也是两个寄存器来进行缓存,当数据从移位寄存器转移到RDR时,就可以直接移位下一帧数据了。

这就是大概的工作流程了

发送器控制:控制发送移位寄存器的工作; 接收器控制: 控制接收移位寄存器的工作

硬件数据流控:简称 流控 ,如果发送设备发送太快,接收设备来不及接收,就会出现丢弃和覆盖的现象,流控来解决这个问题;这里有两个引脚nRTS 和 nCTS;

nRTS(request to send):请求发送,输出引脚;用于告诉别人,我当前能不能接收

nCTS  (clear to send):清除发送,输入引脚;用于接收别人nRTS的信号

(前面加个n,代表低电平有效)

nCTS和nRTS需要两个支持流控的的设备,这两个引脚交叉连接,连接方式和TX和RX 一样;

最右边的SCLK的电路,是用于产生同步的时钟信号,配合移位寄存器输出的,发送寄存器每移位一次,同步时钟电平跳变一个周期,这个时钟只支持输出,不支持输入,所以两个USART之间,不能实现同步的串口通信,但是可以用于兼容别的协议,当串口加上时钟就和SPI很像。

唤醒单元可以来实现多设备的功能,可以给串口分配一个地址,当你发送指定地址时,此设备开始唤醒工作,发送其他设备地址,其他设备开始唤醒工作,没有唤醒的设备,保持沉默。

CR寄存器可以来控制USART中断,配置中断能不能通向NVIC;

 波特率发送器:USART1挂载在APB2上,所以是fPCLK2, 是72Mhz;

 USART2挂载在APB1上,所以是fPCLK1,是36Mhz;

之后这个时钟进行一个分频,除于一个/USARTDIV的分频系数,USARTDIV分为一个整数部分和小数部分,之后时钟再除以16,得到发送器时钟和接收器时钟,通向控制部分

如果是上图中的TE为1,就是发送器使能了,发送部分的波特率就有效,RE为1,就是接收器使能了,接收部分的波特率就有效

数据帧的格式,可以配置有无校验,奇偶校验,还有可以配置停止位字长,可以是1/2,1,1.5,2

 

这个是为了对输入来检测的:输入数据要求保证输入的采样频率和波特率一致,还要保证每次的输入采样的位置,是处于每一位的正中间(在正中间比较稳定),另外输入还可以对噪声有一定的判断能力,如果是噪声,最好能置标志位提醒。

这里是对起始位采样,采样频率是波特率的十六分频,就是在1位的空间中,能够采样16次,一开始空闲状态,处于高电平,在某位置,突然采样到0,说明检测到了下降沿,如果没有任何噪声,说明这个是起始位了,之后会采样十六次,如果没有噪声,这16位都是0;但是实际可能有噪声,所以虽然检测到了下降沿,后面还有再采样几次,以防万一。

根据手册描述,会在之后的第3,5,7进行一批采样,再再8,9,10再采样都要要求每3位里有至少2个0,才能认为是起始位,如果3位里面只有两个0,另一个1,也是起始位,不过会在状态寄存器里置NE(noise error),噪声标志位提醒。如果三位里只有1个0,那就不是起始位,可能前面的下降沿是噪声导致 ,这时电路就会忽略前面的数据,重新捕获下降沿。

数据采样类似;

 如果设置波特率为9600;对于USART1来说是:

9600=72000000/16/div    div=468.75 ,换成2进制写入寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值