本文要实现的是:STM32F1 通过 USART1 实现与 PC端Labview上位机对话,STM32F1的 USART1 收到 PC 机发来的数据后原封不动的返回给 PC上位机显示。并且通过Labview发送指令给STM32单片机,控制单片机上LED灯亮灭。
通信的基本概念
我们知道 STM32F1 芯片内含有非常多的通信接口,学习这些通信接口前,我们很有必要了解下通信的基本概念。通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信。按照通信的数据同步方式,可分为异同通信和同步通信。按照数据的传输方向又可分为单工、半双工和全双工通信。下面我们就来简单介绍这几种通信方式。
串行通信与并行通信
(1)串行通信
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
(2)并行通信
并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是8位、16位、32 位等数据一起传输。
并行通信的特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难,抗干扰能力差。
异步通信与同步通信
(1)异步通信
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。异步通信是以字符 (构成的帧) 为单位进行传输, 字符与字符之间的间隙 (时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加 2~3 位用于起止位,各帧之间还有间隔,因此传输效率不高。
(2)同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制, 使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。
单工、半双工与全双工通信
(1)单工通信
单工是指数据传输仅能沿一个方向,不能实现反向传输。
(2)半双工通信
半双工是指数据传输可以沿两个方向,但需要分时进行。
(3)全双工通信
全双工是指数据可以同时进行双向传输。
通信速率
衡量通信性能的一个非常重要的参数就是通信速率, 通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送 240 个字符,而每个字符格式包含 10 位(1 个起始位、1 个停止位、8个数据位),这时的比特率为:
10 位×240个/秒 = 2400 bps
在后面会遇到一个“波特率”的概念,它表示每秒钟传输了多少个码元。而
码元是通信信号调制的概念, 通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。如常见的通信传输中,用 0V 表示数字 0, 5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有 0V、2V、4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率。
STM32F1 的 USART 介绍
串口通信(Serial Communication),是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
(1)接口标准
串口通信的接口标准有很多,有 RS-232C、RS-232、RS-422A、RS-485 等。
常用的就是 RS-232 和 RS-485。RS-232 其实是 RS-232C 的改进,原理是一样的。
这里我们就以 RS-232C 接口进行讲解,RS-485 在后面章节中会介绍。
RS-232C 是 EIA(美国电子工业协会)1969 年修订 RS-232C 标准。RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。
RS-232C 接口规定使用 25 针连接器,简称 DB25,连接器的尺寸及每个插针的排列位置都有明确的定义,如图。
RS-232C 还有一种 9 针的非标准连接器接口,简称 DB9。串口通信使用的大多都是 DB9 接口。DB25 和 DB9 接头有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。9针串口线的外观图如图。
中可以看到公头和母头的管脚定义顺序是不一样,这一点需要
特别注意。这些管脚都有什么作用呢?9 针串口和 25 针串口常用管脚的功能说明如图。
在串口通信中,通常我们只使用 2、3、5 三个管脚,即 TXD、RXD、SGND,其他管脚功能大家看不明白也没关系。
RS-232C 对逻辑电平也做了规定,如下
在TXD 和 RXD 数据线上:
1.逻辑 1 为-3~-15V的电压
2.逻辑 0 为 3~15V 的电压
在RTS、CTS、DSR、DTR和DCD 等控制线上:
1.信号有效(ON 状态)为3~15V 的电压
2.信号无效(OFF 状态)为-3~-15V 的电压
由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定正好相反。而我们 STM32 芯片使用的就是 TTL 电平,所以要实现 STM32 与计算机的串口通信,需要进行 TTL与 RS-232C 电平转换,通常使用的电平转换芯片是 MAX3232。
在串口通信中通常 PC 机的 DB9 为公头,单片机上使用的串口 DB9 为母头,通过一根直通串口线进行相连。上图 21.2.2 即为直通型串口线,串口线(COM)母头连接计算机 DB9 的公头,串口线公头连接单片机上使用的 DB9母头,这样就是将 2、3、5 管脚直接相连。如果你要实现两台计算机串口通信,那么就需要一根交叉串口线,将 2 对 3、3对2、5 对 5 连接,交叉串口线一般两头都是母头。
串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的 TXD
要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,如下图
有的朋友就会问了,在计算机与单片机进行串口通信时,使用的不是直通线吗, 这时候怎么让TXD与RXD交叉连接?前面我们说了单片机处理的是TTL电平,需要使用 RS232 电平转换芯片, 将 RS232 电平转换芯片串行数据输出管脚交叉连接在 DB9 母头上即可,本文后面硬件设计部分会介绍
(2)通信协议
RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。
“96”表示的是通信波特率为 9600。串口通信中通常使用的是异步串口通
信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率,当然,波特率常用值还有 4800、115200等。
“N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输
数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、 偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。具体的介绍,大家可以百度下串口通信了解。
“8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。
当然数据位数还可以为 5、6、7位长度。
“1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到
停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。
了解了串口通信的标准,我们就来看下 STM32F1 芯片的串口USART。
USART简介
USART 即通用同步异步收发器,它能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。UART 即通用异步收发器,它是在 USART 基础上裁剪掉了同步通信功能,同步和异步主要看其时钟是否需要对外提供,这个前面也介绍了,我们平时使用的串口通信基本上都是UART。STM32F103ZET6 芯片含有 3 个 USART,2 个 UART外设,它们都具有串口通信功能。USART 支持同步单向通信和半双工单线通信;还支持 LIN (域互连网络) 、智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作(CTS/RTS)。而且,它还支持多处理器通信和 DMA 功能,使用 DMA 可实现高速数据通信。USART 通过小数波特率发生器提供了多种波特率。
USART 在 STM32 中应用最多的是 printf 输出调试信息,当我们需要了解程序内的一些变量数据信息时,可以通过 printf 输出函数将这些信息打印到串口助手上显示,这样一来就给我们调试程序带来了极大的方便。
USART结构框图
其实 USART 能够有这么多功能,取决于它的内部结构。其内部结构框图如图。
我们把图 21.2.4 分为几个模块进行介绍:
(1)标号 1:功能引脚
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求以发送(Request To Send), n 表示低电平有效。如果使能 RTS 流控制,当 USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS 流
控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
前面我们说了,STM32F103ZET6 芯片具有 5 个串口外设,其对应的管脚可在芯片数据手册上查找到,也可以直接查看我们开发板原理图,我们已经将芯片所有的 IO 口功能都标注在管脚上了。USART1 挂接在 APB2 总线上,其他的挂接在APB1总线, 由于 UART4 和 UART5 只有异步传输功能, 所以没有 SCLK、 nCTS和 nRTS脚,如下:
(2)标号 2:数据寄存器
USART 数据寄存器(USART_DR)只有低 9 位有效, 并且第 9 位数据是否有效要取决于 USART 控制寄存器 1(USART_CR1)的 M 位设置,当 M 位为 0 时表示8 位数据字长, 当 M 位为 1 表示 9 位数据字长, 我们一般使用 8 位数据字长。
USART_DR 包含了已发送的数据或者接收到的数据。
USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时, 向 USART_DR 读取数据会自动提取 RDR 数据。
TDR 和 RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去, 接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
USART 支持 DMA 传输,可以实现高速数据传输,具体 DMA 使用在后面文中会介绍。
(3)标号 3:控制器
USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能USART。发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 的 M 位控制。
1.发送器
发送器可发送 8 位或 9 位的数据,具体取决于 M 位的状态。发送使能位
(TE) 置 1 时, 发送移位寄存器中的数据在 TX 引脚输出, 如果是同步通信模式,相应的时钟脉冲在 SCLK 引脚输出。
2.接收器
如果将 USART_CR1 寄存器的 RE 位置 1,使能 USART 接收,使得接收器在RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到 RDR 内,并把USART_SR 寄存器的 RXNE 位置1,同时如果 USART_CR2 寄存器的 RXNEIE 置 1的话可以产生中断。
3.中断控制
USART 有多个中断请求事件,如下:
USART 中断事件被连接到相同的中断向量,如下:
(4)标号 4:小数波特率生成
波特率的概念在前面介绍比特率的时候已经提过, 常用的串口通信中都把波特率当作比特率。波特率越大,传输速度就越快。
接收器和发送器( Rx 和 Tx)的波特率均设置为相同值。波特率计算公式
如下:
其中,fCK 为 USART 时钟频率,USARTDIV 是一个存放在波特率寄存器
(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV的整数部分,DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。
串口通信中常用的波特率为 4800、9600、115200 等。