【STM32】入门(五):串口TTL、RS232、RS485

【STM32】STM32单片机总目录

1、简述

1.1 电平

TTL :全双工 ,逻辑0对应0V,逻辑1对应3.3V或者5V,一般从单片机引脚直接引出,电平3.3或5V是与IO电平兼容;

RS232:全双工,逻辑0对应+3V至+15V,逻辑1对应-15V至-3V ,TTL经过电平转换芯片后可以输出RS232。

RS485:半双工,逻辑0对应-6V至-2V,逻辑1对应+2V至+6V,这里的电平指AB两线间的电压差,即差分方式传输,因此可以长距离传输

1.2 连接方式

除了电压不同,连接方式有所区别:

TTL、RS232只能一对一连接;
RS-485在总线上是允许连接多达128个收发器。

RS232常用DB9头的定义:
在这里插入图片描述

1.3 传输协议

一帧数据包由起始位、有效数据、校验位以及停止位组成。
在这里插入图片描述
协议参数有:波特率(9600、115200等)、有效数据长度(5~8)、校验(奇、偶、0、1、无)

2、手册

2.1 功能框图

在这里插入图片描述

2.2 中断控制

在这里插入图片描述

2.3 模式配置

在这里插入图片描述

2.4 寄存器映射

在这里插入图片描述

3、代码

3.1 初始化

  • 使能GPIO时钟:RCC_AHB1PeriphClockCmd
  • 使能UART时钟:RCC_APB2PeriphClockCmd
  • GPIO引脚复用为UART:GPIO_PinAFConfig
  • GPIO配置:GPIO_InitStructure、GPIO_Init
  • UART配置:USART_InitStructure、USART_Init
  • 中断配置;NVIC_InitStructure、NVIC_Init
void uart1_init(u32 bound)
{   
  	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	#a)使能时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 
	
	#b)引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	#c)GPIO配置
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;	//GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;      		//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 			//推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   			//上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);         	 		//初始化PA9,PA10
   
   	#d)UART配置
	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);				//开启相关中断
	
	#e)中断配置
  	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);
}

3.2 发送

发送一个字符:版本1

void uart1SendChar(u8 ch)
{      
	while((USART1->SR&0x40)==0);  
    USART1->DR = (u8) ch;      
}

发送一个字符:版本2

void uart1SendChar(uint8_t ch)
{
	#a) 等待发送数据寄存器为空 
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	
	
	USART_SendData(USART1,ch)}

发送数组

void Usart1SendArray(uint8_t *array, uint16_t num)
{
  	uint16_t i;
	
	#a)循环发送每个字符
	for(i=0; i<num; i++)
  	{
  		uart1SendChar(array[i]);
  	}
  	
  	#b)等待发送完成
  	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}

USART_FLAG_TXEUSART_FLAG_TC的详细说明

USART_FLAG_TXE:发送缓冲区空标志,说明可以往数据寄存器写入数据了,但并不代码数据发送完成了。
USART_FLAG_TC:发送完成标志,这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。

这两个标志的区别在于,它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。

TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。
TC  表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。

所以,判定数据最终发送完成的标志是 TC,而不是 TXE.

3.3 接收

查询中断向量表,在代码文件startup_stm32f10x_hd.s中:
串口1USART1对应到中断函数为USART1_IRQHandler
对应上面的中断控制配置:NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

__Vectors       DCD     __initial_sp               ; Top of Stack
...
                DCD     USART1_IRQHandler          ; USART1
...

重载中断函数 USART1_IRQHandler,实现一个回显功能,即接收啥,发送啥

void USART1_IRQHandler(void)  
{
  	uint8_t ucTemp;
	if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
	{		
		ucTemp = USART_ReceiveData(USART1);
    	USART_SendData(USART1, ucTemp);  
    } 
} 
<think>好的,我需要帮助用户理解STM32串口RS485RS232的区别及配置方法。首先,根据用户提供的引用资料,RS485RS232都是基于串口通信的物理层标准,而STM32的USART模块支持这些接口。 用户的问题集中在差异和实现方式上,我需要分点回答。首先,串口通信是基础,RS232RS485在电气特性、传输距离和拓扑结构上有不同。例如,RS232使用单端信号,传输距离较短,而RS485使用差分信号,适合长距离和多点通信。需要引用资料中的内容,比如引用[1]提到RS485的差分传输和半双工,引用[2]比较了两种标准的电平、传输距离等。 然后,配置差异方面,STM32的USART模块本身是通用的,但RS485需要外部电平转换芯片,比如MAX485,并且要控制方向引脚,实现半双工。而RS232只需要电平转换芯片如MAX232。这部分可以引用引用[3]提到的物理层改变,以及代码示例中的方向控制。 实现方式部分,需要分别说明RS232RS485的硬件连接和软件配置。例如,RS485的方向控制引脚需要通过GPIO来控制发送和接收状态切换,这在代码中需要处理。引用[1]中的配置步骤和引用[3]的驱动代码可以作为参考。 相关问题部分,需要生成与主题相关的问题,比如应用场景、硬件设计差异、全双工与半双工的区别以及常见问题排查。这些问题可以帮助用户进一步深入学习。 最后,确保回答结构清晰,使用中文,正确应用引用标注,并检查LaTeX格式是否符合要求,例如行内公式用$...$,独立公式用$$...$$。同时,避免使用Markdown格式,保持自然流畅。</think>### STM32串口RS485/RS232的差异及实现方式 #### 一、核心差异分析 1. **电气特性与信号传输** - **RS232**:采用单端信号传输,逻辑电平为负逻辑(“1”为$-3\text{V}$至$-15\text{V}$,“0”为$+3\text{V}$至$+15\text{V}$),抗干扰能力较弱[^2]。 - **RS485**:使用差分信号传输($V_A - V_B$表示逻辑),逻辑电平为$±1.5\text{V}$至$±6\text{V}$,抗干扰能力强,适用于长距离传输[^1]。 2. **传输距离与拓扑结构** - RS232一般适用于$10\text{m}$以内的点对点通信,而RS485支持$1200\text{m}$以上的多点通信(最多32个节点)。 3. **工作模式** - RS232为全双工,可同时发送和接收;RS485为半双工,需通过方向控制引脚切换收发状态[^3]。 #### 二、STM32配置差异 1. **硬件设计** - **RS232**:需外接电平转换芯片(如MAX232)将STM32TTL电平($0\text{V}/3.3\text{V}$)转换为RS232电平。 - **RS485**:需使用差分转换芯片(如MAX485),并增加方向控制引脚(如GPIO控制DE/RE引脚)。 2. **软件实现** - **RS485方向控制**:在发送数据前拉高方向引脚,发送完成后切回接收模式: ```c HAL_GPIO_WritePin(DE_GPIO_Port, DE_Pin, GPIO_PIN_SET); // 使能发送 HAL_UART_Transmit(&huart2, data, len, timeout); HAL_GPIO_WritePin(DE_GPIO_Port, DE_Pin, GPIO_PIN_RESET); // 切回接收 ``` - **RS232**:无需方向控制,直接通过USART发送数据。 #### 三、典型应用场景 - **RS232**:调试终端、PC与设备直连等短距离通信 - **RS485**:工业现场总线、多节点传感器网络等长距离抗干扰场景 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值