OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4724|回复: 7

使用STM32F103进行315MHz无线解码程序

[复制链接]

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-11-14 23:50:39 | 显示全部楼层 |阅读模式
本帖最后由 DongInker 于 2016-11-15 00:11 编辑

[mw_shl_code=c,true]
/*
*   Rxd315.c
*
*   Auther     : Inker.Dong
*   Create Date: 2016/10/11
*   Address    : FuZhou China
*   Function   : 315MHz Wire Decode
*   Debug Note


* 每一位可以用2位表示 0:00 1:11 f:01
* 按键值一般为0x03,0x0C,0x30,0xC0
* PT2262 地址可自设     组合:3^12
* EV1527 地址不可设     组合:2^24
*/

#define SYSLOG 0

#include "InkerSys.h"
#include "Rxd315.h"

#define TIM_BUF_NUM (64)
/************************************************************************/
/*      static Variables                                                */
/************************************************************************/
typedef const struct cRxd315_Stat_s
{
int                cNum;
u8                 cPulseNum;
u8                 cR3Sync;
u8                 cR3_OT;
u16                c0UpTimuS;
u16                c0DnTimuS;
u16                c1UpTimuS;
u16                c1DnTimuS;
int               (*Get315Func)(void);
void              (*SetTimFunc)(u32);
u32               (*GetTimFunc)(void);
void              (*IntEnFunc)(int);
}tcRxd315_Stat_t, *ptcRxd315_Stat_t;


static tcRxd315_Stat_t cRxd315Stat = {
1,
50,  //脉冲个数        
13,  //启动信号持续时间  7*1mS
64,  //接收数据超时     64*1mS
1800,// 识别低电平时间上限 uS
1200,// 识别低电平时间下限 uS
850, // 识别高电平时间上限 uS
250, // 识别高电平时间下限 uS
GetRxd315,// 读取315MHz管脚电平状态
SetSysTick,// 写定时计数值
GetSysTick,// 读定时计数值
SetExti4En};// 设置315MHz接收管脚中断开启或关闭


static Inst_t Rxd315Inst = NULL;

/************************************************************************/
/*      Local Functions                                                 */
/************************************************************************/

typedef struct Rxd315_Stat_s
{
        int             Val;
}Rxd315_Stat_t, *pRxd315_Stat_t;

typedef struct Class_s{
        Inst_t*           pInst;
        tcRxd315_Stat_t  *pStat;

        int                PrfClass;
        u16                Rxd315Cnt;
        vu8                R315State;
        vu8                R3Cnt1mS;

        vu16               R3Success;
        u8                 R3OkFlag;
        u8                 RxdVal[TIM_BUF_NUM];
        u32                TimBuf[TIM_BUF_NUM];// >48
        vu16               TimBufCnt;

        u32                RxdData;
        Rxd315_Stat_t    *pRxd315;
} Class_t;


static Bool sRxd315Open(Inst_t* pInst,tcRxd315_Stat_t* pStat)
{
        LOG_FUNC_NAME("Rxd315Open")
        Class_t *pObj = (Class_t *)*pInst;
        int i;
        
        if( pObj ) return 1;
        assert(pStat);

        pObj = (Class_t*)Malloc(sizeof(Class_t));
    assert(pObj);
        *pInst = (Inst_t)pObj;
        LOG_TXT1(("[%0.4X]", *pInst));

        pObj->pStat             = pStat;
        pObj->pInst             = pInst;

        pObj->PrfClass  = 0;
        pObj->Rxd315Cnt = 0;
        pObj->R315State = 1;
        pObj->R3Cnt1mS  = 0;
        pObj->R3Success = 0;
        pObj->R3OkFlag  = 0;
        pObj->pRxd315     = Calloc(pObj->pStat->cNum,sizeof(Rxd315_Stat_t));
        assert(pObj->pRxd315);

        for(i=0;i<pObj->pStat->cNum;i++)
                {
                pObj->pRxd315.Val = 0;
                }

        if(pObj->pStat->IntEnFunc)
                pObj->pStat->IntEnFunc(FALSE);
        
        return TRUE;
}

#if 0
/*关闭*/
static Bool sRxd315Close(Inst_t Inst)
{
        LOG_FUNC_NAME("Rxd315Close")
    Class_t*  pObj = (Class_t*)Inst;

    /* Check for correct instance */
    assert((Inst_t)pObj == *pObj->pInst);

        Free(pObj->pRxd315);
        
    /* Clean-up Instance */
    *pObj->pInst = (Inst_t)0;
    Free(pObj);
    return 0;
}
#endif

static void sRxd315Msg(Inst_t Inst)
{
        Class_t*  pObj = (Class_t*)Inst;
        
        DPRINTF(("Rxd315Prf:%d\r\n",pObj->PrfClass));
        DPRINTF(("R3Success:%d\r\n",pObj->R3Success));
        DPRINTF(("R315State:%d\r\n",pObj->R315State));
        DPRINTF(("TimBufCnt:%d\r\n",pObj->TimBufCnt));
        if(pObj->pStat->Get315Func)
                DPRINTF(("RxdIOState:%d\r\n",pObj->pStat->Get315Func()));

        DPRINTF(("RxdData:0X%lX\r\n",pObj->RxdData));
        pObj->R3Success = 0;
}

static void sRxd315PrfClass(Inst_t Inst,int val)
{
        Class_t*  pObj = (Class_t*)Inst;

        pObj->PrfClass = val;
}

static void sR315Decode(Inst_t Inst)
{
        Class_t*  pObj = (Class_t*)Inst;
        u16 i,Tim1uS;

        pObj->RxdData = 0;
        for(i=2;i<pObj->TimBufCnt;i+=2)
                {
                Tim1uS = (pObj->TimBuf[i-1] - pObj->TimBuf)/9;
                if((Tim1uS >= pObj->pStat->c1DnTimuS) && (Tim1uS <= pObj->pStat->c1UpTimuS))
                        pObj->RxdData |= 1;
                pObj->RxdData <<= 1;
                }
        pObj->RxdData >>= 1;
}

static void sIsrRxd315(Inst_t Inst)
{
        Class_t*  pObj = (Class_t*)Inst;
        
        if(pObj->R315State == 1)
                {
                pObj->RxdVal[pObj->TimBufCnt] = pObj->pStat->Get315Func();
                pObj->TimBuf[pObj->TimBufCnt] = pObj->pStat->GetTimFunc();
                pObj->TimBufCnt++;
                if(pObj->TimBufCnt >= pObj->pStat->cPulseNum)
                        {
                        pObj->pStat->IntEnFunc(FALSE);
                        pObj->R315State = 0;
                        pObj->R3Cnt1mS  = 0;
                        pObj->R3OkFlag  = 1;
                        pObj->R3Success++;
                        }
                }
        else
                {
                pObj->pStat->IntEnFunc(FALSE);
                pObj->R3Cnt1mS  = 0;
                }

        if(pObj->R3OkFlag)
                {
                pObj->R3OkFlag = 0;
                sR315Decode(Inst);
                }
}

static void sF1mSRxd315(Inst_t Inst)
{
        Class_t*  pObj = (Class_t*)Inst;

        if(pObj->pStat->Get315Func == NULL)
                return ;

        if(pObj->R315State == 0)
                {
                if(pObj->pStat->Get315Func())
                        {
                        pObj->R3Cnt1mS++;
                        if(pObj->R3Cnt1mS >= pObj->pStat->cR3Sync)
                                {
                                pObj->R3Cnt1mS  = 0;
                                pObj->R315State = 1;
                                pObj->TimBufCnt = 0;
                                pObj->pStat->SetTimFunc(0XFFFFFF);
                                pObj->pStat->IntEnFunc(TRUE);
                                }
                        }
                else
                        pObj->R3Cnt1mS = 0;
                }
        else
                {
                pObj->R3Cnt1mS++;
                if(pObj->R3Cnt1mS >= pObj->pStat->cR3_OT)// 超时处理
                        {
                        pObj->R3Cnt1mS  = 0;
                        pObj->R315State = 0;
                        pObj->pStat->IntEnFunc(FALSE);
                        }
                }
}
/************************************************************************/
/*      Timer Handler                                                   */
/************************************************************************/
#include         "timer.h"

static void sRxd315Handler(void)
{
        Class_t*  pObj = (Class_t*)Rxd315Inst;

        pObj->Rxd315Cnt++;
}

static Inst_t            Rxd315HandlerInst;
static Timer_Stat_t            sRxd315TimerStat       = { "Rxd315Handler",  6000, (Timer_Func_t)sRxd315Handler };

/************************************************************************/
/*      UFD Registration                                                */
/************************************************************************/
#ifdef _ENABLE_UFD

static void UfdRxd315Msg(void)
{
        if(Rxd315Inst != NULL)
                sRxd315Msg(Rxd315Inst);
}

static void UfdRxd315Prf(int val)
{
        if(Rxd315Inst != NULL)
                sRxd315PrfClass(Rxd315Inst,val);
}

#include    "UFD.h"
static UFD_CmdTbl_t sUFDCmdTbl[] =
{
UFD_HDR( ".Rxd315",    "Driver for Rxd315MHz" ),

UFD_RC0( "Rxd315Msg",                      UfdRxd315Msg,        NULL,                   "Rxd315 Message             R"),
UFD_RC1( "Rxd315Prf", I16,                  UfdRxd315Prf,        NULL,                                        "Rxd315 Printf Class <0..1> W"),

UFD_END()
};
#endif


/************************************************************************/
/*     Application Interface                                            */
/************************************************************************/
GLOBAL void ProF_1mS_Rxd315(void)
{
        if(Rxd315Inst)
                sF1mSRxd315(Rxd315Inst);
}

GLOBAL void IsrRxd315(void)
{
        if(Rxd315Inst)
                sIsrRxd315(Rxd315Inst);
}

GLOBAL void Rxd315Init(void)
{
        if(Rxd315Inst == NULL)
                {
                sRxd315Open(&Rxd315Inst,&cRxd315Stat);

                Timer_Open(&Rxd315HandlerInst, &sRxd315TimerStat);
                assert(Rxd315HandlerInst);
                Timer_Stop(Rxd315HandlerInst);

#ifdef _ENABLE_UFD
                UFD_AddCommandTable(sUFDCmdTbl);
#endif               
                }
}[/mw_shl_code][mw_shl_code=c,true]#ifndef _RXD315_H
#define _RXD315_H

GLOBAL void IsrRxd315(void);
// 315MHz接收管脚 判断同步信号时 启动IO中断
GLOBAL void ProF_1mS_Rxd315(void);
// 定时中断系统节拍 1mS执行一次
GLOBAL void Rxd315Init(void);
// 注册初始化


#endif[/mw_shl_code]



遥控器其中三个按键接收解码

遥控器其中三个按键接收解码

捕获其中一个按键时序

捕获其中一个按键时序
让我们的思维驾驭在电的速度之上!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
763
金钱
763
注册时间
2013-4-23
在线时间
119 小时
发表于 2016-11-15 08:37:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-15 08:43:29 | 显示全部楼层
一点注释都没有的程序,还是别发了,,看着费劲。。。
shop60994719.taobao.com
回复 支持 反对

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-15 16:48:34 | 显示全部楼层
贴主C语言功底挺好的,继续分享,此贴没看明白你要表达什么
回复 支持 反对

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-15 16:48:47 | 显示全部楼层
贴主C语言功底挺好的,继续分享,此贴没看明白你要表达什么
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2016-11-9
在线时间
38 小时
发表于 2016-11-15 17:16:29 | 显示全部楼层
本帖最后由 Xuedong 于 2016-11-15 17:19 编辑

无注释,看上去比较乱, Inst_t,Timer_Stat_t GetRxd315, SetSysTick, GetSysTick, SetExti4En
没有定义,不知道哪里来的,什么内容!
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-4-10
在线时间
7 小时
发表于 2018-7-3 17:56:32 | 显示全部楼层
学习一下,楼主可否给个联系方式
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-3 18:02:52 | 显示全部楼层
lunring 发表于 2018-7-3 17:56
学习一下,楼主可否给个联系方式

你需要怎么用?
我前天刚发了315M的帖子,
有问题可来交流。
http://www.openedv.com/forum.php ... d=274072&extra=
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 01:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表