STM32F407与STM32F103的基于RS485通信配置

总体思路:
主机:STM32F407
从机:STM32F103
通信协议:RS485
主机-----串口2----RS485--------------------RS485—串口3-----从机

//-------------------------------主机代码:--------------------------------
//****RS485头文件代码:
#ifndef _RS485_H_
#define _RS485_H_

#include "stm32f4xx.h" 
#include "string.h"
#include "bitband_cm4.h" // 位带操作头文件
#include <stdio.h>
#include "usart2.h"

#define RS485_RE(x) (PGout(8) = x) //发送与接收控制引脚

void RS485_Init();
void RS485_SendData(char *data,u32 len);
#endif

//****RS485源文件代码:
#include "rs485.h"


/*
函数功能:RS485初始化
函数原型:RS485_Init
函数参数:无
函数返回值:无
//RS485_RE -- PG8
*/
void RS485_Init()
{
        //1.配置时钟
        RCC->AHB1ENR |= (1<<6);//开启PG端口时钟
        //2.配置GPIO
        GPIOG->MODER &= ~(3<<2*8);// 输出模式
        GPIOG->MODER |= 1<<2*8;          
        GPIOG->OTYPER &=~(1<<1*8);// 推挽
        GPIOG->OSPEEDR &=~(3<<2*8);// 2M
        //3.初始化USART3
        USART2_Init(9600);
        RS485_RE(0); //默认为接收模式
}


/*
函数功能:RS485发送len个字节.
函数原型:RS485_SendData
函数参数:buf:发送区首地址   len:发送的字节数
函数返回值:无
*/
void RS485_SendData(char *data,u32 len)
{
        uint8_t i = 0;
        RS485_RE(1);//设置为发送模式
        for(i=0;i<len;i++)
        {
                while((USART2->SR &(1<<6)) == 0);
                USART2->DR = data[i];
        }
        while((USART2->SR &(1<<6)) == 0);
        RS485_RE(0);//设置为接收模式
}


UartBuf_TypeDef U2;
/**********************************************************************
*函数名:USART2_IRQHandler
*功  能:USART2中断服务函数
*参  数:无
*返  回:无
*备  注:无
**********************************************************************/
void USART2_IRQHandler(void)  // 串口1中断服务函数
{
        if(USART2->SR&1<<5) // 读取数据寄存器不为空中断 
        {
                U2.RxBuf[U2.RxLen++]=USART2->DR;
        }
        if(USART2->SR&1<<4)   // 检测到空闲线路中断
        {
                
                U2.RxBuf[U2.RxLen]=0;     // 字符串结束标志
                U2.RxLen=0;     // 索引清零                                                        
                if(strcmp(U2.RxBuf,"1")==0)
                {
                                LED1=!LED1;                                                
                }
                printf("从机给主机发送数据:%s\r\n",U2.RxBuf);
                USART2->SR;        // 读取清零
                USART2->DR;                                                         
        }
}


//-------------------------------从机代码:--------------------------------
//****RS485头文件代码:
#ifndef _RS485_H_
#define _RS485_H_

#include "stm32f10x.h"
#include "string.h"
#include "bitband_cm3.h" // 位带操作头文件
#include <stdio.h>
#include "usart3.h"

#define RS485_RE(x) (PAout(12) = x)//发送与接收控制引脚

void RS485_Init(void);
void RS485_SendData(char *data,uint32_t lenth);
#endif


//****RS485源文件代码:


#include "systick.h"
#include "rs485.h"

/*
函数功能:RS485初始化
函数原型:RS485_Init
函数参数:
函数返回值:无
//RS485_RE -- PA12
*/
void RS485_Init()
{
        //1.配置时钟
        RCC->APB2ENR |= (1<<2);
        //2.配置GPIO
        GPIOA->CRH &= ~(0xf<<4*(12-8));
        GPIOA->CRH |=  (0x3<<4*(12-8)); // 通用推挽输出模式
        //3.初始化USART3
        USART3_Init(9600);
        RS485_RE(0); //默认为接收模式
}


/*
函数功能:RS485发送len个字节.
函数原型:RS485_SendData
函数参数:buf:发送区首地址   len:发送的字节数
函数返回值:无
*/
void RS485_SendData(char *data,uint32_t lenth)
{
        uint8_t i = 0;
        RS485_RE(1);//设置为发送模式
        for(i=0;i<lenth;i++)
        {
           while((USART3->SR &(1<<6)) == 0);//等待移位数据寄存器为空
           USART3->DR = data[i];//把要发送的数据存放在发送数据寄存器
        }
        while((USART3->SR &(1<<6)) == 0);
        RS485_RE(0);//设置为接收模式
}


char USART3_ReceiveBuf[128];
/**********************************************************************
*函数名:USART3_IRQHandler
*功  能:USART3中断服务函数
*参  数:无
*返  回:无
*备  注:无
**********************************************************************/
void USART3_IRQHandler(void)  // 串口1中断服务函数
{
        static u8 i=0;
        if(USART3->SR&1<<5) // 读取数据寄存器不为空 
        {
                USART3_ReceiveBuf[i++]=USART3->DR;
        }
        if(USART3->SR&1<<4)    // 检测到空闲线路中断
        {
                USART3_ReceiveBuf[i]=0;  // 字符串结束标志
                if(strcmp(USART3_ReceiveBuf,"1")==0)
                {
                        PCout(5)=!PCout(5);
                }
                i=0;//索引清零
                printf("主机发送了数据:%s\r\n",USART3_ReceiveBuf);
                USART3->SR;        // 读取清零
                USART3->DR;                                                         
        }
}
### 回答1: 基于STM32F103的RS485通信是一种常见的串行通信协议,用于在不同设备之间传输数据。STM32F103是一种高性能的微控制器,具有丰富的外设和强大的处理能力,可以很好地支持RS485通信。在使用RS485通信时,需要注意信号的电平、波特率、数据格式等参数的设置,以确保通信的稳定和可靠。同时,还需要编写相应的程序代码,实现数据的发送和接收,以及错误处理等功能。 ### 回答2: STM32F103系列是意法半导体公司推出的Cortex-M3内核微控制器,该系列是一种具有非常高性价比的通用型微控制器,广泛应用于工业控制、通信、汽车电子等领域。RS485是一种常用的串行通信协议,它具有传输距离远、传输速率高、抗干扰性强等优点,因此在工业自动化、智能楼宇等领域得到广泛的应用。 基于STM32F103的RS485通信,首先需要硬件上进行一些配置。RS485是一种差分信号协议,需要特殊的电路来驱动。通信双方需要各自配置一个RS485芯片,通信时通过RS485芯片控制发送和接收数据。在STM32F103上,串口1和串口2都可以作为RS485通信口使用。在硬件上,需要注意应该进行电平转换,将STM32F103的3.3V逻辑信号转换成RS485的12V差分信号。 在软件上,基于STM32F103的RS485通信需要进行以下的操作: 1. 配置串口:选择RS485通信口(USART1或USART2),设置波特率、数据位、停止位、校验位等。 2. 初始化GPIO:根据具体的硬件电路进行GPIO的初始化,同时需要配置RS485芯片的控制引脚,包括使能发送、使能接收、控制电平转换等。 3. 添加中断:在串口通信中,应该尽量使用中断方式来接收和发送数据。可以根据需要添加接收中断和发送中断,以便及时处理接收到的数据和发送数据。 4. 编写发送和接收函数:根据具体的通信协议,编写发送和接收函数。在发送函数中,需要先将发送端口置为发送模式,然后将需要发送的数据通过USART发送出去;在接收函数中,需要先判断是否有接收到数据,如果有则通过USART读取数据。 5. 测试通信:利用上述函数和配置,进行通信测试,确保串口正常收发数据。 基于STM32F103的RS485通信需要注意一些问题。在通信之前,应该先了解RS485通信的具体协议,例如帧格式、数据长度、校验方式等。在编写软件时,应该细致地考虑通信的各种情况,例如传输过程中是否发生丢失、传输速率是否满足要求等。同时,需要注意电路的设计,以确保RS485芯片得到恰当的电源和信号控制。 ### 回答3: RS485是一种常见的串行通信协议,它能够实现高速、长距离、多节点的通信,具有传输距离远、噪声干扰较强等优点。STM32F103是一种性能出色的ARM Cortex-M3系列的微控制器,它集成了丰富的外设,包括UART、SPI、I2C等串行通信接口,可以方便地实现RS485通信。 首先,需要了解RS485通信的基本原理。它利用差分传输的方式,即将数据信号和其反相信号同时传输,以消除信号传输过程中的干扰。对于RS485通信,要实现多个节点之间通信,需要使用统一的通信协议,如MODBUS等。每个节点需要有独立的地址,通过地址来标识通信的对象。在编程时,需要注意数据的传输顺序(如低位在前还是高位在前)、CRC校验等问题。 在STM32F103中,可以使用UART接口来实现RS485通信。设置UART的波特率、停止位、数据位等参数,将发送和接收数据的脚配置成RS485模式即可。同时,为了实现多节点通信和地址识别,可以在数据帧中添加地址字段,在接收数据时判断地址,选择相应的处理方式。 与此同时,可以利用STM32F103中的定时器、中断等功能,实现数据的定时发送和接收、数据缓存的管理等功能。在编程时,需要注意中断的优先级、通信时序、数据处理等问题。 总之,基于STM32F103的RS485通信需要综合考虑硬件和软件两个方面,通过合理配置和编程实现多节点、高速度、低干扰的通信功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值