前提条件:50us的定时器中断
还未完善变量名、相关注释等
#define RF_RECV_PIN RF_DECODE_PIN // 接收RF信号的引脚
static u32 __rf_data = 0xFFFFFFFF; // 存放接收到的rf数据(在定时器中断中使用)
volatile u32 rf_data = 0xFFFFFFFF; // 存放接收到的rf数据
volatile u32 rf_addr = 0xFFFFFFFF; // 存放遥控器的地址 (后续可能要改成支持多个遥控器,可能要换成数组来存放)
void 中断服务函数(void)
{
// 清除中断标志,屏蔽其他中断(可选)
static bool bit_end; // 可以换成只有1bit的变量
static u8 Pluse_H_cnt, Pluse_L_cnt; // 高低电平计数
static u8 rf_bit_cnt; // 数据位计数(总共应为24bits)
static bool f_levelbuf; // (可以换成只有1bit的变量)
bool flagerror = 0; // 标志位,表示接收错误(可以换成只有1bit的变量)
bool flagsuccess = 0; // 标志位(可以换成只有1bit的变量)
#define MAX_PULSE 30
#define MIN_PULSE 3 // 最小脉宽不应小于滤波宽度
#define FILTER_CNT 0X07 // 滤波因数 0b_0111
static u8 filter;
static bool f_level;
filter <<= 1;
// 检测IO是否为高电平
if (gpio_read(RF_RECV_PIN))
filter |= 0x01;
filter &= FILTER_CNT;
if (filter == FILTER_CNT)
{
f_level = 1; // 高电平
}
else if (filter == 0x00)
{
f_level = 0; // 低电平
}
if (f_level) // 高电平判断(如果当前是高电平)
{
if (bit_end) // 一位结束
{
bit_end = 0;
if (Pluse_L_cnt >= MIN_PULSE)
{
__rf_data <<= 1;
if (Pluse_H_cnt > Pluse_L_cnt)
{
__rf_data |= 0x01;
}
else
{
__rf_data &= ~(0x01);
}
Pluse_H_cnt = 0;
}
else // 低电平小于150us认为出错
{
flagerror = 1;
}
}
else
{
f_levelbuf = 1;
Pluse_H_cnt++;
if (Pluse_H_cnt >= MAX_PULSE)
{
flagerror = 1;
}
Pluse_L_cnt = 0;
}
}
else // 低电平判断(如果当前是低电平)
{
Pluse_L_cnt++;
if (Pluse_L_cnt >= MAX_PULSE) // 低电平超出最大值
{
if (rf_bit_cnt != 25)
{
flagerror = 1;
__rf_data = 0xFFFFFFFF;
// printf("rf decode err \n");
}
else // 解码成功
{
__rf_data &= 0xFFFFFF; // 只保留低24位的数据,清除之前的数据残留
flagsuccess = 1; //
// 可以在这里给相应的标志位置一,或是发送消息给到其他线程:
}
}
else
{
if (f_levelbuf)
{
f_levelbuf = 0;
Pluse_L_cnt = 0;
bit_end = 1;
if (Pluse_H_cnt >= MIN_PULSE)
{
rf_bit_cnt++;
if (rf_bit_cnt >= 26)
{
flagerror = 1;
}
}
else
{
flagerror = 1;
}
}
}
}
if (flagerror || flagsuccess) // 出错/收尾处理
{
rf_bit_cnt = 0;
Pluse_H_cnt = 0;
Pluse_L_cnt = 0;
f_levelbuf = 0;
bit_end = 0;
}
// 退出中断
}