13_STM32Cubeide开发_RS485总线驱动

本文介绍了如何使用STM32CubeIDE进行RS485通信的开发,包括485总线和硬件电路的介绍、cubeMX配置、RS485驱动程序的编写。在硬件层面,通过SP3485电平转换芯片连接MCU的串口,发送数据时设置RE为高电平,发送完成后切换为低电平。在软件上,利用串口中断接收数据,实验需要至少两个485设备进行通信,并提及工业中常使用Modbus协议。

一、485总线和硬件电路

在这里插入图片描述
典型的串行通讯标准是RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在+2V~+6V之间,表示一个逻辑状态;负电平在-2V~-6V之间,则表示另一个逻辑状态;数字信号采用差分传输方式,能够有效减少噪声信号的干扰。
RS485总线,传输距离长、抗干扰性能强、稳定性好。已经广泛的应用于工业设备的使用中。
在这里插入图片描述
通常使用AB双绞线连接,复杂场合可以使用带屏蔽层的双绞线。
在这里插入图片描述
MCU本身不具有485总线的通讯标准。但是可以采用中继转换芯片SP3485,将串口信号和485的信号做相应的电平转换。
在这里插入图片描述
实际中的具体电路(共占用MCU的3个IO口),其中有两根是串口通讯的RX和TX引脚。
还有一根是RE,高电平时,向外发送数据;低电平时,接收数据。

RS485通信

  • 在软件程序层面,其实利用的就是单片机的串口功能,发送和接收数据。
  • 在硬件层面,就是多加了1个电平转换芯片。将串口的ttl电平转换为了485使用的电平。

二、cubeMX配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、RS485驱动程序

最重要的逻辑:
当MCU往外发数据时候,RE=1,
当MCU发送完数据时候,RE=0,
任意空闲状态,RE=0

/*
 * rs485.c
 */

#include "rs485.h"
#include "../usart/usart.h"
#include "main.h"
/*
RS485总线通信,使用UART8,这是RS485专用的printf函数
调用方法:RS485_printf("123"); //向UART8发送字符123
*/
void RS485_printf (char *fmt, ...)
{
    char buff[USART2_REC_LEN+1];  //用于存放转换后的数据 [长度]
    uint16_t i=0;
    va_list arg_ptr;
    HAL_GPIO_WritePin(RS485_RE_GPIO_Port,RS485_RE_Pin, GPIO_PIN_SET);//RS485收发选择线RE为高电平(发送)
    va_start(arg_ptr,fmt);
    vsnprintf(buff, USART2_REC_LEN+1,fmt,arg_ptr);//数据转换
    i=strlen(buff);//得出数据长度
    if(strlen(buff)>USART2_REC_LEN)i=USART2_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
    HAL_UART_Transmit(&huart2,(uint8_t *)buff,i,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
    HAL_GPIO_WritePin(RS485_RE_GPIO_Port,RS485_RE_Pin, GPIO_PIN_RESET);//RS485收发选择线RE为低电平(接收)
}
//所有USART串口的中断回调函数HAL_UART_RxCpltCallback,统一存放在【USART1.C】文件中。

/*
 * rs485.h
 */

#ifndef RS485_RS485_H_
#define RS485_RS485_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
#include <string.h>//用于字符串处理的库
#include <stdarg.h>
#include <stdlib.h>
#include "stdio.h"

extern UART_HandleTypeDef huart2;//声明USART2的HAL库结构体
void RS485_printf (char *fmt, ...);  //RS485发送

#endif /* RS485_RS485_H_ */

以上只有发送程序,至于接收程序,在USART.C中的串口中断回调函数里面(和USART1\USART3一起)。

/*
 * usart1.c
 */

#include "usart.h"
uint8_t USART2_RX_BUF[USART2_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART2_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接收到的有效字节数目
uint8_t USART2_NewData;//当前串口中断接收的1个字节数据的缓存
uint8_t RS485orBT;//当RS485orBT标志位为1时是RS485模式,为0时是蓝牙模式


void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//串口中断回调函数
{
    if(huart ==&huart2)//判断中断来源(RS485)
    {
	   USART2_RX_BUF[0]=USART2_NewData;//收到数据放入缓存数组(只用到1个数据存放在数组[0])
	   USART2_RX_STA++;//数据接收标志位加1
       HAL_UART_Receive_IT(&huart2,(uint8_t *)&USART2_NewData, 1); //再开启接收中断
    }
}

这边的接收只接受了一个字节的数据,没有什么意义。

四、应用程序

做这个实验需要两个及两个以上的485设备一起通信。暂时没法完成。

工业中RS485设备常使用的是Modbus通信协议。以后有时间可以写一下,这个通信协议。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值