一、串口通讯协议和RS-232的介绍以及USB/TTL转232模块的工作原理
1、 串口协议和RS-232标准:
(1)串口协议:
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单、便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通 讯方式输出调试信息。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。
名称 | 组成作用 |
---|---|
物理层 | 具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输 |
协议层 | 规定通讯逻辑,统一收发双方的数据打包、解包标准。 |
在串口通讯的物理层有很多标准及变种,下面主要讲解 RS-232 标准
(2)RS-232 标准:
RS-232 标准主要规定了信号的用途,通讯接口以及信号的电平标准。
在上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号,才能实现通讯。
2、RS232电平与TTL电平的区别
根据通讯使用的电平标准不同,串口通讯可分为 TTL标准和 RS-232标准:
标准名称 | 逻辑1 | 逻辑0 |
---|---|---|
TLL | 2.4V~5V | 0~0.5V |
RS-232 | -15V~3V | +3V~+15V |
从表格中不难看出,两种标准划分的逻辑电压不同。在电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑 1,+15V 表示逻辑 0。
下图为用RS232与TTL电平校准表示同一个信号时的对比:
3、USB/TTL转232“模块(CH340芯片为例)
(1)基本原理:
USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。
USB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。
USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。
发送or接收 | 数据流向 |
串口发送 | 串口应用发送数据→USB串口驱动获取数据→驱动将数据经过USB通道发送给USB串口设备→USB串口设备接收到数据通过串口发送 |
串口接收 | USB串口设备接收串口数据→将串口数据经过USB打包后上传给USB主机→USB串口驱动获取到通过USB上传的串口数据→驱动将数据保存在串口缓冲区提供给串口应用读取 |
(2)CH340模块介绍:
TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。
RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。
USB转TTL串口模块与单片机连接电路图如下所示:
二、利用HAL库新建一个工程
(1)打开STM32CubeMX,在主界面点击:ACCESS TO MCU SELECTOR
(2)选择的单片机型号以及点击开始工程项目:
(3)配置GPIO:PA0。如果仅仅是完成串口通信的话,这一步可以跳过。但是根据实验要求,为了区分串口通信的开启与关闭,要使用一个LED灯来显示。当串口通信开启(STM32向电脑发送信息)的时候,LED灯亮,当串口通信关闭(STM32停止向电脑发送消息)的时候,LED灯灭。
(4)配置USART1,我们使用USART1进行数据传输。在这个界面按下图进行配置。我们对USART1的配置要做的只有两件事:一是选择串口工作模式为异步,二是开启USART1全局中断
(5)进入Project Manager(工程管理),进行工程设置点击生成工程与代码:
注意:路径不能包含中文和空格,不然生成的工程文件无法在Keil中打开;
三、完善keil5工程
1.本工程中几个函数简介:
HAL_UART_Receive_IT:
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size)
/*
huart:使用哪个串口进行通信
data: 一个地址,用于保存接受到的数据
Size: 接收的数据个数
*/
在调用此函数后,程序会将对应串口的接收中断开启,当我们向单片机发送数据时会触发这个中断。在触发这个中断后,程序会接收数据到你传入的地址中,会读取Size个数据。读取完成后,关闭接收中断使能。
由于程序在接收完数据后会关闭接收中断。因此这个函数我们要写在main的死循环中,保证接收中断可以一直开启。
HAL_UART_Transmit_IT:
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size)
/*
huart:使用哪个串口进行通信
data: 一个地址,里面是要发送的数据通常是数组
Size: 发送的数据个数
*/
使用这个函数开启发送中断,发送寄存器为空时触发中断,将要发送的数据送入发送寄存器并发送。发送完成后关闭中断。在此实验中,我们把它当做普通的发送函数即可。
HAL_GPIO_WritePin:
HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X,GPIO_PIN_STATUS)
/*
GPIOX:目标GPIO的组号
GPIO_PIN_X: 目标GPIO的引脚编号
GPIO_PIN_STATUS: 引脚状态
*/
使用这个函数修改GPIO_ODR寄存器,将非复用输出的GPIO引脚输出电平设置成自己想要的。
HAL_Delay(uint ms):
HAL_Delay(uint ms)
延时ms函数。
2.完善keil5工程代码:
首先,点击刚刚生成的keil5工程文件,双击main.c文件,然后再main.c中找到图示框住的函数, 接着右击此函数,进入其定义的地方处:
将图中框住的部分改为SET即可:此步骤是将这个GPIO口设置为高电平,初始时不亮!
回到main.c文件中,在main函数里把while(1)那一块替换成如下代码:
uint8_t rcData = '*';
while (1)
{
//接收中断使能
HAL_UART_Receive_IT(&huart1,&rcData,1);
if(rcData == '#')
{//如果接收#
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
}
else if(rcData == '*')
{//如果接收*
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
uint8_t hello[20]="hello world\n";
HAL_UART_Transmit_IT(&huart1,hello,20);
HAL_Delay(500);
}
}
四.烧录运行
编译生产hex文件,用于后面的烧录步骤:
点击FLYMCU的开始编程(P),接着马上点击STM32最小系统板子的复位键即可完成烧录:
烧录成功示意图:
运行结果演示:
打开串口,并且同时点击STM32最小系统板子的复位键即可开始运行:
注:输入“*”:让STM32单片机继续向电脑发送信息;
输入“#”:让STM32单片机停止向电脑发送消息;
五、仿真调试
1、进入keil5仿真:
(1)点击第一步,Target界面中,选择跟正确的晶振大小,使用8MHz的外部晶振:
(2)接着进行Debug页的设置:
(3)点击图示圈住的地方进入仿真调试界面进入逻辑分析仪:
(4)点击Setup设置添加要进行观察的引脚:
添加引脚信息:添加引脚信息时候,PA脚输入:PORTA,PB脚输入PORTB,PC脚输入PORTC;接着输入".",接着在“.”后面输入对应引脚号,最后回车即可;例如:我这里要输入PA0这个引脚的信息:添加一个引脚,添加一个引脚信息:PORTA.0,最后回车完成添加!
接着对引脚的配置信息进行修改,如下图所示:
2、仿真结果:
总结
本次实验我成功地实现了STM32微控制器的串口通信功能。通过配置串口模块和编写相应的程序,我能够实现STM32与计算机之间的数据传输和交互。