在线时间21 小时
UID390132
ST金币137
蝴蝶豆2
注册时间2012-9-19
该用户从未签到
中级会员
- 最后登录
- 2021-3-26
|
本帖最后由 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();
}
附件是整个工程
|
|