• EV1527无线通信

先说一下这个通信协议的数据格式,这个图片是我在手册里截的。

  1. 大家按照单片机类型计算周期,我的是STM32f103vb (4CLK大致等于350um)
  2. 发送时按照 先发同步码后发DATA 的顺序   逻辑1或者逻辑0按照以上高低电平延时时间长度发送
  • 无线通信发送模式

  1. 发送很简单,按照数据格式发就行,就是在处理数据上有所变化。无论想发什么数据,16进制10进制最后都要转化成2进制,01发送,从低位向高位发送。
  2. 初始化函数在发送模式里。
/*
@Description 输出高低电平按EV1527协议
@mode 逻辑0或1
*/
void S433_SendBit(u8 mode){ if(mode==)
{
PEout()=;
SysTick_Delay_Us(*);
PEout()=;
SysTick_Delay_Us(); }else if(mode==)
{
PEout()=;
SysTick_Delay_Us();
PEout()=;
SysTick_Delay_Us(*); }else{
debug_led(, LED_TOGGLE);
} } /*
@Description 同步脉冲(或叫引导)
*/
//同步脉冲 4:124
void Sync_Pulse(){ PEout()=;
SysTick_Delay_Us();
PEout()=;
SysTick_Delay_Us(*); } /*
@Description 发送码函数调用
@num 24位二进制的 10进制数
*/
//对发送过来的10进制数进行处理 , 根据需求可以更改
void S433_Send(u32 num){
u8 i;
u32 result=,temp;
temp = num; Sync_Pulse(); while(result){
i = temp%; //对十进制数取余 结果等于最低位二进制数
S433_SendBit(i);
temp = temp/;//除二取整
result--;
} }
  • 无线通信接收模式

  接收要比发送复杂得多,思路就是

  通过触发外部中断处理函数,来检测数据,每触发一次上升或下降沿,记一下时间,根据时间长度来判段杂波,同步波还是数据波,接收关键在于判断。

  下面一段是一些值的初始化,和IO引脚的初始化

static volatile unsigned long long rx433_previous_time = ;//上一次进入中断时间
static volatile unsigned char Sync_Pulse_begin =;//检测同步脉冲完整性 1是同步脉冲
static volatile unsigned char rx433_begin= ;//同步脉冲开启标志1开启 0没开
static volatile unsigned short interval_previous_time=;//上一个间隔时间
////////////
static volatile u8 Rx433Cnt=;
static volatile u8 Rx433bit[]={};
static volatile u8 rxbit=;
static volatile u8 firstbit=;
static volatile u32 Rx433[]={};
/////////// //对管脚初始化 参考普通IO管脚用通信
void S433_SR_Init(){ GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能GPIOE时钟 //E9使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE, GPIO_Pin_9);// 引脚拉低
//接收 E7
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //输入为低
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource7); EXTI_InitStructure.EXTI_Line=EXTI_Line7;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure); }

是否是同步波判断,以及检测发送完成度

/*
@Description 判断是否是同步脉冲
@pre 之前时间段数
@now 现在时间段数
@return rebit开启同步 success同步成功 synerror 不是同步脉冲
*/
u8 Sync_PulseRx(u8 pre,u8 now){ if(!PEin()){//每次下降沿开始测 Sync_Pulse_begin=;//开始检测同步脉冲 }else if(Sync_Pulse_begin==&&(pre==)&&(now==)){//满足条件则判断出时间脉冲 Sync_Pulse_begin=;//同步成功将同步码关掉
rx433_begin=;//正式开始传输数据
rxbit=;//将数据位数清零
firstbit=;//置一等待下个跳变正式开始
return success;
}else{ Sync_Pulse_begin=;//不是脉冲置0
return synerror;
}
return rxbit; } /*
@Description 判断逻辑0和1
@pre 之前时间段数
@now 现在时间段数
@return rxerror 接收超位
*/
u8 RX433_Bit(u8 pre,u8 now){
if(firstbit==){
firstbit=;//此步骤防止引导完成后直接进入此函数
}else if(rx433_begin==&&PEin()){//上升沿检测 if(rxbit>){//能加到24 说明一帧数据获取到了
rxbit=;//归零
rx433_begin=;//归零 及下一组做准备 } if(now==&&pre==){//逻辑0
Rx433bit[rxbit]=;
rxbit++;
}else if(now==&&pre==){//逻辑1
Rx433bit[rxbit]=;
rxbit++;
}else{
//跑飞
rx433_begin=;
rxbit=;
return rxerror;
} return rxbit-;
}
return ;
}

外部中断处理函数,常常被触发,因为接收各种杂波,但进入不了关键的处理函数。

//先判断同步脉冲
//如果是同步脉冲,begin开启判断数据接收并判断情况情况
//如果数据接收位超过预期24位,数据位数接收超量(状态)
//如果从一半开始接收,无视这一段,从下一段开始
void EXTI9_5_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line7)!=RESET)
{
unsigned char skip_index = ;//这次几个数据位
unsigned char skip_pervious_index=;//之前几个数据位
unsigned long long now_time=sys_micros();//此刻时间
unsigned short interval_time = now_time - rx433_previous_time;//计算一个电平状态持续的时长
rx433_previous_time = now_time;//为下次计算时长做准备
skip_index = (interval_time/);//得出某个电平持续时长的倍数 计算出几段高或低电平
skip_pervious_index=(interval_previous_time/);//同上 不过是前一次的 Sync_PulseRx(skip_pervious_index,skip_index);//同步脉冲
RX433_Bit(skip_pervious_index,skip_index);//数据位 if(interval_time<){
interval_previous_time = interval_time; }else{
interval_previous_time = ; }
EXTI_ClearITPendingBit(EXTI_Line7);//清除中断挂起标志位 } }

STM32 EV1527无线通信(433)的更多相关文章

  1. [stm32] NRF24L01+USART搞定有线和无线通信

    前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...

  2. A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包

    A7139 拥有电磁波唤醒以及10mW的发射功率,很easy实现长距离通信,眼下測试有障碍物能够轻松达到300m以上. 通过几天的调试,眼下能够发送随意大小的数据包,大小为1-16KB.所有使用中断收 ...

  3. 第4章 初识STM32

    第4章     初识STM32 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...

  4. stm32通信概述

    本文提到的内容有以下几个方面: 通信概述 串口通信 I2C通信 CAN通信 SPI通信 I2S通信 USB通信 其他通信 一.通信概述 按照数据传送方式分: 串行通信(一条数据线.适合远距离传输.控制 ...

  5. 第4章 初识STM32—零死角玩转STM32-F429系列

    第4章     初识STM32 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资 ...

  6. stm32之通信

    本文提到的内容有以下几个方面: 通信概述 串口通信 I2C通信 CAN通信 SPI通信 I2S通信 USB通信 其他通信 一.通信概述 按照数据传送方式分: 串行通信(一条数据线.适合远距离传输.控制 ...

  7. STM32与物联网01-ESP8266基本操作

    ESP8266物联网简介 ESP8266简介 ESP8266 是上海乐鑫公司开发的一款具有 WiFi 功能的控制芯片,它带有完整的 TCP/IP 协议栈,因此可以用作物联网开发. ESP8266 本身 ...

  8. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  9. [转] STM32各种时钟的区别

    [原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...

随机推荐

  1. openjudge1.3

    目录 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1 ...

  2. ffmpeg结合SDL编写播放器

    创建播放窗口 SDL_Surface *screen = NULL; screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->heig ...

  3. ftp使用

    1.pom文件中添加依赖 <!-- ftp使用 --><dependency> <groupId>commons-net</groupId> <a ...

  4. 为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)

    针对sudo apt-get install命令安装的nginx(默认会有/etc/nginx/conf.d) sudo apt-get install nginx 生成密码 printf " ...

  5. Pandas 与 Numpy 常用方法总结

    Lambda 函数实现 简单的说,lambda 就是一个函数,但是这个函数没有名字,所以我们介绍一下这个函数的调用形式,参数与返回值的实现. lambda 的格式如下: lambda [arg1 [, ...

  6. stream_context_create解析

    (PHP 4 >= 4.3.0, PHP 5, PHP 7) stream_context_create — 创建资源流上下文 说明¶ stream_context_create ([ arra ...

  7. vue+elementui项目打包后样式变化问题

    博主刚刚解决了index.html空白问题,刚打开项目页面又发现了样式出现了大问题,样式与开发版本有很大不同,有些样式没有生效.利用搜索引擎,找到了问题所在以及解决办法:main.js中的引入顺序决定 ...

  8. vmware vsphere各版本差别,及各套件差别

    最近要开始全面支持虚拟化了,客户私有云环境用的多的为vmware vsphere,特地恶补下vmware vsphere的各个差别. 首先是vSphere,ESXi和vCenter 的区别. ESXi ...

  9. Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项。系统找不到指定的文件。

    ylbtech-Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项.系统找不到指定的文件. 1.返回顶部 1. “/”应用程序中的服务器错误. 分析器错误 说 ...

  10. 基于redis5的session共享:【redis 5.x集群应用研究】

    基于springsession构建一个session共享的模块. 这里,基于redis的集群(Redis-5.0.3版本),为了解决整个物联网平台的各个子系统之间共享session需求,且方便各个子系 ...