打印
[STM32F1]

stm32基础篇————RS485 通信 实验

[复制链接]
17950|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 aizaixiyuanqian 于 2017-12-13 22:24 编辑

本次实验如何利用 STM32 的串口实现 485 通信。利用 STM32 的串口 2 来实现开发板与上位机之间的 485 通信,通过在串口助手上输入字符发送到单片机上后在发送到串口助手上显示。本次实验目标:
1、了解 485 通信。
2、掌握485 通信。
沙发
aizaixiyuanqian|  楼主 | 2017-12-13 22:26 | 只看该作者
485 简介
485(一般称作 RS485/)是属于 OSI 模型物理层的电气特性规定为 2 线,半双工,多点通信的标准。它的电气特性和 RS-232 大不一样用缆线两端的电压差值来表示传递信号。RS485 仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协议。



使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2017-12-13 22:32 | 只看该作者
RS485 的特点包括:
1) 接口电平低,不易损坏芯片。RS485 的电气特性:逻辑“ 1”以两线间的电压差为+(2~6)V表示;逻辑“ 0”以两线间的电压差为-(2~6)V表示。接口信号电平比 RS232降低了,不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与 TTL 电路连接。
2) 传输速率高。 10 米时, RS485 的数据最高传输速率可达 35Mbps,在 1200m 时,传输速度可达 100Kbps。
3) 抗干扰能力强。 RS485 接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
4) 传输距离远, 支持节点多。 RS485 总线最长可以传输 1200m 以上(速率≤100Kbps)一般最大支持 32 个节点,如果使用特制的 485芯片,可以达到 128 个或者 256个节点,最大的可以支持到 400 个节点。

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2017-12-13 22:33 | 只看该作者
S485 推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。理想情况下RS485 需要 2 个匹配电阻,其阻值要求等于传输电特性阻抗(一般为 120Ω )。没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差。没接电阻的话,会使得较快速的发送端产生多个数据信号的边缘, 导致数据传输出错。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2017-12-13 22:34 | 只看该作者
本次实验,我们只需要配置好串口 2,就可以实现正常的 485 通信了,串口 2 的配置和串口 1 基本类似,只是串口的时钟来自 APB1,最大频率为 36Mhz。

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2017-12-13 22:36 | 只看该作者
电路设计:

串口使用的是串口 2,也就是 PA2和 PA3,控制使能端使用的是 PG3 管脚。我们使用 USB 转 485 接口的 A 和 B 对应接到板子上的 A 和 B,就可以将板子和电脑进行通信了。

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2017-12-13 22:38 | 只看该作者
485  GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化 GPIO
//打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOA|
RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
/* 配置 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;  //CS-485
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
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 */


使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2017-12-13 22:39 | 只看该作者
485串口初始化
USART_InitStructure.USART_BaudRate = 9600;  //波特率设置为 9600 //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据长 8 位
USART_InitStructure.USART_StopBits = USART_StopBits_1;//1 位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无效验
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //失能硬件流
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//开启发送和接受模式
USART_Init(USART2, &USART_InitStructure); /* 初始化 USART2 */
USART_Cmd(USART2,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //使能或者失能指定的 USART 中断 接收中断
USART_ClearFlag(USART2,USART_FLAG_TC); //清除 USARTx 的待处理标志位

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2017-12-13 22:40 | 只看该作者
NVIC 中断优先级管理
/* 设置 NVIC 参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //打开
USART2 的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢
占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优
先级为 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2017-12-13 22:40 | 只看该作者
中断 函数
void USART2_IRQHandler(void)  //485 通信中断函数
{
static u8 k;
USART_ClearFlag(USART2,USART_FLAG_TC);
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)//检查指定的
USART 中断发生与否
{
k=USART_ReceiveData(USART2);
GPIO_SetBits(GPIOG,GPIO_Pin_3);
delay_ms(1);
USART_SendData(USART2,k);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
delay_ms(2);
GPIO_ResetBits(GPIOG,GPIO_Pin_3);
}
}

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2017-12-13 22:41 | 只看该作者
主程序 设计


int main()
{
rs485_init();  //485 初始化
GPIO_ResetBits(GPIOG,GPIO_Pin_3); //首先要打开 485 接收数据的控制端
while(1);
}

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2017-12-13 22:42 | 只看该作者
打开串口调试软件就可以测试了。

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2017-12-13 22:42 | 只看该作者
欢迎来学习,今天下雪了,早点睡觉。

使用特权

评论回复
14
stm31| | 2018-6-14 16:32 | 只看该作者
你好,这个程序我在使用时有点问题

使用特权

评论回复
15
wdliming| | 2018-11-10 18:14 | 只看该作者
不错,学习~~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝