久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2925|回復: 0
打印 上一主題 下一主題
收起左側

STM32F407與STM32F103的基于RS485通信配置

[復制鏈接]
跳轉到指定樓層
樓主
ID:763998 發表于 2020-6-4 20:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
總體思路:
主機: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;                                       
                               
                }
                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("從機給主機發送數據:%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黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成av人电影在线 | 久久国产精品91 | 欧美色视频免费 | 中文字幕一级毛片视频 | 国产精品久久久久久久久久久久 | 日日网| 国产一级片av | 农村真人裸体丰满少妇毛片 | 成人免费高清 | 亚洲一区二区三区在线 | 亚洲午夜精品视频 | 久久com | 国产一卡二卡三卡 | 久久久成人免费视频 | 一区二区久久电影 | 国产99久久久国产精品 | 一区二区在线 | 欧美一区在线看 | 久久精品免费 | 国产成人免费视频 | 国产乱人伦精品一区二区 | 夫妻午夜影院 | 91久久精品国产免费一区 | 久久久一二三 | av在线天堂网| av天天爽| 欧美三级电影在线播放 | 久久夜视频 | 亚洲精品欧美一区二区三区 | 日本在线免费看最新的电影 | 99亚洲| 国产日韩一区二区三免费高清 | 欧美日韩国产精品一区 | www久久99| 在线观看中文字幕 | 国产1区 | 国产视频福利一区 | 国产一区二区麻豆 | 国产精品久久网 | 国产福利在线 | 亚洲高清av在线 |