stm32---RS485半双工通信

2020-03-26来源: eefocus关键字:stm32  RS485  半双工通信

典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而 RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆 线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样。RS485 仅仅 规定了接受端和发送端的电气特性,并没有规定或推荐任何数据协议,因此 RS485 的协议层可以和 RS232 一样。


连接方式


发送数据时,串口控制器的 TX 信号经过 收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信 号转化成 TTL 信号通过 RX 引脚传输到串口控制器中


SP3485


SP3485是板子上的收发器。对收发器,RO是接收输出端,DI是发送数据输入端, RE 是接收使能信号(低电平有效), DE 是发送使能信 号(高电平有效)


开发板把RE和DE共同连接到了PG3,用高低电平来表示是输出有效还是接收有效。


本次列程是用USART2


rs485.c


#include "rs485.h"

#include "SysTick.h"

 

/*******************************************************************************

* 函 数 名         : RS485_Init

* 函数功能         : USART2初始化函数

* 输    入         : bound:波特率

* 输    出         : 无

*******************************************************************************/  

void RS485_Init(u32 bound)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOAG时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

    

    /*  配置GPIO的模式和IO口 */

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //TX-485    //串口输出PA2

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;         //复用推挽输出

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 

    GPIO_Init(GPIOA,&GPIO_InitStructure);       /* 初始化串口输入IO */

    

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //RX-485       //串口输入PA3

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;     //模拟输入

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //CS-485

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     //推挽输出

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOG,&GPIO_InitStructure);

    

    //USART2 初始化设置

    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(USART2, &USART_InitStructure); //初始化串口2

    

    USART_Cmd(USART2, ENABLE);  //使能串口 2

    

    USART_ClearFlag(USART2, USART_FLAG_TC);

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接受中断

 

    //Usart2 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;       //子优先级2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、

    

    RS485_TX_EN=0;              //默认为接收模式   

}

 

/*******************************************************************************

* 函 数 名         : USART2_IRQHandler

* 函数功能         : USART2中断函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/ 

void USART2_IRQHandler(void)

{

    u8 res;     

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据

    {       

        res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR

        RS485_TX_EN=1; //发送模式,RS232是全双工发送读取可同时,不需要这样转换模式分时

        delay_ms(1);

        USART_SendData(USART2,res);

        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=1);

        delay_ms(2);

        RS485_TX_EN=0;//接受模式

    }  

    USART_ClearFlag(USART2,USART_FLAG_TC);  

}   

 

 

rs485.h


#ifndef _rs485_H

#define _rs485_H

 

#include "system.h"

 

 

//模式控制

#define RS485_TX_EN     PGout(3)    //485模式控制.0,接收;1,发送.

                                                         

void RS485_Init(u32 bound);

 

 

#endif

 

main.c


 

 

#include "system.h"

#include "SysTick.h"

#include "led.h"

#include "usart.h"

#include "rs485.h"

 

 

/*******************************************************************************

* 函 数 名         : main

* 函数功能         : 主函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

int main()

{

    u8 i=0;

 

    SysTick_Init(72);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组

    LED_Init();

    USART1_Init(9600);

    RS485_Init(9600);

    

    while(1)

    {

        i++;

        if(i%20==0)

        {

            led1=!led1;

        }

        

        delay_ms(10);

    }

}

关键字:stm32  RS485  半双工通信 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492638.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32---CAN通信
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8l低功耗系列
最近干刚做了一个stm8的项目用的是L低功耗系列,其中遇到一个问题。外设寄存器的值怎么都写入不进去。用IAR仿真产看寄存器的值,不论写进去多少,都是初始值。后来把所有寄存器都写了一遍,发现有的能写进去,有的写不进去。比如GPIO的寄存器就能写进去。百思不得姐,偶然查看clock的库函数发现个函数是设置外设时钟的。这个系列,亦或者整个低功耗系列的每个外设是不是都需要在时钟寄存器中单独设置时钟。(以前所使用的芯片都是在外设寄存器中使能或者是禁使能)
发表于 2020-03-09
STM8L+BC26双低功耗,微安
现在在做一个项目需要用到STM8L和BC26。长时间断链后连接下服务器,并且发送一下当前状态,需要用到STM8L和BC26的低功耗。STM8L低功耗,这里用HALT模式,RTC规定时间唤醒。第一步需要关闭所有外设,把所有管脚为设置为输出,并且输出低,管脚根据具体环境设置,需要输出高电平的则输出高电平。在关闭外设的是后是需要先_DeInit,然后在关闭外设始终,有点需要特别主要,要把在进入halt模式的时候需要把所有的中断的标志位清空,否则使用RTC唤醒则会不起作用。第二步就设置低功耗的一些配置。第三步配置完成后进入低功耗。项目中需要用到外部高速始终和BC26通信,所以在进入和退出halt模式的时候需要重新初始化active模式下的
发表于 2020-03-09
stm8l151低功耗程序架构,调试心得
最近帮医院做了一款体温记录仪,整个硬件方案资源是:stm8L151 + NTC*2 + EEPROM + 锂电池充电保护电路 + 18mAh纽扣电池;软件逻辑是,每隔一分钟,采样两路温度并保存在EEP里;通过USB转TTL,上位机能够读取,展示温度曲线,最大最小平均值等简单的运算;整个方案很简单,但也走了不少弯路......单片机程序框架之伪代码:void main(void){    CLK_Config();    GPIO_Config();    ADC_Config();    USART_Config();   
发表于 2020-03-09
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
使用的最小系统晶振是8m的。这里说下配置过程:时钟自动切换,开启切换中断在中断里面清除中断标志,使能CSS并开启CSS中断CSS中断发生,清除CSS中断标志,将HSI二分频,即16M/2=8M,与外部晶振相同,这样不会影响串口波特率窗口输出配置信息:用手触碰PA1、PA2引脚使外部晶振失效串口输出CSS中断
发表于 2020-03-09
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
STM8S103之时钟设置
最大时钟(指的是system clock):外部晶振24MHz,内部高速RC16MHz三个时钟源:外部晶振、内部高速RC(上电默认) +内部低速RC几个时钟:master clock(即sytem clock),fcpu,外设时钟、AWU时钟调用库函数中CLK_ClockSwitchConfig,参考库函数clk_clockselection,但是分频还得进一步设置上电默认:内部高速RC,HSIDIV=/8,CPUDIV=/1,外部时钟全使能,查看相关寄存器的Reset value
发表于 2020-03-09
STM8S103之时钟设置
stm8 16M晶振下精确软件延时
void inerDelay_us(unsigned char n) {for(;n>0;n--) { asm("nop"); //在STM8里面,16M晶振,_nop_() 延时了 333nsasm("nop"); asm("nop"); asm("nop"); }}//---- 毫秒级延时程序----------------------- void Delayms(unsigned int time) { unsigned int i; 
发表于 2020-03-08
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved