当前位置: 首页 > 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下测试通过,…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...