这一篇来说说STM32的串口通信功能,可以说串口通信是每个工程师在开发过程中第一或者第二个进行调试的程序(第一个可能是点灯,固定时间闪烁的那种),因为作为一种通信手段,单片机可以输出一些必要的信息,为调试其他程序提供有力的帮助(当然如果用JLink的话,配合keil uVision5可以单步调试啦。。但是不能否认串口通信在大多数情况下都调试的好帮手)。
这一篇将编写STM32的USART程序,并通过USB转串口的小设备将蓝色最小系统板的串口接到电脑上进行通信。
USART
STM32集成了USART(universal synchronous asynchronous receiver and transmitter),也就是通用同步异步收发器,即可以用于异步通信,也可以提供同步时钟与其他设备进行同步通信,这里我们主要用到的是异步通信功能,即UART(universal asynchronous receiver and transmitter),请明确其两者的区别。(笔者面试的时候踩了坑呢T.T)
数据传输格式
这里给出一张图简要说明异步串口通信的数据传输格式:
- 串口通信按字(Word)传输,一个字可以是8位也可以是9位,通过程序配置,一般来说8位用的比较多(因为8是整数啊!get?);
- 发送引脚TX清0表示起始位,置1表示停止位;
- 空闲帧(Idle Frame)和断开帧(Break Frame)可用于产生中断进行其它处理,这里不做说明。
STM32的USART配置
这里并不对串口通信的协议进行深入说明,因为在官方库中已经给出了用于USART配置与使用的函数。这里对配置要点进行说明:
- 波特率(Baudrate):每秒传输的二进制数据的多少,通常可以设置为2400、4800、9600、19200、38400、57600、115200;
- 数据位数(Word Length):也就是上面说的“字”的位数;
- 停止位(Stop Bits):可以设置为半位、一位、一位半、两位;
- 校验位(Parity):可以配置为奇校验或偶校验,也可以无校验。
若进行异步串口通信,则双方设备的上述设置均应一致。
电路
串口通信最简单的电路只需要3根信号线,TX、RX、GND:
- 注意这里的TX1连接到了RX2,即两个设备采取串口通信的话,其TX端口与RX端口是交叉相连的(仔细想想我发送你接收,没毛病~)。
在蓝色的最小系统板上,已经将串口1(USART1)单独用排针引了出来,PA9、PA10复用为USART的通信引脚:
- TX:PA9
- RX:PA10
注意在STM32手册中有说明,当GPIO引脚用于复用功能时,输出引脚配置为相应的复用输出功能,而输入引脚需要配置为浮空、上拉或者下拉:
(这里我们用的USB转串口设备的TX引脚平时输出为低电平,即有驱动电路,因此设置成浮空模式就行)
程序说明
对引脚进行配置:
GPIO_InitTypeDef GPIOInitStruct;
// PA9 TX
GPIOInitStruct.GPIO_Pin = GPIO_Pin_9;
// 复用推挽输出
GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIOInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIOInitStruct);
// PA10 RX
GPIOInitStruct.GPIO_Pin = GPIO_Pin_10;
// 浮空输入
GPIOInitStr