|
本帖最后由 Mr.R 于 2016-5-25 15:27 编辑 4 d* q4 q& | k' h- D+ H0 U7 ^( O 前段时间用stvd写了一个超外差433无线接收程序。调试已经成功,但是还存在一些疑惑的地方,在此抛砖引玉,希望大家指正硬件上用PD5来接收数据,定时器2测量脉宽 有遇到以下几个问题: 1、PD5配置为中断模式,在中断中通过检测PD5d电平来确定此次进入的是上升沿中断还是下降沿 2 Z/ z. Y5 l8 `5 I$ z 但是在仿真过程中发现进入中断操作GPIOD_CR2或者关闭总中断时会造成PD5口的输入寄存器的数据发生跳变,造成无法准确得知是什么边沿触发的中断。 为了解决这个问题,我改为通过检测EXTI_CR的设置来确定到底是什么边沿触发的中断。测试这样修改后接受就变得可靠多了。! i$ f# C& j a# N$ m 2、除了用到TIM2还用到TIM4,TIM4里面处理的程序长了点后发现测得的无线脉冲长度不准确了。将一部分程序从TIM4中断中移到主函数就解决了这个问题。问题是我并没有设置中断优先级,默认的优先级应该是中断号小的优先级更高,那么PD中断的优先级是高于TIM4的。因此我搞不清到底是什么原因导致这个问题的。# s4 t8 S3 R9 K' q; p c# M ! r1 J( m1 @' V9 h8 W P3 I' d: e) a 另外要吐槽一下stvd的界面还是需要改进改进……受不了之后我就用SI写程序, 但是调试程序还是离不开stvd……打断点一定要停止运行才能打,无法返回上个光标位置…… 中断程序 @far @interrupt void EXTI_PORTD_IRQHandler (void)//for wireless receive" {6 e% I v& G$ m9 `2 a0 F* x {# o; Z0 _7 E4 d2 H2 B$ ~ static u8 bit_cnt,new_addrflg,learn_cnt;// 无线接收位数 static u16 H_data_cnt,L_data_cnt;//脉冲宽度 - d' {$ g/ I, I5 v static u32 R_DATA; static union WireAddr: \: a" i* {6 ]; |9 Z { u32 data32bit; r1 L5 z+ k8 E y$ p r u8 data8bit[4];0 r' ?# X4 I, n' Y( b7 o }W_Addr,N_Addr,temp;; r* W$ j: j$ B8 ~- d ///////// disableInterrupts();nop();nop(); GPIOD->CR2&=~0X20; nop();nop();nop();nop(); ////////0 D, S2 ^( |5 E+ d 1 P% x# h, |8 e9 m/ d& U3 M nop();nop();nop();nop();nop();nop(); if(EXTI->CR1== 0x40)//rise edge' O3 P3 ]+ B$ q0 w0 ^ { 9 A' a5 Z7 u& o4 c EXTI->CR1= 0x80;//0下降沿&低电平 1上升沿 2合陆笛? 3上升&下降 PD上升沿 PA下降 GPIOD->CR2|=0X20;; B& ^0 \) p* B% f: S' F% _% u ///////////////////////////( ]6 N7 @2 p3 e- [: F' _ e8 c /**************/ temp.data32bit<<=1; L_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;//read L time/ s/ i) m' B0 h+ u' P% l Init_Timer2(); 4 D: c! s! |7 w0 I3 }# S% H ///////////////3 |6 p- k8 x" _9 H& ? 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 高电平时间3 v" q4 T: |* [# r {& N/ p4 I4 z. y8 s7 f( v temp.data32bit|=1; bit_cnt++;/ B) u/ K' Q3 ?* v }6 G) }( t3 T( } else//无效信号& y: f: a! G9 _9 K! m6 s3 j* p { bit_cnt=0; temp.data32bit=0; }6 y+ ]3 W+ J4 ] }# B) [* L' w. E else//无效信号9 {: S) T" U: j { + S7 |- S$ B5 P$ y) V2 r bit_cnt=0; temp.data32bit=0;8 }2 A2 o- D7 q } /////////////////////////////////& P, a# H( C+ l7 t if(bit_cnt==24) { : S3 T. g: e2 H$ n5 D if(temp.data8bit[3]==0x0b)//mode+ key as learn key {/////用于对码 if(!new_addrflg)//first power key get new addr$ p# {& {9 F7 b1 a {' k5 m! \7 m; M: I- D) \* x3 q N_Addr.data8bit[1]=temp.data8bit[1];6 V- S2 |1 T8 E. s, L$ [ N_Addr.data8bit[2]=temp.data8bit[2];//save new addr new_addrflg=1;( m( a% S( I7 `8 W7 a3 V } Q0 B- x' o e/ L- P6 z% G else# n z3 d2 E3 a$ w6 b {9 V6 d! q$ P$ B if(N_Addr.data8bit[1]==temp.data8bit[1] && N_Addr.data8bit[2]==temp.data8bit[2])! @* z- F( f+ d { if(++learn_cnt>50)//长按时间=【(10+(1.2+0.4)x24】x50 ms { learn_cnt=0;2 P7 ?) i+ n& `3 ?' v9 P new_addrflg=0; W_Addr.data8bit[1]=N_Addr.data8bit[1]; r) B% s8 ?. r. ? W_Addr.data8bit[2]=N_Addr.data8bit[2]; ChgCD;5 p+ @" I, B5 y ChgJG; delayms(500);7 i! C& s% y4 H% l4 @ ChgCD; ChgJG;. s9 d$ s$ {; y* l" D } }else7 q3 g, M- y+ N( u { C* l+ q5 P% b( o5 F. B new_addrflg=0;' e6 ~8 l5 y& y. Z } } y* W6 y+ @2 t1 K }else { new_addrflg=0;; G! Q- _+ k* k) c } if( temp.data8bit[1]==W_Addr.data8bit[1] && temp.data8bit[2]==W_Addr.data8bit[2] && WL_flg)0 {! D# I- `: P" \5 p { switch(temp.data8bit[3])$ O: X, a2 W; i4 ?# T2 \3 K* d {//按键处理程序( U9 _9 m, u t# L' P( w, f4 M }7 b0 g/ x0 T3 x$ G; R } } % q0 ~) k# r6 z } else if(EXTI->CR1== 0x80)//falling edge read H time4 g3 s) w/ T3 ?/ d5 x3 N( v" x { EXTI->CR1= 0x40;//0:下降沿&低电平 1:上升沿2:下降沿 3:上升&下降 PD上升沿 PA下降 GPIOD->CR2|=0X20;9 l, T1 n4 p# M C& @$ | ///////////////////// /******/6 ]7 H! D. Y! e$ R5 n, o4 z H_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;////读无线H电平时间+ T7 H9 v# U/ n, M } enableInterrupts(); } $ i- Z/ [6 o. q4 N 附件是整个工程 |
wireless.rar
下载93.82 KB, 下载次数: 28
| 谢了,正在学习rf. |
微信公众号
手机版