標(biāo)題:
STM32F407與STM32F103的基于RS485通信配置
[打印本頁]
作者:
小小涼冰樂
時(shí)間:
2020-6-4 20:40
標(biāo)題:
STM32F407與STM32F103的基于RS485通信配置
總體思路:
主機(jī):STM32F407
從機(jī):STM32F103
通信協(xié)議:RS485
主機(jī)-----串口2----RS485--------------------RS485---串口3-----從機(jī)
//-------------------------------主機(jī)代碼:--------------------------------
//****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) //發(fā)送與接收控制引腳
void RS485_Init();
void RS485_SendData(char *data,u32 len);
#endif
//****RS485源文件代碼:
#include "rs485.h"
/*
函數(shù)功能:RS485初始化
函數(shù)原型:RS485_Init
函數(shù)參數(shù):無
函數(shù)返回值:無
//RS485_RE -- PG8
*/
void RS485_Init()
{
//1.配置時(shí)鐘
RCC->AHB1ENR |= (1<<6);//開啟PG端口時(shí)鐘
//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); //默認(rèn)為接收模式
}
/*
函數(shù)功能:RS485發(fā)送len個(gè)字節(jié).
函數(shù)原型:RS485_SendData
函數(shù)參數(shù):buf:發(fā)送區(qū)首地址 len:發(fā)送的字節(jié)數(shù)
函數(shù)返回值:無
*/
void RS485_SendData(char *data,u32 len)
{
uint8_t i = 0;
RS485_RE(1);//設(shè)置為發(fā)送模式
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);//設(shè)置為接收模式
}
UartBuf_TypeDef U2;
/**********************************************************************
*函數(shù)名:USART2_IRQHandler
*功 能:USART2中斷服務(wù)函數(shù)
*參 數(shù):無
*返 回:無
*備 注:無
**********************************************************************/
void USART2_IRQHandler(void) // 串口1中斷服務(wù)函數(shù)
{
if(USART2->SR&1<<5) // 讀取數(shù)據(jù)寄存器不為空中斷
{
U2.RxBuf[U2.RxLen++]=USART2->DR;
}
if(USART2->SR&1<<4) // 檢測到空閑線路中斷
{
U2.RxBuf[U2.RxLen]=0; // 字符串結(jié)束標(biāo)志
U2.RxLen=0; // 索引清零
if(strcmp(U2.RxBuf,"1")==0)
{
LED1=!LED1;
}
else if(strcmp(U2.RxBuf,"2")==0)
{
LED2=!LED2;
}
else if(strcmp(U2.RxBuf,"3")==0)
{
LED3=!LED3;
}
else if(strcmp(U2.RxBuf,"4")==0)
{
LED4=!LED4;
BEEP=!BEEP;
}
printf("從機(jī)給主機(jī)發(fā)送數(shù)據(jù):%s\r\n",U2.RxBuf);
USART2->SR; // 讀取清零
USART2->DR;
}
}
//-------------------------------從機(jī)代碼:--------------------------------
//****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)//發(fā)送與接收控制引腳
void RS485_Init(void);
void RS485_SendData(char *data,uint32_t lenth);
#endif
//****RS485源文件代碼:
#include "systick.h"
#include "rs485.h"
/*
函數(shù)功能:RS485初始化
函數(shù)原型:RS485_Init
函數(shù)參數(shù):
函數(shù)返回值:無
//RS485_RE -- PA12
*/
void RS485_Init()
{
//1.配置時(shí)鐘
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); //默認(rèn)為接收模式
}
/*
函數(shù)功能:RS485發(fā)送len個(gè)字節(jié).
函數(shù)原型:RS485_SendData
函數(shù)參數(shù):buf:發(fā)送區(qū)首地址 len:發(fā)送的字節(jié)數(shù)
函數(shù)返回值:無
*/
void RS485_SendData(char *data,uint32_t lenth)
{
uint8_t i = 0;
RS485_RE(1);//設(shè)置為發(fā)送模式
for(i=0;i<lenth;i++)
{
while((USART3->SR &(1<<6)) == 0);//等待移位數(shù)據(jù)寄存器為空
USART3->DR = data[i];//把要發(fā)送的數(shù)據(jù)存放在發(fā)送數(shù)據(jù)寄存器
}
while((USART3->SR &(1<<6)) == 0);
RS485_RE(0);//設(shè)置為接收模式
}
char USART3_ReceiveBuf[128];
/**********************************************************************
*函數(shù)名:USART3_IRQHandler
*功 能:USART3中斷服務(wù)函數(shù)
*參 數(shù):無
*返 回:無
*備 注:無
**********************************************************************/
void USART3_IRQHandler(void) // 串口1中斷服務(wù)函數(shù)
{
static u8 i=0;
if(USART3->SR&1<<5) // 讀取數(shù)據(jù)寄存器不為空
{
USART3_ReceiveBuf[i++]=USART3->DR;
}
if(USART3->SR&1<<4) // 檢測到空閑線路中斷
{
USART3_ReceiveBuf[i]=0; // 字符串結(jié)束標(biāo)志
if(strcmp(USART3_ReceiveBuf,"1")==0)
{
PCout(5)=!PCout(5);
}
i=0;//索引清零
printf("主機(jī)發(fā)送了數(shù)據(jù):%s\r\n",USART3_ReceiveBuf);
USART3->SR; // 讀取清零
USART3->DR;
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1