STM32串口通信

一. 了解串口协议和RS-232标准

1.1 串口协议

串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。 常用的串口通信协议 有以下几种:

1.RS-232(ANSI/EIA-232标准) 只支持 点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远 速度越慢。 支持全双工(发送同时也可接收。
2.RS-422(EIA RS-422-AStandard),支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收。
3.RS-485(EIA-485标准)是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时 是半双工状态。

1.2 RS-232标准

RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(Electronic Industry Association,EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

二. RS232电平与TTL电平的区别

2.1 TTL电平

TTL(Transistor-Transistor Logic)电平是一种数字电平标准,代表了逻辑值0和逻辑值1。TTL电平中,0通常被定义为0V至0.8V之间的电压,而1被定义为2V至5V之间的电压。

特点
  TTL电平具有高噪声抗干扰能力、低功耗和简单的电路设计特点。

2.2 RS-232电平

RS-232电平是一种标准用于串行通信的电平表示方法,它表示逻辑值0和逻辑值1的方式与TTL电平有所不同。

特点:
  RS-232电平通常采用负逻辑,即逻辑值1使用负电平表示,逻辑值0使用正电平表示。

2.3 RS232电平与TTL电平的区别

电平表示方式
  首先,最重要的区别在于它们表示逻辑值0和逻辑值1的方式。TTL电平使用电压高低来表示逻辑值,而RS-232电平使用正负电平表示。
  在这里插入图片描述

三. 了解"USB/TTL转232"模块的工作原理

USB转TTL模块是一种将USB信号转换为串行TTL信号的设备,其工作原理主要涉及USB转换芯片、串口芯片和电平转换电路。USB转换芯片负责USB数据的转换和解析,将USB信号转换为串行数据,并将其发送给串口芯片。串口芯片则负责将串行数据转换为串口信号,并经过电平转换电路转换为TTL电平信号,从而与嵌入式系统进行通信。

3.1 USB转换芯片

USB转换芯片是USB转TTL模块的核心部件,它能够实现USB信号与串行数据的转换,同时负责数据的解析和处理。常见的USB转换芯片有CH340、FT232等,它们可以将计算机发送的USB信号转换为串行数据,经过串口芯片处理后输出为TTL电平信号。

3.2 串口芯片

串口芯片负责接收USB转换芯片发送的串行数据,并将其转换为串口信号。常见的串口芯片有MAX232、CP2102等,它们可以将串行数据转换为TTL电平信号,并通过串口连接到嵌入式系统的串口接口。

3.3 电平转换电路

电平转换电路将串口芯片发送的串口信号转换为适合嵌入式系统的TTL电平信号,从而实现计算机与嵌入式系统之间的稳定串口通信。电平转换电路通常包括电阻、电容等元件,能够将信号电平从RS232转换为TTL。

四. 固件库获取

固件库获取

在这里插入图片描述

五. 代码实现

GPIO引脚初始化及控制_LED亮灭

//1.打开APB2时钟(不懂为什么第一步是这个的可以参考我上一篇博客)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
//2.GPIO引脚设置
	GPIO_InitTypeDef GPIO_InitStructure;
	//GPIO结构体定义
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	//设置GPIO功能模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	//设置作用GPIO引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	//配置GPIO速度
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//如果你设置的引脚是PB9,()内分别为GPIOB,&你定义的结构体
	
//3.GPIO输出电平设置
	GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	//低电平,点亮LED灯(因为我们的LED灯正极接电源侧,负极接引脚PB9,要使LED亮需要使PB9输出低电平导通)
	GPIO_SetBits(GPIOB, GPIO_Pin_9);
	//高电平,LED灯不亮

USART1串口初始化

void UART_Init(void)
{
//1.开启GPIOA和USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
	
//2.结构体定义
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
//3.USART设置RX/TX
	
  //USART1_TX,默认情况下复用PA9引脚
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
  //USART1_RX,默认情况下复用PA10引脚
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
//4.USART1参数配置
	
	USART_InitStructure.USART_BaudRate = 9600;
  //设置波特率为9600
	
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位占8位
	USART_InitStructure.USART_StopBits = USART_StopBits_1; //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);

//5.初始化串口1
	USART_Cmd(USART1, ENABLE); //使能串口1

}

串口发送字符串

//串口发送字符串函数
void USART_SendString(USART_TypeDef* USARTx, uint8_t *str)  
{  
    while (*str)  
    {  
        USART_SendData(USARTx, *str++);  
        // 等待发送完成  
        while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);  
    }  
}  

结果:
在这里插入图片描述

六.总结

我们了解了串口通信的基本原理,其中包括波特率、数据位、停止位和校验位等重要概念。然后,我们学习了如何在STM32的固件库中使用相应的函数来初始化和配置串口通信模块,包括开启GPIO时钟、配置GPIO引脚、设置USART参数等步骤。
这次实验让我对串口通信有了更深入的了解和认识,同时也提升了我的实践能力和问题解决能力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值