基于STM串口通信详解32
- 前言
- 一、串口是什么?
- 二、通信的基本概念
-
- 1.串行通信和并行通信
- 2.异步通信和同步通信
- 3.单工、半双工和全双工通信
- 二、STM32F1的USART介绍
-
- 1.RS232标准
- 2.USB转串口
- 3.RS232通信协议
- 4.USART结构框图
- 三、USART1收发通信实验
- 总结
前言
一个完整的硬件产品由各种模块组合实现,微控制器 MCU 作为大脑,外围存储单元、显示单元、声音单元、传感器单元、运动单元等是躯干和四肢,不同类型的硬件单元需要有机结合,不能与数据通信分开,电子行业经过一百多年的发展,衍生出各种协议,包括行业公认的标准协议,还有企业自主研发的内部标准,通常可分为并行通信协议和串行通信协议。本文介绍了基础STM32串口操作的基本内容。
什么是串口?
串口为串行接口(serial port)简称,又称串行通信接口或COM接口。串口通信是指串行通信协议(serial communication)在信号线上逐个传输数据的通信模式。
二、通信的基本概念
STM32F1 芯片中有很多通信接口。在学习这些通信接口之前,我 了解通信的基本概念是必要的。根据数据传输方,通信方式可分为多种类型 可分为串行通信和并行通信。根据通信的数据同步,可分为异同通信和同步通信 步通信。按数据传输方向可分为单工、半双工和全双工通信。下面我们就 简要介绍这些通信方式。
1.串行通信和并行通信
- :是指使用数据线依次传输数据,每个数据占用 根据固定的时间长度。在系统之间交换信息只需要几条线,特别适合 用于计算机与计算机、计算机与外设之间的远距离通信。
- :并行通信通常用多条数据线同时传输数据字节,通常是 8 位、16 位、32 等数据一起传输。
对比串行通信和并行通信的特点: 并行可以同时发送多个数据,因此速度远快于串行,但并行数据线更多,相对成本更高,并行传输对同步要求更高。随着通信速率的提高,信号干扰问题将显著影响通信性能。
2.异步通信和同步通信
: 在发送串行数据的同时,发送端提供时钟信号,并按照一定的协议(例如,当时钟信号上升时,发送数据)发送数据,接收端根据发送端提供的时钟信号和每个人的协议接收数据。I2C、SPI等待钟信号的协议属于这种通信方式。
: 接收方不知道数据何时到达,双方可以有自己的时钟。数据同步不需要时钟信号。它们直接在数据信号中穿插一些同步信号位,或者用数据帧(串口:起始位)包装主要数据 数据 校准位置(可没有) 在某些通信中,还需要双方就数据的传输速率(波特率)达成一致,以便更好地同步。 异步通信模式,。当然,双方的实际工作速度不能绝对相等,但只要误差不超过一定限度,就不会造成传输错误。
同步通信:面对面交付快递,互动完成,但双方需要同时做出反应,否则另一方会阻止等待。 异步通信:就是把快递放在门卫或者快递箱里,自己拿,中间不是同步完成的。
3.单工、半双工和全双工通信
单工通信:单工是指数据传输只能沿一个方向传输,不能实现反向传输。
半双工通信:半双工是指数据传输可以沿两个方向进行,但需要分时进行。
全双工通信:全双工是指数据可以同时双向传输。
二、STM32F1的USART介绍
串口通信(Serial Communication),是指外设和计算机之间的数据信号线 地线等传输数据的通信方式属于串行通信方式。串口是一个接口 该标准规定了接口的电气标准,没有规定接口插件电缆和使用协议。
1.RS232标准
例如,我们使用的许多单片机内部STM32和一些传感器通常是TTL电平。 RS232是一种串行数据传输形式,称为串行连接,最经典的标志是 9 针孔的 DB9 电缆RS232电压表示逻辑 1 ,容错率大大提高,主要用于工业设备的直接通信。 从上图可以看出,TLL与RS-如果单片机与单片机或其他设备有相反的标准逻辑和不同的电平TLL采用设备通信RS-232通信(DB9)必须先转换电平TLL->RS232 RS232->TTL 两个通信设备DB9 连接通过串口信号线建立,串口信号线中使用RS-232 传输数据信号的标准。 RS-232 电平标准法直接识别电平标准信号,因此这些信号将通过电平转换芯片转换为控制器可以识别的TTL 只有标准的电平信号才能实现通信。
2.USB转串口
USB主要用于设备(STM32)与计算机通信
一般有电平转换芯片CH340、PL2303、CP2102、FT232 使用时,计算机应按电平转换芯片驱动(虚拟串口)。我在这里安装的是CH340
3.RS232通信协议
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 数据位表示,只要双方同意一致, 即可。
4.USART结构框图
三、USART收发通信实验
案例:使用串口调试助手完成原始数据的发送和接收。 编程要点:
- 使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;
- 初始化 GPIO,并将 GPIO 复用到 USART 上;
- 配置 USART 参数初始化结构体;
- 配置中断控制器使能 USART 接收中断;
- 使能 USART;
- 在 USART 接收中断服务函数,实现数据接收和发送。
#ifndef __usart_H #define __usart_H
#
include "system.h"
#include "stdio.h"
void USART1_Init(u32 bound);
#endif
#include "usart.h"
int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}
/******************************************************************************* * 函 数 名 : USART1_Init * 函数功能 : USART1初始化函数 * 输 入 : bound:波特率 * 输 出 : 无 *******************************************************************************/
void USART1_Init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开时钟
/* 配置GPIO的模式和IO口 */
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,&GPIO_InitStructure); /* 初始化串口输入IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
//USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
}
/******************************************************************************* * 函 数 名 : USART1_IRQHandler * 函数功能 : USART1中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_SendData(USART1,r);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
int main()
{
u8 i=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(9600);
while(1)
{
i++;
if(i%20==0)
{
led1=!led1;
}
delay_ms(10);
}
}
实验效果
总结
以上就是今天要讲的内容,本文仅仅简单介绍了STM32的USART的使用。关于字符串存储,以及指令解析欢迎大家评论区留言加持。