12讲 通信的基本概念、USART
通信的基本概念
同步通讯和异步通讯
根据通讯的数据同步方式,分为同步/异步两种,可以根据通讯过程是否有使用到时钟信号进行简单区分。
-
同步通讯:收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,根据通信协议的不同,会定义在 上升沿、下降沿 对数据进行采样。
-
异步通讯:不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主题数据进行打包,以数据帧的格式传输数据,某些通讯中还需要双方约定数据的传输速率,以便更好同步。
-
通常情况下 比特率和波特率相等的。
一个二进制位表示一个码元
- 0V ----- 0
- 3.3V ------1
两个二进制位表示一个码元
- 0V ----- 00
- 2V ----- 01
- 4V ----- 10
- 6V ----- 11
USART串口通信
串口通讯:
- 物理层:RS232 RS485等标准,规定了信号的用途,通讯接口以及信号的电平标准。
1.RS232标准
2.USB转 串口
3.原生的串口到串口
数据校验
1.奇校验(odd): 要求有效数据和校验位中含有 "1" 的个数为奇数个,比如一个8位长的有效数据 “01010011”,
有效数据有4个 “1” ,所以在校验位需要提供一个 “1” 来保证个数位奇数。
2.偶校验(even) --- 和奇校验相反。
3.”1校验“ ---- 不管数据内容是什么,校验位总是1。
4.“0校验” ---- 不管数据内容,校验位总是0。
5."无校验" ----- 数据包中不包含校验位。
TIP: 奇偶校验,当数据位中有一个位发生了错误,接收方收到的数据发现和校验位匹配不上,就会知道这个数据是错的。 但是 如果数据位中有 2个错误( 可能性较低 ),那么就会放行。( 适用于安全性要求一般的运用场景 )
STM32 的 USART 简介
-
STM32芯片具有多个USART 外设 用于串口通讯,他是
Universal Synchronous Asynchronous Receiver and Transmitter
( 通用同步异步收发器 ) 的缩写,它可以灵活地和外部设备进行全双工数据交换。UART 是在 USART 下裁剪掉了同步通信的功能。 平时使用的串口通信基本都是UART。 -
USART 支持使用 DMA ,后面会学到。
-
USART 在 STM32应用最多的地方莫过于 "打印" 程序信息,调试程序可以把错误信息输出到电脑的串口调试助手。
-
STM32 的 USART 输出的是TTL 电平信号,需要RS-232 标准信号则需要使用 MAX3232 芯片进行转换
串口功能框图讲解
- 功能引脚:
-
TX:发送数据输出引脚。
-
RX:接收数据输入引脚。
-
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。一般不用。
-
nRTS:请求以发送(Request To Send),不常用
-
nCTS:清除以发送(Clear To Send),不常用
-
SCLK:发送器时钟输出引脚。这个引脚只适用于同步模式。
-
数据寄存器( USART_DR )
数据寄存器的发送接收流程:
-
USART_DR = temp; 用于将temp值存入到USART_DR寄存器中,然后通过发送移位寄存器进行发送。( 需要在USART_CR1中 打开相应的发送/接收 的使能 )
-
通过状态寄存器( USART_SR )判断数据是否发出 ( USART_SR 只管是否发出,不管收没收到 )。
i.TXE 是判断数据是否还在 "发送数据寄存器(TDR)" 。 ii. TC 判断是否发出去
-
控制寄存器 ( USART_CR ) ,用于 控制发送 和发送完成中断。
-
temp = USART_DR; 依旧是 数据寄存器,这次用RDR接收寄存器,
-
状态寄存器 USART_SR 、 控制寄存器 USART_CR1
当要使用USART 时,有一个USART_CR1 下的 UE( USART使能 )位需要打开!!!!
-
-
控制寄存器
这里使用串行输出,SCLK先不管。
-
M (字长) 可以用来配置数据帧的大小,可以8位 9位等。
-
USART_CR2 的 STOP 位,
-
USART_CR1 的 PCE ( 奇偶校验使能 ) ,PS(奇偶校验选择)、PEIE(奇偶校验错误中断)。
当数据传输有错误被识别到时, USART_SR 的 PE位 会有相应的反应。
PEIE 中断使能,可以写 奇偶校验中断服务函数 ,可以对中断进行处理。
-
-
波特率 的计算
warning : 注意波特率的换算,APB2 和 APB1 的时钟不一样,当要将 APB2的UART1 移植到APB1的UART2上时,波特率需要换算对!!!!!
- 在串口中,波特率的一个 “码元” 代表1个 bit,所以在这里 波特率 = 比特率
-
波特率的计算公式 (下方的OVER8 就是 0 或者 1 直接代入 (8*( 2 - OVER8) 就是8倍或者16倍嘛))
波特率寄存器分为整数部分,和小数部分
-
下图算出115200 波特率下 USARTDIV = 45.57 , 45 直接写入寄存器的整数部分,0.57要换算再写入小数。
TIP: 小数部分最大不超过1,有4个位,所以1 分成 2^4 份,0.57 占这么多份中的数值就是小数需要写入的部分