
本帖最后由 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
谢了,正在学习rf. |