当前位置: 首页 > news >正文

APT32F1023X 发送RF433处理

1.硬件电路--CMT2110A

需要注意:发射端MCU写数据的频率要匹配,如果MCU发送中时间最小脉宽是1MS,那么它的发送需要设置为1kbps。

 通过华普微USB调试工具+PC软件RFPDK_V1.55查看设置是否正确。

2.RF433发送

用到的发送和接收代码来自“无线433发送接收数据测试程序原理,有杂波解决方案_433无线协议-CSDN博客”,我在此基础做了修改方便识别。

发送波形:

空闲电平为 高

引导码 高1ms 低4ms

 逻辑1  高电平时间2ms 低电平时间 1ms
 逻辑0 高电平时间1ms 低电平时间 2ms

重复间隔时间 5ms

3.代码示例

rf.h文件

#ifndef _RF_H_
#define _RF_H_#include "apt32f102.h"
#define RF_DATA_INIT() 	    	{GPIO_Init(GPIOA0,8,0),GPIO_Write_High(GPIOA0,8);}
#define TX_GpioPIN_H			GPIO_Write_High(GPIOA0,8)
#define TX_GpioPIN_L			GPIO_Write_Low(GPIOA0,8)enum ENUM_RemoteNecStep
{RF_IDLE,RF_REPEATED,RF_HEAD,RF_SDATA,RF_SDATA_H
};  //状态表#define TX_FIRST_SEG_TIME_H  2		//逻辑1的高电平时间
#define TX_FIRST_SEG_TIME_L  1		//逻辑1的低电平时间#define TX_HEAD_FIRST_SEG_TIME 1		//引导码的低电平时间,基准时间1ms 
#define TX_HEAD_ALL_FRAME_TIME 4	#define TX_REPEAT_INTERVAL_TIME 5	    //Tx重复间隔时间#define TX_REPEAT_FIRST_SEG_TIME 1		//重复第一段时间
#define TX_REPEAT_ALL_FRAME_TIME 4		//Tx重复所有帧时间#define TX_ONE_BIT_ALL_FRAME_TIME TX_FIRST_SEG_TIME_L+TX_FIRST_SEG_TIME_H		//每帧时间Tx 1位  逻辑1或逻辑0的总时间typedef struct
{unsigned char State;				//步骤unsigned char TxEnable:1;			//发送使能位置	//可判断首字节是否为空替代unsigned char TxTimes;				//发送次数 		//可宏替代unsigned char TxTimesCnt;   		//次数计数器unsigned char TxBufLength;			//数据长度 		//可宏替代unsigned char TxCnt;				//高低电平计数、间隔时间计数unsigned char NowByte;				//现在字节unsigned char NowByteIndex;			//现在字节索引 unsigned char NowBit:1;unsigned char NowBitIndex;			unsigned char FirstSegTime;			//第一段时间unsigned char AllTime;				//总时间
}RemoteNecObject_t;extern RemoteNecObject_t  Rm433Info;#endif

  rf.c 

#include "rf.h"#define RF_PACKET_SIZE   4//6               		/* Define the payload size here */#define  TX_433_REPEAT_TIMES 			3		//发送次数
u8 TxBuf[RF_PACKET_SIZE];RemoteNecObject_t  Rm433Info = 
{0,//	unsigned char State;				//步骤0,//	unsigned char TxEnable:1;			//发送使能位置TX_433_REPEAT_TIMES,//	unsigned char TxTimes;				//发送次数 //可宏替代0,//	unsigned char TxTimesCnt;   		//次数计数器4,//	unsigned char TxBufLength;			//数据长度 //可宏替代0,//	unsigned char TxCnt;				//发送计数器	0,//	unsigned char NowByte;0,//	unsigned char NowByteIndex;0,//	unsigned char NowBit:1;0,//	unsigned char NowBitIndex;0,//	unsigned char FirstSegTime;			//第一段时间0,//	unsigned char AllTime;				//一位总时间
};static unsigned char user_create (unsigned char *p1, unsigned short int len)
{unsigned char sum = 0;	//用于存储累加和的值,初始值为0。for(;len > 0; len--)	{sum += *p1++;}//return sum;return (sum & 0xFF);	// 只保留最低的8位
}void rf_send_value(U8_T command,U8_T value)
{if(Rm433Info.TxEnable == 0 )			//发送是否繁忙{//memset(TxBuf,0x00,sizeof(TxBuf));TxBuf[0] = 0x55;TxBuf[1] = command;TxBuf[2] = value;TxBuf[3] = user_create(TxBuf,3);    //校验值;Rm433Info.State = RF_IDLE; 		 	//发送状态Rm433Info.TxEnable = 1;     		//使能发送}
}void Radio_Send_FixedLen(void)
{switch(Rm433Info.State){case RF_IDLE:   //空闲,等待使能if(Rm433Info.TxEnable){Rm433Info.State = RF_HEAD;								//headRm433Info.FirstSegTime = TX_HEAD_FIRST_SEG_TIME;		//Time/50			//所有时间  4.5msRm433Info.AllTime = TX_HEAD_ALL_FRAME_TIME;				//(Seg1+Seg2)/50 Rm433Info.TxCnt = 0;Rm433Info.NowByteIndex = 0;			//Buf[0]Rm433Info.NowBitIndex = 0;Rm433Info.TxTimesCnt = 0;			//次数:和重复段不同点}break;case RF_REPEATED:		// 重复码TX_GpioPIN_H;	if(++Rm433Info.TxCnt >= TX_REPEAT_INTERVAL_TIME) //间隔时间{Rm433Info.TxCnt = 0;//Rm433Info.State = RF_HEAD;Rm433Info.FirstSegTime = TX_REPEAT_FIRST_SEG_TIME;		//Time/50	此时间根据实际需求设置		Rm433Info.AllTime = TX_REPEAT_ALL_FRAME_TIME;			//(Seg1+Seg2)/50 //所有时间Rm433Info.TxCnt   = 0;Rm433Info.NowByteIndex = 0;			//Buf[0]Rm433Info.NowBitIndex  = 0;//}break;case RF_HEAD:			// 头码//设置第一段时间,总时间,发送一位使能,等待发送完成if(Rm433Info.TxCnt < Rm433Info.FirstSegTime){TX_GpioPIN_H ; // 预设}else{TX_GpioPIN_L ;}if(++Rm433Info.TxCnt > Rm433Info.AllTime){Rm433Info.TxCnt = 0;//TX_GpioPIN    = 1;				//此处会占用一个周期 /******************/Rm433Info.State  = RF_SDATA;  	    //发送完头码发送数据域Rm433Info.NowByte = TxBuf[Rm433Info.NowByteIndex++];// MSBRm433Info.NowBit  = (Rm433Info.NowByte&(0x80>>(Rm433Info.NowBitIndex++)))?1:0;// LSB  ---  NowBit = (NowByte&(0x01<<NowBitIndex++))?1:0;if(Rm433Info.NowBit)		//第一个bit牵引{Rm433Info.FirstSegTime = TX_FIRST_SEG_TIME_H;}else{Rm433Info.FirstSegTime = TX_FIRST_SEG_TIME_L;}Rm433Info.AllTime = TX_ONE_BIT_ALL_FRAME_TIME;    //之后不用改,Tx 每帧时间1位}break;case RF_SDATA:if(Rm433Info.TxCnt < Rm433Info.FirstSegTime){TX_GpioPIN_H;  // 预设}else{TX_GpioPIN_L;}if(++Rm433Info.TxCnt >= Rm433Info.AllTime)   //发送完 1 bit{Rm433Info.TxCnt = 0;//TX_GpioPIN = 1;		//Alltime -1 此行省略//此处会占用一个周期 /******************/if(Rm433Info.NowBitIndex <= 0x07)    //判断是否发送完 1 byte{// MSBRm433Info.NowBit = (Rm433Info.NowByte&(0x80>>(Rm433Info.NowBitIndex++)))?1:0;// LSB  --- Rm433Info.NowBit = (Rm433Info.NowByte&(0x01<<Rm433Info.NowBitIndex++))?1:0;if(Rm433Info.NowBit){Rm433Info.FirstSegTime = TX_FIRST_SEG_TIME_H;	//TX_LOGIC1_LOW_TIME}else{Rm433Info.FirstSegTime = TX_FIRST_SEG_TIME_L;	//TX_LOGIC0_LOW_TIME}}else  //Next Byte{Rm433Info.NowBitIndex = 0;if(Rm433Info.NowByteIndex < Rm433Info.TxBufLength)//判断是否发送完数据域{Rm433Info.NowByte = TxBuf[Rm433Info.NowByteIndex++];// MSBRm433Info.NowBit = (Rm433Info.NowByte&(0x80>>(Rm433Info.NowBitIndex++)))?1:0;// LSB  --- Rm433Info.NowBit = (Rm433Info.NowByte&(0x01<<Rm433Info.NowBitIndex++))?1:0;if(Rm433Info.NowBit){Rm433Info.FirstSegTime = TX_FIRST_SEG_TIME_H;}else{Rm433Info.FirstSegTime = TX_FIRST_SEG_TIME_L;}}	else{Rm433Info.TxTimesCnt++;if(Rm433Info.TxTimesCnt < Rm433Info.TxTimes)  	//次数{Rm433Info.State = RF_REPEATED;  			//发送重复码Rm433Info.TxCnt = 0;}else{//一次发送完成Rm433Info.State = RF_SDATA_H;}}}}//设置第一段时间,总时间,发送一位使能,等待发送完成,直到第N字节发送完成break;case RF_SDATA_H:Rm433Info.TxTimesCnt = 0;Rm433Info.State = RF_IDLE;					//空闲,等待使能//TX_GpioPIN_L;		TX_GpioPIN_H;					Rm433Info.TxEnable = 0;					//一次发送完成break;default:break;}
}

4.具体应用

GPT配置1ms 定时

void GPT0IntHandler(void) 
{// ISR content ...if((GPT0->MISR&GPT_INT_PEND)==GPT_INT_PEND)		//End of cycle interrupt {GPT0->ICR = GPT_INT_PEND;//定时器中断bFixTimer = 1;			//1msRadio_Send_FixedLen();	//RF发送函数	}
}

  调用发送函数,按键触发调用一次发送。

     rf_send_value(0x01,0x0A);        //模式1   等级10

相关文章:

APT32F1023X 发送RF433处理

1.硬件电路--CMT2110A 需要注意&#xff1a;发射端MCU写数据的频率要匹配&#xff0c;如果MCU发送中时间最小脉宽是1MS&#xff0c;那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…...

如何做一个合格的产品经理

如何做一个合格的产品经理 如何做一个合格的产品经理 一、了解市场需求 产品经理的核心工作之一是了解市场需求。为了确保产品的成功&#xff0c;你需要密切关注市场动态&#xff0c;了解用户需求&#xff0c;分析竞争对手&#xff0c;并预测未来趋势。通过市场调查、用户访…...

Git 入门精讲

我们为什么要学习git&#xff1f; 就当下的发展而言&#xff0c;只要你从事开发就一定会接触git。作为最强大的分布式版本控制器&#xff0c;git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统&#xff0c;每个开发者都可以在本地维护完整的代码库&#xff0c;可以离…...

论文笔记(四十二)Diff-DOPE: Differentiable Deep Object Pose Estimation

Diff-DOPE: Differentiable Deep Object Pose Estimation 文章概括摘要I. 介绍II. 相关工作III. DIFF-DOPEIV. 实验结果A. 实施细节和性能B. 准确性C. 机器人-摄像机校准 V. 结论VI. 致谢 文章概括 作者&#xff1a;Jonathan Tremblay, Bowen Wen, Valts Blukis, Balakumar Su…...

设计模式:简单工厂模式

工厂设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。工厂模式属于创建型模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离。 …...

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…...

从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息

我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话&#xff0c;要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中&#xff0c;其中我们更深入地研究了与遣返相关的成本和节省&#xff0c;以便您更轻松地进行自己的分析。…...

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…...

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...

Linux实验记录:使用LVM(逻辑卷管理器)

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 硬盘分好区或者部署为RAID磁盘阵列…...

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…...

【国产MCU】-认识CH32V307及开发环境搭建

认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…...

python flask request教程

request 一、传json1、resquest.get_data()与resquest.data2、request.get_json()3、request.json["imageURL"]二、传file1、request.files["file"]2、request.form["username"]3、request.form.get(username)与2等价,其他get()与[]也相同三、其…...

UE5 Chaos系统 学习笔记

记得开插件&#xff1a; 1、锚点场&#xff08;构造场&#xff09; 在锚点场范围内的物体静止且不被其他力场损坏 需要在Geometry Collection的初始化场把构造场设置过去 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止行为和模拟物…...

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件&#xff0c;形成书籍一样的文件。有多种主题供你选择&#xff0c;很适合项目使用。 MkDocs 是快速&#xff0c;简单和华丽的静态网站生成器&#xff0c;可以构建项目文档。文档源文件在 Markdown 编写&#xff0c;使用单个 YAML …...

【Java 设计模式】行为型之访问者模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在不改变被访问元素的类的前提下定义对这些元素的新操作。访问者模式将数据结构与作用于结构上的操作解耦&#xff0c;使得操作集合可以灵…...

堆和堆排序【数据结构】

目录 一、堆1. 堆的存储定义2. 初始化堆3. 销毁堆4. 堆的插入向上调整算法 5. 堆的删除向下调整算法 6. 获取堆顶数据7. 获取堆的数据个数8. 堆的判空 二、Gif演示三、 堆排序1. 堆排序(1) 建大堆(2) 排序 2.Topk问题 四、完整代码1.堆的代码Heap.cHeap.htest.c 2. 堆排序的代码…...

【全程录屏GPT3.5升级4.0】2024最新GPT4升级订阅详细指南

前言&#xff1a;为什么要升级GPT4.0&#xff0c;下图是来自GPT4.0的官方回答&#xff0c;可以看出&#xff0c;GPT4无愧于是一个大版本升级的。 一、视频教程 记录了普通用户使用WildCrad从GPT3.5升级到4.0的全部过程&#xff0c;感兴趣可以前往观看&#xff1a;https://www.…...

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;0&#xff09;—— 面试感悟与问题记录 本文参考以下文章&#xff1a; VirtIO实现原理——PCI基础 VirtIO实现原理——virtblk设备初始化 特此致谢&#xff01; 本文对…...

《动手学深度学习(PyTorch版)》笔记5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过,…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目

应用场景&#xff1a; 1、常规某个机器被钓鱼后门攻击后&#xff0c;我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后&#xff0c;我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集

基于深度学习YOLOv11的盲人障碍物目标检测&#xff1a;开启盲人出行新纪元 在全球范围内&#xff0c;盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步&#xff0c;许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中&#xff…...

MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程

文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天&#xff0c;您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间&#xff1f;随着影像记录成为日常习惯&…...