stm32实验485实验

合集下载

(完整word版)STM32的485最简单例程

(完整word版)STM32的485最简单例程

485最基本的半双工通信配置采用STM32F103ZET6串口3连接485芯片通信口,485芯片的A,B通过485转串口模块与电脑相连,完成在串口软件上输入输出功能。

串口3,配置函数:void USART3_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);// USART3_TX —> PB10 , USART3_RX —> PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure。

GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure。

GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure。

GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);USART_ART_BaudRate = 115200; // 1200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No; //USART_Parity_Even;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure。

实验五 485实验

实验五 485实验

基于EIA-485总线的多机数据通信实验一、实验目的1.理解RS485串口通讯原理2.掌握RS485串口通讯硬件连接3.掌握基本的主从式通讯网络的搭建4.理解协议的概念5.掌握简单的协议的收发原理6.学会在ARM开发板上编写程序实现简单协议的收发二、实验设备硬件:RS485通信模块、EasyArm2200开发套件、实验连接跳线软件:ADS1.2集成开发环境三、实验原理1.RS485原理RS485采用平衡发送和差分接收,具有抑制共模干扰的能力,加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。

RS485的电气特性:逻辑“1”以两线间的电压差为+(2—6) V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。

接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。

RS485采用半双工工作方式,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输,数据最高传输速率为10Mbps。

任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。

RS485用于多点互连时非常方便,可以省掉许多信号线。

应用RS485可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。

EasyArm2200开发套件上自带有RS232串口,所以需要使用扩展模块。

选用MAX485芯片,其引脚图如下:图1:MAX485接口引脚图其中各个引脚的功能如下:图2 EIA-485接口模块引脚说明其典型的组网连接图如下:图3 典型组网连接示意图其中电阻为120欧姆,并且将RE与DE相连,是为了更好的控制串口的收发,当ARM 的GPIO输出高电平时,处于发送状态,此时接收被禁止;反之亦然。

2.通讯协议所谓通信协议是指通信双方的一种约定。

约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。

实验11:RS485通信

实验11:RS485通信

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;
*函数名
: rs485_init
* 函数功能
: IO 端口及串口 2,时钟初始化函数
*输 入
:无
*输 出
:无
*********************************************************************
**********/
void rs485_init()
我们 STM32 开发板上采用 SP3485 作为收发器,该芯片支持 3.3V 供电,最大传输速度 可达 10Mbps,支持多达 32 个节点,并且有输出短路保护。该芯片的框图如图所示:
图中 A、 B 总线接口,用于连接 485 总线。 RO 是接收输出端, DI 是发送数据收入 端, RE 是接收使能信号(低电平有效), DE 是发送使能信号(高电平有效)。
//使能
NVIC_Init(&NVIC_InitStructure);
}
2) 中断函数
void USART2_IRQHandler(void) //485 通信中断函数
{
static u8 k;
USART_ClearFlag(USART2,USART_FLAG_TC);
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)//检查指定的

STM32综合实验

STM32综合实验

编号:《嵌入式原理及应用》实验报告实验项目:综合实验专业:电子信息工程学号:学生姓名:指导教师:时间批次:第13周星期7第4大节第4批次2020 年5月24日一、源代码详细注释#include "stm32f10x.h"#define Key1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)#define Key2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)unsigned char LCDBuffer[10]={""};unsigned char LCDBuffer2[12]={" LISONGLIN"};int msCounter=0;void SysTick_Handler(void)//--- systick中断函数---{msCounter++;}void DelaymS(int t){ int ta,tb;ta=tb=msCounter;while((tb-ta)<t){tb=msCounter;}}void Init_LCD_Pin(void)//初始化屏幕引脚、按键引脚、虚拟终端引脚{ GPIO_InitTypeDef MyGPIO;//定义结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ GPIOA,ENABLE); //使能PC,PB端口时钟MyGPIO.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_13| GPIO_Pin_14 ;MyGPIO.GPIO_Speed=GPIO_Speed_50MHz; // I/O口频率50MhzMyGPIO.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &MyGPIO); //使用MyGPIO参数初始化GPIOBMyGPIO.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2 ; //选择引脚MyGPIO.GPIO_Speed=GPIO_Speed_50MHz; I/O口频率50MhzMyGPIO.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_Init(GPIOA,&MyGPIO); //使用MyGPIO参数初始化GPIOAMyGPIO.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_2 ; //选择引脚MyGPIO.GPIO_Speed=GPIO_Speed_50MHz; I/O口频率50MhzMyGPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING; //配置IO口为浮空输入模式GPIO_Init(GPIOC,&MyGPIO); //使用MyGPIO参数初始化GPIOC}#define RS_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_2) //设置GPIOB.2输出0,等同PBout(2)=0#define RS_SET GPIO_SetBits(GPIOA,GPIO_Pin_2) //设置GPIOA.2输出1,等同PAout(2)=1#define EN_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define EN_SET GPIO_SetBits(GPIOA,GPIO_Pin_1)//LCD1602写指令函数void LCD_Write_Com(unsigned char com)//写指令{ int i;for(i=0; i<1000; i++);GPIO_Write(GPIOB,(int)(com & 0x03)<<1 |(com&0x0c)<<2 |(com & 0x30)<<4 |(com & 0xc0)<<7);RS_CLR;EN_SET;EN_CLR;}//LCD1602写数据函数void LCD_Write_Data(unsigned char Data)//写数据{ int i;for(i=0; i<1000; i++);GPIO_Write(GPIOB,(int)(Data & 0x03)<<1 |(Data & 0x0c)<<2 |(Data & 0x30)<<4 |(Data & 0xc0)<<7); RS_SET;EN_SET;EN_CLR;}void LCD_Init (void) //LCD1602初始化函数{ int i;LCD_Write_Com(0x38);//设置成8位驱动,2行5x7点for(i=0;i<100000;i++);LCD_Write_Com(0x38);for(i=0; i<100000; i++);LCD_Write_Com(0x38);for(i=0;i<100000;i++);LCD_Write_Com(0x38);关闭光标LCD_Write_Com(0x08);//显示模式LCD_Write_Com(0x01);//不显示光标LCD_Write_Com(0x06);//清除显示for(i=0;i<100000;i++);LCD_Write_Com(0x0C);}void LCD_Write_Char(char x, char y, char Data)//显示字符{ if(0==y)LCD_Write_Com(0x80 + x);elseLCD_Write_Com(0xC0+x);LCD_Write_Data(Data);}long KeyCnt=0;void keyscan(){ unsigned char i;if(Key1==0){ DelaymS(10);if(Key1==0){ LCD_Write_Com(0x38);for(i=0;i<12;i++)LCD_Write_Char(2+i,0,LCDBuffer2[i]);}DelaymS(10);//时延}if(Key2==0){ DelaymS(10);if(Key2==0){KeyCnt++;}DelaymS(10);}if(KeyCnt==9999)KeyCnt=0;//返回}unsigned char LCDBuffer1[]={" KeyCnt=0000"};//虚拟终端初始化显示int main(void)//主程序{ unsigned char i=0;if(SysTick_Config(SystemCoreClock/1000)){while(1);}Init_LCD_Pin();LCD_Init();for(i=0;i<14;i++)LCD_Write_Char(i,1,LCDBuffer1[i]);for(i=0;i<10;i++)LCD_Write_Char(3+i,0,LCDBuffer[i]);while(1){ keyscan();if(KeyCnt/1000 >0)LCD_Write_Char(10,1,KeyCnt/1000 + '0');else LCD_Write_Char(10,1,'0');if((KeyCnt%1000)/100 >0)LCD_Write_Char(11,1,(KeyCnt%1000 /100) + '0');else LCD_Write_Char(11,1,'0');if((KeyCnt%100)/10 >0)LCD_Write_Char(12,1,(KeyCnt%100)/10 + '0');else LCD_Write_Char(12,1,'0');if(KeyCnt%10 >0)LCD_Write_Char(13,1,KeyCnt%10 + '0');else LCD_Write_Char(13,1,'0');}}二、程序流程图三、程序运行过程描述先定义中断函数和延时函数;后将屏幕引脚和按键引脚初始化,定义引脚功能,声明结构体,输出模式等参数等,定义虚拟终端输出引脚;再定义存储数据的寄存器,在寄存器中写入指令和数据;定义LED显示函数,信号初始化等,然后屏幕显示字符。

RS485通讯实验

RS485通讯实验

RS485通讯实验与CAN 类似,RS-485 是一种工业控制环境中常用的通讯协议,它具有抗干扰能力强、传输距离远的特点。

RS-485 通讯协议由RS-232 协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单的特点。

RS-485 协议主要是把RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性。

对比CAN 通讯网络,可发现它们的网络结构组成是类似的,每个节点都是由一个通讯控制器和一个收发器组成,在RS-485 通讯网络中,节点中的串口控制器使用RX 与TX 信号线连接到收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用TTL 信号传输,收发器与总线则使用差分信号来传输。

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

RS-485 通讯网络的最大传输距离可达1200 米,总线上可挂载128 个通讯节点,而由于RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当AB 两线间的电压差为-6V~-2V 时表示逻辑1,当电压差为+2V~+6V 表示逻辑0,在同一时刻只能表达一个信号,所以它的通讯是半双工形式的。

RS-485 与RS-232 的差异只体现在物理层上,它们的协议层是相同的,也是使用串口数据包的形式传输数据。

由于RS-485 与RS-232 的协议层没有区别,进行通讯时,我们同样是使用STM32 的USART 外设作为通讯节点中的串口控制器,再外接一个RS-485 收发器芯片把USART 外设的TTL 电平信号转化成RS-485 的差分信号即可。

RS-485—双机通讯实验本小节演示如何使用STM32 的USART 控制器与MAX485 收发器,在两个设备之间使用RS-485协议进行通讯,本实验中使用了两个实验板,无法像CAN 实验那样使用回环测试(把STM32USART 外设的TXD 引脚使用杜邦线连接到RXD 引脚可进行自收发测试,不过这样的通讯不经过RS-485 收发器,跟普通TTL 串口实验没有区别),本教程主要以“USART—485 通讯”工程进行讲解。

2-STM32串口通信实验

2-STM32串口通信实验

3、在工程属性的“Target” -> “Code Generation” 选项中勾选 “Use MicroLIB””。
Company Logo
STM32printf用法配置
在这里讲解一下fputc函数里面的代码,我们前面提到 过USART_SR寄存器的5、6、7三位,理解了这几位的 功能就可以大概理解串口是如何发送数据的了。
第二课 串口通信
LOGO
串口简介
串行接口简称串口,也成串行通信接口,是采用串行通 信方式的扩展接口。串口的使用对于开发调试过程的作 用是非常大的,串口可以用来查看、打印及输出相关信 息,使我们在嵌入式开发中最先与中央处理器通信的接 口。
串行通讯的特点是:数据位传送,传按位顺序进行,最 少只需一根传输线即可完成,成本低但传送速度慢。串 行通讯的距离可以从几米到几千米。
自行更改),数据位长度为8bit,停止位为1,无校验位。
在使用printf函数之前还需要进行一些操作。如果要 printf函数工作的话,还需要把printf()重新定向到串口 中,这部分工作是由fputc(int ch,FILE *f)这个函数来完 成的,这个函数在usart.c中实现。
Company Logo

1、开启串口时钟 2、设置相应I/O模式 3、配置波特率、数据位长度、奇偶校验位等
Company Logo
STM32串口原理图
Company Logo
STM32 UART库函数
Company Logo
STM32串口时钟使能
串口作为STM32的一个外设,其时钟由外设时钟使能寄存器控制, 串口1的时钟使能在APB2ENR寄存器,其他串口的时钟使能位都在 APB1ENR。(以串口1为例)

【STM32H7教程】第31章STM32H7的USART应用之RS485

【STM32H7教程】第31章STM32H7的USART应用之RS485

【STM32H7教程】第31章STM32H7的USART应⽤之RS485第31章 STM32H7的USART应⽤之RS485本章教程为⼤家讲解USART应⽤之485总线。

虽然这⼏年⽆线⽹络的使⽤率有所上升,有线的串⾏⽹络仍然提供最有⼒、最可靠的通信,特别是在恶劣的环境中。

在需要抗噪、抗静电、抗电压故障的⼯业,建筑⾃动化领域仍然是有线通信的天下。

31.1 初学者重要提⽰31.2 RS485基础知识31.3 RS485硬件设计31.4 RS485驱动设计31.5 RS485板级⽀持包(bsp_uart_fifo.c)31.6 RS485驱动移植和使⽤31.7 使⽤例程设计框架31.8 实验例程说明(MDK)31.9 实验例程说明(IAR)31.10 总结31.1 初学者重要提⽰1. 学习本章节前,务必优先学习第30章,RS485⽤到的串⼝FIFO也是建⽴在30章的基础上。

2. 了解了本章31.2和31.3⼩节的基础知识后,强烈推荐看此贴的两个⽂档,对RS485讲解的⽐较透彻,中⽂版:。

3. STM32H7⽀持RS485的硬件流控制,即有⼀个专门的引脚来控制485 PHY的收发状态切换。

V7开发板⽤的USART3,需要⽤PD12来控制,⽽这个引脚要⽤于FMC,所以⽤的是⼀个通⽤IO。

4. 经常会有⽹友咨询为什么程序⾥⾯收发切换没有做延迟处理,这⾥就涉及到⼀个关键的知识点TXE发送空中断和TC发送完成中断的区别,详细看教程中说明即可。

31.2 RS485的基础知识背景知识(了解即可)智能仪表是随着80年代初单⽚机技术的成熟⽽发展起来的,现在世界仪表市场基本被智能仪表所垄断。

究其原因就是企业信息化的需要,企业在仪表选型时其中的⼀个必要条件就是要具有联⽹通讯接⼝。

最初是数据模拟信号输出简单过程量,后来仪表接⼝是RS232接⼝,这种接⼝可以实现点对点的通信⽅式,但这种⽅式不能实现联⽹功能。

随后出现的RS485解决了这个问题。

485通讯使用STM32串口DMA发送数据丢失字节的问题

485通讯使用STM32串口DMA发送数据丢失字节的问题

STM32F10x单片机串口DMA发送485数据问题
开启串口DMA发送数据,使能DMA发送完成中断,实测进入DMA发送完成中断后,有两个字节数据并没有通过串口发送出去;使用485发送数据时,当在DMA发送完成中断中,使能485接收,会造成485传输丢失两个字节;现通过以下方法解决了该问题:
在DMA发送完成中断中,
首先判断串口发送寄存器空标志是否有数据未移入到移位寄存器可用while(!USART_GetFlagStatus( USART2, USART_FLAG_TXE));等待移
入完成;因该标志默认状态下为1,且数据由硬件移入,故不会造成死循环,个人认为;
再判断,串口发送完成标志是否是发送未完成状态,如果为发送未完成,开启发送完成中断;否则,使能485接收(该处未验证不确定);
在串口发送完成中断中,使能485发送。

实测可用;有不合理之处欢迎指教。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档