使用Ardunio STM32F103C8T6的中断来解码SYN500R信号

STM32F103C8T6 for Ardunio IDE

在某宝上购买的STM32F103C8T6最小核心板,通过网上的资料将其应用在Ardunio ID上。网上资料很多,最详细的https://blog.csdn.net/bobo184/article/details/84349184,但是他使用的不是某宝上的核心板。当你需要下载ST Microelectronics flash loader需要注册,然后到邮箱的邮件连接才能下载。不过有其他网友提到可以使用另外的烧写软件。在刷写时注意boot0与boot1的条线(两个都接高电平)。要不然总提示找不到芯片。完成后再将跳线都接低电平,下载安装STM32的库文件复制到Ardunio IDE的安装目录**\libraries**。就可以直接再Ardunio IDE中下载到STM32,除了资料少一些之外与Ardunio AVR之类的开发板没什么两样。

SYN500R芯片4支脚不带解码超外差接收模块

我这是公司之前定制的!不过某宝上也有这类模块。至于是315还是433其实并没多大关系。主要看遥控器的发射频率是否与接收器一致。我当时定制的也不清楚到底是哪个频率的了,所以只好把原来的解码芯片取掉了。然后将信号用引线接出来,输出引脚在SYN500的第10脚(DO)syn500R 输出引脚
照片-SYN500引脚实物在这里插入图片描述

关于STM32 在Ardunio 里使用中断事件获得信号脚的电平持续时间

在网上查了N多资料基本没怎么说如何使用中断的。最后只能使用笨办法。也许是我查找的方法不对吧。也或许英文资料应该是有的,只是我的水平不足而已。但也没关系了,最后还是解决了!在[WWW.ARDUNIO.CC]官网里的https://www.arduino.cc/reference/en/#functions 说明里找到了对应关于中断的解答。但是那也只是针对AVR的。没有对SMT32的说明。毕竟没有AVR和STM32的说明书。看来只好去测试了。先用一个红外线感应器来测试中断引脚。发现可以将某个引脚当中断使用,并不像AVR或51那样只能在特定的引脚才能使用中断。因为接收到的信号时单一的没有时钟同步。必须通过判断高低电平持续时间来决定传输的是0还是1。但是Ardunio只有pulseIn(pin, value, timeout)pulseIn(pin, value)它的功能是需要一直等待设定的高低电平后返回持续时间。这个看起来挺合适的。但是它反应好慢,导致我在这个过程中耽误了好长的时间(一天),之后参考了RCLSwitch库和IRremote库,总算能够读取到对应持续时间的高低电平了。

信号时序

信号时序

代码

#include <MapleFreeRTOS821.h>   //freeRTOS是嵌入式实时操作系
#include <EEPROM.h>

#define BOARD_LED_PIN PC13      //定义板载LED(呼吸灯,运行中信号)为数字引脚2  
#define SensorINPUT PB12        //定义感应器开关信号为数字引脚25
#define RC_Switch_INPUT PB13    //定义遥控接收信号为数字引脚26
#define StepMotorer_Dir PB14    //定义步进马达方向为数字引脚27
#define StepMotorer_En PB15     //定义步进马达使能开关为数字引脚28
#define StepMotorer_Step PA8    //定义步进马达步数频率为数字引脚29
#define Speeker_Out PB6         //蜂鸣器信号输出42

#define Stop 0                  //定义停止状态为0
#define Run 1                   //定义运行状态为1
#define CCW 0                   //定义正转状态为0
#define CW 1                    //定义反转状态为1

char SPEEK_MODE=0;              //蜂鸣器鸣叫模式:0:停止 1:嘀一声 2:嘀嘀两声 3:一长一短间隔1秒重复3次 4:低鸣一声

unsigned long Rc_Start_5MS_MinTime = 4800;
unsigned long Rc_Start_5MS_MaxTime = 5500;
unsigned long Rc_Start_600us_MinTime = 530;
unsigned long Rc_Start_600us_MaxTime = 750;
unsigned long Rc_Data_600us = 500;
unsigned long Rc_Data_200us = 240;

#define RC_GROUP_LEN 8 //8帧数据
#define RC_DATA_LEN  8 //八字节
#define RC_BIT_LEN   8 //八位
volatile unsigned char Rf_buf[RC_GROUP_LEN][RC_DATA_LEN + 1], INDEX_GROUP = 0, INDEX_BUFFER = 0;

unsigned long Rc_Signal_Time = 0;
unsigned long Elapsed_Time = 0;
char Rc_Signal_Pin_Level = LOW;
bool WeillRead[2] = {
   false};
unsigned long High_Level_Time = 0; 	//RC_Switch数据段的高低电平时间
unsigned long Low_Level_Time = 0; 	//RC_Switch数据段的高低电平时间
char Input_i = 0; 					//输入信号电平变化数组索引
char Do_Input_i = 0; 				//在任务中处理输入信号电平变化数组索引
unsigned char RC_BIT = 0;
uint16 AddressWrite = <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值