• 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. bzoj1935: [Shoi2007]Tree 园丁的烦恼lowbit 离散化

    链接 bzoj 最好不要去luogu,数据太水 思路 一个询问转化成四个矩阵,求起点\((0,0)到(x,y)\)的矩阵 离线处理,离散化掉y,x不用离散. 一行一行的求,每次处理完一行之后下一行的贡 ...

  2. GoCN每日新闻(2019-11-10)

    GoCN每日新闻(2019-11-10) 1. Go Netpoll I/O多路复用构建原生网络模型之源码深度解析 https://taohuawu.club/go-netpoll-io-multip ...

  3. SpringCloud:gateway网关模块启动报错

    1.错误信息 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with na ...

  4. return、reutrn false、e.preventDefault、e.stopPropagation、e.stopImmediatePropagation的区别

    return var i = function(){ return } console.log(i())//undefined return的主要作用是阻止函数继续执行,直接返回undefined r ...

  5. ubuntu之路——day17.3 简单的CNN和CNN的常用结构池化层

    来看上图的简单CNN: 从39x39x3的原始图像 不填充且步长为1的情况下经过3x3的10个filter卷积后 得到了 37x37x10的数据 不填充且步长为2的情况下经过5x5的20个filter ...

  6. 剑指offer:表示数值的字符串

    题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...

  7. win10 安装mysql 8.0.18 解决Navicat初次连接报错

    win10 安装mysql 8.0.18 解决Navicat初次连接报错 win10 安装mysql 8.0.18-winx64 一,先去官网下载mysql 安装包 https://dev.mysql ...

  8. servlet是什么?servlet到底是啥?

    #说实话 这个鬼servlet我听说过它好多年了,但是我真的不知道它到底是干啥用的.内心里总觉得这是个很复杂的,绝对是让人难以理解的东西,我真的感觉自己很抗拒它,不想知道,不想去了解.可是我还是不得不 ...

  9. 华为交换机在Telnet登录下自动显示接口信息

    因为用console连接交换机,默认是自动显示接口信息的,比如down掉一个接口后,会自动弹出接口被down掉的信息,但是在telnet连接下,默认是不显示这些信息的,需要开启后才可显示. 1.首先开 ...

  10. MySQL语句和命令大全

    前言 这里记录的是这两年学习工作过程中遇到的常用的 MySQL 语句和命令,部分是网上收集来的,出处已经不记得了,这里先谢过这些大佬.本文包括常见 SQL 语句,还有部分运维语句和命令,没有做详细的说 ...