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)
关于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 = <