轻松搞懂STM32F407串口通信(USART)

串口通信就是一个码元一个码元的发送数据,并行通信就是多个码元同时发送,码元简单来说就是承载信息的信号单位,如二进制码元就通过高低电平来承载信息,那么一个码元就是一个高电平或低电平。

串口基础标准

串口数据帧格式

        这张图描述了串口的一个数据帧格式

 1:空闲电平为高电平

2:起始信号为下降沿加上一个位的低电平

3:传输数据(通常为八位的,也有些标准定义为其他位数)

4:校验位,这里分为奇偶校验和01校验,当然也可以没有这个位,也就是不需要校验

        (1)奇校验:在数据中,1的个数为奇数该位为1,1的个数为偶数则该位为0;

        (2)偶校验:在数据中,1的个数为偶数该位为1,1的个数为奇数数则该位为0;

        (3)01校验:无论数据如何,校验位都为0(0校验)或者都为1(1校验);

5:停止信号为0.5个位到2个位的低电平加上上升沿。

6:空闲电平

USART传输模式

        1:同步与异步

        同步传输:就是通过一个时钟线,在时钟节拍下进行传输,这样传输更为精确

        异步传输:就是规定在一秒内所传输的波特率,来传输数据,这样虽然不精确但是少根线

        2:单线模式与调制解调器模式

        调制解调器模式:使用CTS和RTS做硬件流控制的模式(CTS和RTS下面有描述)

        单线模式:只使用RX与TX进行传输

        

过采样率

        为了得到一个一个位真正的电平状态,过滤掉噪声波,需要对一个位的电平进行多次采样,也就是高于数据传输的频率进行采样,这样的采样被称为过采样。在STM32中,一般为八位过采样以及十六倍过采样,也就是以数据传输频率的8倍或者16倍进行采样,即对一个数据位采样8次或者16次。

RS232标准

电平标准:

                RS232标准的电平规定(高电平,低电平为-5v和15v)

                TTL标准的电平规定(0v和5v)

    在实际进行串口调试时,通常需要用单片机连接电脑,这时通常需要转化芯片,将TTL电平转换为RS232电平然后将USART转换为USB,这些可以通过CH340等芯片实现。

物理层标准

注1:公头DTC(针头),母头DCE(孔头)。以下图片来自野火手册

注2:一般在实际中,只用三根线TX和RX以及GND,像这种9个头的玩意只在一些老式电脑主机和工业级交换机以及路由器上有,基本不需要管,(我之前在搞网络的的时候见过一堆头的串口,那是用来做专线出口的,一般能拉几公里,但是现在随着VPN技术的兴起,这玩意也就用的少了。)

 

 STM32串口外设

先祭出官方USART(Universal Synchronous Asynchronous Receiver and Transmitter)框图,在STM32中,还有UART,也就是没有Synchronous,及只有异步,没同步。但是能看懂USART那么UART自然不再话下。

 1:引脚部分

        RX:接收

        TX:发送

        SW_RX智能卡,没外部引脚,不用管

        nRTS:硬件控制引脚,n表示低电平有效,当接收寄存器为空时置为低电平表示准备好接收了,当接收寄存器满时置为高电平表示当前不接收。该引脚与上方RS232对应。

        nCTS:硬件控制引脚,n表示低电平有效,当准备发送一个帧时,检测该引脚,如果为低电平则继续发送,如果为高电平则停止发送。如果数据正在发送还未发送完成检查到nCTS为高电平,则发送完当前数据后再停止发送。该引脚与上方RS232对应。

        SCLK:同步时钟引脚。

        nRTS和nCTS同属于硬件流控制引脚,在单片机中是为了解决主机是否准备好接收与主机是否可以发送的问题,但是在通信协议中是为了防止在多台设备通信时,收发的信道冲突问题。现在基本用不到了。

        引脚连接方式如下

各引脚表

2:数据收发器(DR寄存器)

        在STM32中,收发寄存器为DR寄存器,该寄存器有两个,一个TDR做发送缓冲,一个RDR做接收缓冲,DR寄存器高位保留,[0,8]共九位位用于存放数据以及校验位。写入DR寄存器则为写入TDR寄存器,读取DR寄存器则为读取RDR寄存器。DR寄存器为两个寄存器但是寄存器地址相同。

        DR寄存器读写可以由软件进行,也可以由DMA进行,DMA后面章节会介绍到

3:控制器(CR1,CR2,CR3寄存器)

        控制了一些东西,如帧的长度,校验方式,过采样,使能与失能等等。具体的请看手册。

4:波特率生产器(OVER8寄存器)

        这玩意还是比较扯淡的一个东西。STM32的波特率生产不是那么的精确。这里面存放的是一个USART的分频系数。

        可能有人会说,这个东西是APB到USART的分频系数,用于从APB得到一个频率来符合发送的频率,也就是从APB中得到波特率。

        但是实际上,根据公式:波特率 = PLCK/(过采样倍数 * USART分频系数)

        可以得出一个结论,USART的波特率,实际上是根据从PLCK分频得到的过采样频率分频而来。USART分频系数是过采样频率分频到波特兰的分频系数。不明白的话把这个拆分开就是:波特兰 = (PLCK/过采样倍数) / USART分频系数。设:(PLCK/过采样倍数) = 过采样频率,即可得到,过采样频率/USART分频系数 = 波特率。

        OVER8分小数部分和整数部分,对这个怎么算感兴趣的话看看官方手册或者野火的手册,反正库函数只需要输入波特率就行了。

        但是要明白这玩意是有误差的,115200实际是115228,这点误差是可以有的,但是属实不太舒服。

5:标志器(SR寄存器)

        一些功能的标记位。这东西要想搞懂直接看手册把,库函数的下面会讲解。

6:保护时间和预分频寄存器(GTPR)

        该寄存器有三部分部分

        保留部分:[16,31]保留

        [8,15]GT部分,设置智能卡的保护时间,不用管

        [0,7]预分频系数,在低功耗模式下,用于给PLCK到USART外设的时钟分频达到降低功耗。

        

        

        

        

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值