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

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

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

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

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

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

从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息
我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话,要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中,其中我们更深入地研究了与遣返相关的成本和节省,以便您更轻松地进行自己的分析。…...

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

最长公共子串的问题(正常方法和矩阵法,动态规划)
题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...

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

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上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系统 学习笔记
记得开插件: 1、锚点场(构造场) 在锚点场范围内的物体静止且不被其他力场损坏 需要在Geometry Collection的初始化场把构造场设置过去 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止行为和模拟物…...

MkDocs 部署指南
简介 MkDocs 可以同时编译多个 markdown 文件,形成书籍一样的文件。有多种主题供你选择,很适合项目使用。 MkDocs 是快速,简单和华丽的静态网站生成器,可以构建项目文档。文档源文件在 Markdown 编写,使用单个 YAML …...
【Java 设计模式】行为型之访问者模式
文章目录 1. 定义2. 应用场景3. 代码实现结语 访问者模式(Visitor Pattern)是一种行为型设计模式,用于在不改变被访问元素的类的前提下定义对这些元素的新操作。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可以灵…...

堆和堆排序【数据结构】
目录 一、堆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升级订阅详细指南
前言:为什么要升级GPT4.0,下图是来自GPT4.0的官方回答,可以看出,GPT4无愧于是一个大版本升级的。 一、视频教程 记录了普通用户使用WildCrad从GPT3.5升级到4.0的全部过程,感兴趣可以前往观看:https://www.…...

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1
接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文参考以下文章: VirtIO实现原理——PCI基础 VirtIO实现原理——virtblk设备初始化 特此致谢! 本文对…...
《动手学深度学习(PyTorch版)》笔记5
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过,…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...