搜索
查看: 1809|回复: 1

[原创] 基于stm8s外部中断的无线接收程序

[复制链接]

该用户从未签到

2

主题

77

帖子

2

蝴蝶豆

中级会员

最后登录
2021-3-26
发表于 2016-5-25 15:26:17 | 显示全部楼层 |阅读模式
本帖最后由 Mr.R 于 2016-5-25 15:27 编辑

前段时间用stvd写了一个超外差433无线接收程序。调试已经成功,但是还存在一些疑惑的地方,在此抛砖引玉,希望大家指正硬件上用PD5来接收数据,定时器2测量脉宽

有遇到以下几个问题:
1、PD5配置为中断模式,在中断中通过检测PD5d电平来确定此次进入的是上升沿中断还是下降沿

但是在仿真过程中发现进入中断操作GPIOD_CR2或者关闭总中断时会造成PD5口的输入寄存器的数据发生跳变,造成无法准确得知是什么边沿触发的中断。
为了解决这个问题,我改为通过检测EXTI_CR的设置来确定到底是什么边沿触发的中断。测试这样修改后接受就变得可靠多了。

2、除了用到TIM2还用到TIM4,TIM4里面处理的程序长了点后发现测得的无线脉冲长度不准确了。将一部分程序从TIM4中断中移到主函数就解决了这个问题。问题是我并没有设置中断优先级,默认的优先级应该是中断号小的优先级更高,那么PD中断的优先级是高于TIM4的。因此我搞不清到底是什么原因导致这个问题的。

另外要吐槽一下stvd的界面还是需要改进改进……受不了之后我就用SI写程序,
但是调试程序还是离不开stvd……打断点一定要停止运行才能打,无法返回上个光标位置……
中断程序
@far @interrupt void EXTI_PORTD_IRQHandler (void)//for wireless receive
{
        static u8 bit_cnt,new_addrflg,learn_cnt;// 无线接收位数
        static u16 H_data_cnt,L_data_cnt;//脉冲宽度

        static u32 R_DATA;
        static union WireAddr
        {
                u32 data32bit;
                u8  data8bit[4];
        }W_Addr,N_Addr,temp;
        /////////
        disableInterrupts();nop();nop();
        GPIOD->CR2&=~0X20;
        nop();nop();nop();nop();
        ////////
        
        nop();nop();nop();nop();nop();nop();

        if(EXTI->CR1== 0x40)//rise edge
        {        
                EXTI->CR1= 0x80;//0下降沿&低电平  1上升沿  2合陆笛? 3上升&下降 PD上升沿 PA下降
                GPIOD->CR2|=0X20;
                ///////////////////////////
        
                        /**************/
                temp.data32bit<<=1;
                L_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;//read L time
                Init_Timer2();
               
                        ///////////////
                if(  L_data_cnt<1800 && L_data_cnt>1500  )//一个bit 周期
                {//bit =0  H`1200  bit=1 H:400
                        if(H_data_cnt>300&& H_data_cnt<500)//bit=1高电平时间
                        {
                                bit_cnt++;
                        }
                        else if(H_data_cnt>1100&& H_data_cnt<1300)//bit= 0 高电平时间
                        {
                                temp.data32bit|=1;
                                bit_cnt++;
                        }
                        else//无效信号
                        {
                                bit_cnt=0;
                                temp.data32bit=0;
                        }
                }
                else//无效信号
                {                        
                        bit_cnt=0;
                        temp.data32bit=0;
                }
                        /////////////////////////////////
                if(bit_cnt==24)
                {                        
                        if(temp.data8bit[3]==0x0b)//mode+ key as learn key
                        {/////用于对码
                                if(!new_addrflg)//first power key get new addr
                                {
                                        N_Addr.data8bit[1]=temp.data8bit[1];
                                        N_Addr.data8bit[2]=temp.data8bit[2];//save new addr
                                        new_addrflg=1;
                                }
                                else
                                {
                                        if(N_Addr.data8bit[1]==temp.data8bit[1] && N_Addr.data8bit[2]==temp.data8bit[2])
                                        {
                                                if(++learn_cnt>50)//长按时间=【(10+(1.2+0.4)x24】x50 ms
                                                {
                                                        learn_cnt=0;
                                                        new_addrflg=0;
                                                        W_Addr.data8bit[1]=N_Addr.data8bit[1];
                                                        W_Addr.data8bit[2]=N_Addr.data8bit[2];
                                                        ChgCD;
                                                        ChgJG;
                                                        delayms(500);
                                                        ChgCD;
                                                        ChgJG;
                                                }
                                        }else
                                        {
                                                new_addrflg=0;
                                        }
                                }
                        }else
                        {
                                new_addrflg=0;
                        }
                        if( temp.data8bit[1]==W_Addr.data8bit[1] &&  temp.data8bit[2]==W_Addr.data8bit[2] && WL_flg)
                        {        
                                switch(temp.data8bit[3])
                                {//按键处理程序
                                       
                                }
                        }
                }        
        }
        else if(EXTI->CR1== 0x80)//falling edge read H time
        {
               
                EXTI->CR1= 0x40;//0:下降沿&低电平 1:上升沿2:下降沿 3:上升&下降 PD上升沿 PA下降
                GPIOD->CR2|=0X20;
                /////////////////////
               
                /******/
                H_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;////读无线H电平时间
               
        }
        
        enableInterrupts();        
}

附件是整个工程

wireless.rar

93.82 KB, 下载次数: 28, 下载积分: ST金币 -1

回复

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2018-1-1
发表于 2017-11-30 17:39:42 | 显示全部楼层
谢了,正在学习rf.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-8 00:26 , Processed in 0.157643 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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