STM32串口通信小试牛刀

本文详细介绍了STM32的串口通信原理,包括串口协议、RS-232标准和USB/TTL转232模块。此外,文章还阐述了如何搭建STM32开发环境,使用STM32CubeMX生成代码并实现流水灯控制,以及配置和使用USART串口通信。实验涵盖了从硬件连接到软件编程的全过程,包括串口参数配置、主函数修改和调试步骤。通过软件仿真和硬件运行验证了串口通信的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验原理

1. 串口协议

串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线UniversalSerialBus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信接口;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。

2. RS-232标准

RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。需要说明一下,很多人经常把RS-232、RS-422、RS-485 误称为通讯协议,这是很不应该的,其实它们仅是关于UART通讯的一个机械和电气接口标准(顶多是网络协议中的物理层面)。

该标准规定采用一个25 个脚的DB-25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。后来IBM的PC 机将RS-232 简化成了DB-9 连接器,从而成为今天的事实标准。而工业控制的RS-232 口一般只使用RXD(2)、TXD(3)、GND(5) 三条线。

图片

早期由于PC都带有RS-232接口,所以我们需要使用UART时,都选择RS-232。但是现在个人电脑,不光是笔记本,包括台式机都不再带有RS-232的接口,大家看到电脑主板上面没有DB9的接口。所以现在开发板都选择TTL的UART,或者直接UART转USB做在开发板上。

嵌入式里面说的串口,一般是指UART口, 但是我们经常搞不清楚它和COM口的区别, 以及RS232, TTL等关系, 实际上UART,COM指的物理接口形式(硬件), 而TTL、RS-232是指的电平标准(电信号).

UART有4个pin(VCC, GND, RX, TX), 用的TTL电平, 低电平为0(0V),高电平为1(3.3V或以上)。

3."USB/TTL转232"模块

我们知道单片机是UATR口 TTL电平标准,而电脑是USB口。如果我们想用电脑的USB口与单片机串口(COM口)通信,这时就需要使用MAX232之类的电平转换芯片,将单片机TTL电平转换成RS-232电平 ,并且将USB转换为RS-232电平,这就是USB转串口。

  • TTL电平:TTL电平信号被广泛使用,原因是:通常我们采用二进制来表示数据。而且规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术。
  • RS-232电平:对于数据(信息码):逻辑“1”(传号)的电平低于-3V,逻辑“0”(空号)的电平高于+3V;对于控制信号:接通状态(ON)即信号有效的电平高于+3V,断开状态(OFF)即信号无效的电平低于-3V,也就是当传输电平的绝对值大于3V时,电路可以有效地检查出来,介于-3~+3V之间的电压无意义,低于-15V或高于+15V的电压也认为无意义,因此,实际工作时,应保证电平在-3V~-15V或+3V~+15V之间。

我们所说的USB转串口,就是指单片机上装了一个TTL转RS-232的转换芯片 ,并且有COM口,使得单片机可以输出RS-232电平,这样便可以通过 USB转串口(RS-232)模块连接电脑USB口,再与单片机COM口相连,双方都是RS-232电平标准,便可以来进行通信。

市场出售的usb转串口线一般会有两个芯片,一个是CH340这类芯片,一个是MAX232类芯片。因为计算机的串口电平标准是RS-232电平,所以通过 USB转串口(RS-232)模块 ,USB经过CH340转成了TTL串口,再经由MAX232转换为RS-232电平。

二、搭建STM32开发环境

1. stm32CubeMX下载安装

由于STM32CubeMX是Java实现的,需要先安装jdk环境。

[jdk下载地址]: https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe0
[CubeMX下载地址]: https://www.st.com/en/development-tools/stm32cubemx.html

以管理员身份运行SetupSTM32CubeMX-6.3.0-Win.exe

点击next,然后接受,继续点击next

在这里插入图片描述

勾选“I have read and understood the…”,然后点击next

在这里插入图片描述

选择安装路径,注意不能出现中文

在这里插入图片描述

选好路径之后,点击next或确定,最后点击Done即安装完成

在这里插入图片描述

2. 安装固件库

打开CubeMX,在Help下选择Manage embedded software packages

在这里插入图片描述

选择STM32F1下的固件库,点击install now

在这里插入图片描述

三、STM32CubeMX点亮流水灯

1. CubeMX代码生成

点击file然后新建一个工程,先在左上角输入芯片型号,如:STM32F103C8,然后在右边选择具体的芯片,双击进入编辑配置

在这里插入图片描述

在右边芯片部分设置引脚,左键单击PA1,选择GPIO_Output,其他引脚设置一样

在这里插入图片描述

点击左边System Core,下拉找到RCC,HSE和LSE都设置为Crystal/Ceramic Resonator

在这里插入图片描述

点击GPIO,设置GPIO的引脚信息,点击具体引脚,GPIO output level与Maximum output speed都设置为High,GPIO Pull-up/Pull-down设置为No pull-up and no pull-down。

在这里插入图片描述

点击上方的Project Manager管理工程,点击Project,然后输入工程名和选择工程路径,接着选择对应的编译器,如:MDK-ARM,V5版本。最后点击椭圆中的GENERATE CODE生成代码。

在这里插入图片描述

生成代码后点击,Open Project进入工程。

在这里插入图片描述

2. 主函数修改

打开main.c,找到如下位置

在这里插入图片描述

输入以下代码

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);

3. 调试

同以前一样,我们进行软件仿真,需要做如下修改

在这里插入图片描述

找到逻辑分析仪

在这里插入图片描述

点击Setup设置管脚,在弹出的窗口中点击右上角的矩形,输入PORTA.1即为PA1引脚,将每个引脚的Display Type设置为Bit

在这里插入图片描述

F5运行,观察波形

在这里插入图片描述

在这里插入图片描述

波形正确,LED闪烁周期为3秒。

下面是实物图

在这里插入图片描述

四、USART串口通信

1. USART串口通信配置

标准库函数对每个外设都建立了一个初始化结构体,比如 USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 USART_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。初始化结构体定义在 stm32f10x_usart.h 文件中,初始化库函数定义在 stm32f10x_usart.c 文件中,编程时我们可以结合这两个文件内注释使用。

1.1 使能串口时钟及GPIO端口时钟

使用USART1,其挂接在APB2总线上,并且USART1对应STM32F103C8T6芯片管脚的PA9和PA10,所以使能时钟函数如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能 GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);// 使能 USART1时钟

1.2 设置GPIO端口模式

由于我们需要使用引脚的串口功能,所以将GPIO设置为复用功能,即Tx引脚配置为服用推挽输出,Rx引脚为浮空输入,如下:

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX 串口输出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值