• 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. zabbix_server [22842]: cannot open log: cannot create semaphore set: [28] No space left on device

    zabbix server服务没启动,查看日志显示 zabbix_server [22842]: cannot open log: cannot create semaphore set: [28] ...

  2. vcenter监控

    在vcenter上配置好用户名密码和url即可使用自动发现自动发现vmware

  3. Promise对异步编程的贡献以及基本API了解

    异步: 核心: 现在运行的部分和将来运行的部分之间的关系 常用方案: 从现在到将来的等待,通常使用一个回调函数在结果返回时得到结果 控制台(因为console族是由宿主环境即游览器实现的)可能会使用异 ...

  4. uni-app 实现分享生成图片

    <template> <view> <view class="personal_li" @click="shareClick"&g ...

  5. wireshark安装和使用 -基础篇

    使用前知道: wireshark版本:3.0.2 使用wireshark的目的是因为它支持linux/windows/mac,而且新版本是开源免费的.还有一个原因是使用Fiddler不支持mac.截止 ...

  6. 远程桌面无法连接 提示不支持FIPS安全级别的解决方法

    远程桌面可以通过网络连接到另一台电脑进行操作,可以方便在家操作公司电脑.但是到了这个新公司却出现了一个问题,提示客户端无法建立跟远程计算机的连接,我的天,要命了. 远程桌面无法连接错误提示 仔细一看说 ...

  7. python: isdigit int float 使用

    >>> num1 = '2.0' >>> print num1.isdigit() False >>> num2 = ' >>> ...

  8. 冰多多团队-第八次Scrum例会

    冰多多团队-第八次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj debug, IAT debug, IAT 牛雅哲 将语音部分迁移到IatDemo上,去将科大讯飞的语音听写dem ...

  9. Oracle数据库备份、灾备的23个常见问题

    为了最大限度保障数据的安全性,同时能在不可预计灾难的情况下保证数据的快速恢复,需要根据数据的类型和重要程度制定相应的备份和恢复方案.在这个过程中,DBA的职责就是要保证数据库(其它数据由其它岗位负责) ...

  10. Armbian编译以及定制

    Armbian项目地址 Github: https://github.com/armbian/build Armbian for TV Box 项目地址 Github: https://github. ...