42.485通信实验

发布者:RadiantSoul最新更新时间:2017-11-10 来源: eefocus关键字:485通信  stm32 手机看文章 扫描二维码
随时随地手机看文章

一。485接口原理

42.485通信实验
42.485通信实验
42.485通信实验
42.485通信实验
42.485通信实验
二。485电路芯片SP3485

42.485通信实验
一般2,3脚连在一起,当2,3脚为低电平时,使能RO端,当2,3脚为高电平时,使能DI端。

三。电路

42.485通信实验
采用UART2接口,PA2为USART2_TX,PA3为USART2_RX

PA2接SP3485的4脚DI端

PA3接SP3485的1脚RO端

42.485通信实验

四。程序

串口2初始化

//初始化IO 串口2
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率  
void RS485_Init(u32 bound)

    GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;
 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);//使能GPIOA,G时钟
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     //PG9端口配置
   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_2; //PA2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

  RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
  
   #ifdef EN_USART2_RX     //如果使能了接收
  USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
  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); ; //初始化串口
  
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
  
    USART_Cmd(USART2, ENABLE);                    //使能串口

 #endif

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

}

RS485头文件rs485.h

#ifndef __RS485_H
#define __RS485_H   
#include "sys.h"            
        
extern u8 RS485_RX_BUF[64];   //接收缓冲,最大64个字节
extern u8 RS485_RX_CNT;      //接收到的数据长度

 

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

//如果想串口中断接收,请不要注释以下宏定义
#define EN_USART2_RX  1   //0,不接收;1,接收.

 

void RS485_Init(u32 bound);  //RS485的初始化函数,初始化串口2
void RS485_Send_Data(u8 *buf,u8 len);  //发送函数
void RS485_Receive_Data(u8 *buf,u8 *len);   //接收函数


#endif   

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
 u8 t;
 RS485_TX_EN=1;   //设置为发送模式
   for(t=0;t
 {    
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
  USART_SendData(USART2,buf[t]);
 } 
 
 while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
 RS485_RX_CNT=0;  
 RS485_TX_EN=0;    //设置为接收模式 
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
 u8 rxlen=RS485_RX_CNT;
 u8 i=0;
 *len=0;    //默认为0
 delay_ms(10);  //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
 if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
 {
  for(i=0;i
  {
   buf[i]=RS485_RX_BUF[i]; 
  }  
  *len=RS485_RX_CNT; //记录本次数据长度
  RS485_RX_CNT=0;  //清零
 }
}


关键字:485通信  stm32 引用地址:42.485通信实验

上一篇:39. RTC实时时钟_备份区域BKP 原理讲解
下一篇:44. Flash操作程序

推荐阅读最新更新时间:2024-03-16 15:44

一步步写STM32 OS【一】 序言
  一直想写个类似uCOS的OS,近段时间考研复习之余忙里偷闲,总算有点成果了。言归正传,我觉得OS最难的部分首先便是上下文切换的问题,他和MCU的架构有关,所以对于不同的MCU,这部分需要移植。一旦这个问题解决了,整个OS算是成功了一半了,当然,是对于简单的OS。   好了,要写一个OS,首先需要一个开发板和仿真器。我的开发板是STM32F4DISCOVERY,自带ST-LINK V2仿真器,板载MCU为STM32F407VGT6,支持FPU,32位ARM Cortex-M4F核,1024KB FLASH,192 KB RAM,总之很强大。对STM32其他系列,本OS几乎不需修改修改就可使用。开发环境为IAR for ARM 6
[单片机]
基于STM32单片机的DLP驱动电路的研究
DLP投影技术是应用美国德州仪器公司开发的数字微镜元件——DMD(Digital Micromirror Device)作为主要关键处理元件以实现数字光学处理过程的技术。DLP显示的色彩清晰度高、艳丽、细腻、逼真,且为全数字显示即可靠性极高,能在各类产品(如大屏幕数字电视、公司/家庭/专业会议投影机和数码相机(DLP Cinema))中提供最佳图像效果。目前,大部分的家用或商用DLP投影机都采用了单片结构,使得其便于移动携带,因而得到越来越广泛的应用。在目前应用发展的基础上,又对其结构的精简性、携带的方便性提出了更高的要求。传统的DLP投影仪是通过DVI接口接收外部信号,并且经过信号转换传送给DLP控制器来控制DLP的显示,占
[单片机]
基于<font color='red'>STM32</font>单片机的DLP驱动电路的研究
STM32 关于定时器相关问题的探讨(一)
STM32F4 PWM模块探讨 1.STM32定时器认识 1.1 基本定时器 基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。此类定时器不仅可用作通用定时器以生成时基, 还可以专门用于驱动数模转换器 。(DAC)。 通用定时器特性 16 位自动重载递增计数器 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间 用于触发 DAC 的同步电路 发生如下更新事件时会生成中断/DMA 请求:计数器上溢 1.2 通用定时器 1.2.1 TIM~TIM5 通用定时器包含一个 16 位或 32 位自动重载计数器,该计数器由可
[单片机]
一个完整的STM32工程到底由哪些文件组成
这个我必须总结清楚,就像之前总结无人机的飞控算法一样,你可以把各个STM32书里面的工程文件拿来总结。找出通用的模式。灵活运用,能灵活改动。 我觉得基本的应该是标准库文件+的应用层代码。 其实本质还是一堆C文件,互相引用,那些文件夹应该只是方便整理归类那些C文件,不要那些文件夹应该也是可以的。 这是野火的STM32工程组成 《STM32单片机应用与全案例实践》里的 这个应该是讲得非常清晰了的。 这是平衡小车之家的平衡车的程序框架,SYSYTEM这个文件夹其实是正点原子弄的(这个正点原子的书上有说,他们专门弄个SYSTEM文件夹放着就是几个不同例程都要通用的C文件,可以就直接当作用户写的C
[单片机]
一个完整的<font color='red'>STM32</font>工程到底由哪些文件组成
IAR在STM32的配置方法
1. 建立工程项目文件 新建一个文件夹来存放整个工程项目,在该项目文件夹下建立几个子文件夹存放不同类别的文件: i.将官方模板中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h和空白main.c文件复制到该项目文件夹下; ii. Obj-存放工程文件,将官方模板中的cortexm3_macro.s、lnkarm_flash.xcl、lnkarm_ram.xcl和stm32f10x_vector.c文件复制到该文件夹下。 iii.library-存放STM32 FWLib文件,将官方提供的固件库library复制到该文件夹下。 2. 在IAR中建立工程 打开IAR,在Project菜
[单片机]
IAR在<font color='red'>STM32</font>的配置方法
stm32---DAC
DAC即数字模拟转换器,它可以将数字信 号转换为模拟信号。 它的功能与 ADC 相反。在常见的数字信号系统中,大部分传 感器信号被转化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、 处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压 模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还 原就是这样一个过程。 触发方式 前面是定时器TIM,中间是外部中断9,后面是软件触发 dac.c #include dac.h void DAC1_Init() { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTyp
[单片机]
STM32入门学习之USART中断(STM32F030F4P6基于CooCox IDE)
#include stm32f0xx.h #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_gpio.h #include stm32_lib/inc/stm32f0xx_usart.h #include stm32_lib/inc/stm32f0xx_misc.h #include delay.h int main(void) { //1、使能时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2
[单片机]
STM32 延时函数高级用法分析
一、使用场景 第一种情况,在使用普通 STM32 延迟函数,类似于 HAL_Delay(time),由于该函数是使用循环去判断及延时的,所以在执行该函数时整个程序会在此处等待定时器的中断服务函数修改参量使得循环判决条件不成立,从而继续程序的执行,同时也达到延迟时间的效果。由于使用的是系统的定时器进行延迟,所以时间相对准确。 第二种情况,当需要周期性的执行一个任务时,将这个函数放在某个定时器的中断服务函数里,设置好定时器的时间,完成时产生中断,从而进入中断服务函数执行该函数。此时,MCU 执行中断程序,只有更高优先级的中断才能打断当前执行的中断服务函数,进入更高优先级的中断服务函数去执行。需要等所有中断服务函数都执行完成,才
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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