本帖最后由 Mr.R 于 2016-5-25 15:27 编辑 ; }5 Q% O3 x/ B 前段时间用stvd写了一个超外差433无线接收程序。调试已经成功,但是还存在一些疑惑的地方,在此抛砖引玉,希望大家指正硬件上用PD5来接收数据,定时器2测量脉宽 有遇到以下几个问题: 1、PD5配置为中断模式,在中断中通过检测PD5d电平来确定此次进入的是上升沿中断还是下降沿 , p% y6 g+ ~( g. y* m% f$ @1 X 但是在仿真过程中发现进入中断操作GPIOD_CR2或者关闭总中断时会造成PD5口的输入寄存器的数据发生跳变,造成无法准确得知是什么边沿触发的中断。4 \" B: d" I6 a; _( |: N 为了解决这个问题,我改为通过检测EXTI_CR的设置来确定到底是什么边沿触发的中断。测试这样修改后接受就变得可靠多了。 " _& F5 l9 b) D! } 2、除了用到TIM2还用到TIM4,TIM4里面处理的程序长了点后发现测得的无线脉冲长度不准确了。将一部分程序从TIM4中断中移到主函数就解决了这个问题。问题是我并没有设置中断优先级,默认的优先级应该是中断号小的优先级更高,那么PD中断的优先级是高于TIM4的。因此我搞不清到底是什么原因导致这个问题的。 8 x% S6 c7 k; W4 x# R. } 另外要吐槽一下stvd的界面还是需要改进改进……受不了之后我就用SI写程序, 但是调试程序还是离不开stvd……打断点一定要停止运行才能打,无法返回上个光标位置…… 中断程序) z5 r- M, X1 m; g4 s @far @interrupt void EXTI_PORTD_IRQHandler (void)//for wireless receive; Y* y. C) T Z { static u8 bit_cnt,new_addrflg,learn_cnt;// 无线接收位数% F& n% i3 E- n$ b static u16 H_data_cnt,L_data_cnt;//脉冲宽度 2 s) J. i' u/ u8 K4 y9 D; ^( P static u32 R_DATA; static union WireAddr {3 z. P" x" M$ m7 Y \! h2 N u32 data32bit;7 g; J/ \+ P l: X: f3 G' M+ R( s u8 data8bit[4]; }W_Addr,N_Addr,temp;5 x* u, K7 O3 \5 `' m! X+ J; Q6 u /////////$ t; f1 }* w# `) b. r1 F disableInterrupts();nop();nop();( R8 o" X. D1 N; | GPIOD->CR2&=~0X20; nop();nop();nop();nop();% _$ Z" i' Y2 O! J3 R4 x% d ////////2 v/ `6 A) n7 m+ q nop();nop();nop();nop();nop();nop();. e- L* ?: ^/ {) }1 c0 m , r( y0 x7 N& e1 ^& h if(EXTI->CR1== 0x40)//rise edge { ' \. I9 v3 {/ k% _: e" B EXTI->CR1= 0x80;//0下降沿&低电平 1上升沿 2合陆笛? 3上升&下降 PD上升沿 PA下降7 c& l$ y, t! O" I" E7 D+ q; {$ U GPIOD->CR2|=0X20;; w# J5 _) L6 x6 \% Z$ p5 u# y, M /////////////////////////// & f6 j% }; ]( n0 Y /**************/ temp.data32bit<<=1;& r3 I* d0 ]7 F L_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;//read L time Init_Timer2(); ///////////////- w$ ?% q" d. n, H! P if( L_data_cnt<1800 && L_data_cnt>1500 )//一个bit 周期. z- D1 F' e7 \, H {//bit =0 H`1200 bit=1 H:400 if(H_data_cnt>300&& H_data_cnt<500)//bit=1高电平时间 { a( x+ D& w# j) c( j/ A# z bit_cnt++;4 Q- e2 F8 _6 P } else if(H_data_cnt>1100&& H_data_cnt<1300)//bit= 0 高电平时间* |; J/ K4 f; n: H' |4 Z/ @ {- p( p6 O0 d3 g7 Z. M temp.data32bit|=1; bit_cnt++; }" S1 T( P/ A8 j' S else//无效信号. K" c! x5 @4 l# V/ A9 { {$ T# F8 ]$ l: u3 X+ u bit_cnt=0; temp.data32bit=0;6 U X/ p8 c% s6 j3 d }8 a/ t5 f, Z- [ }9 d; m+ O, {1 Q: C' `' A- I/ V* V else//无效信号7 V% J" m" g6 f { 2 }+ w# X9 o M% n3 i bit_cnt=0; temp.data32bit=0;3 W- [2 i! N- ^1 s6 { }# O7 C% A+ n2 O6 v6 S/ Q /////////////////////////////////5 R: }% U8 D) j6 V3 Q9 k( T$ | if(bit_cnt==24)/ [' N+ a% Q* [( L8 m { if(temp.data8bit[3]==0x0b)//mode+ key as learn key) I, O, O3 e1 B" Y/ A$ x: U {/////用于对码: q' @ K( p' _. O; f if(!new_addrflg)//first power key get new addr3 x/ Q$ U% x1 @" }( t6 y {1 ` Q# \, Z0 ?9 V, |' l+ d N_Addr.data8bit[1]=temp.data8bit[1];( s- d" I- h" O& ]$ o" G N_Addr.data8bit[2]=temp.data8bit[2];//save new addr new_addrflg=1; }/ E* G7 B: o; Q- {! I0 r else9 \6 m: `( z0 x- K, h {& Q" {' l7 U9 p2 C2 Y0 m9 l8 ? if(N_Addr.data8bit[1]==temp.data8bit[1] && N_Addr.data8bit[2]==temp.data8bit[2]) {$ W3 H# ^2 y& n, L$ u3 t7 T U# l8 k7 H if(++learn_cnt>50)//长按时间=【(10+(1.2+0.4)x24】x50 ms {6 y# v; E5 K' r3 A5 I0 J% a0 ^ learn_cnt=0; new_addrflg=0;& V# g3 O* g( i) T W_Addr.data8bit[1]=N_Addr.data8bit[1]; W_Addr.data8bit[2]=N_Addr.data8bit[2]; ChgCD;7 R6 o& T- B/ C V. |, R ChgJG;/ n" E4 z4 f' Z6 ^' F delayms(500); ChgCD; ChgJG; } }else L: V7 c) }- I2 Y; H, `' w: f { new_addrflg=0; }9 W* ~ w# q0 d$ T& G }9 R3 P* ~$ Y6 w6 @/ A }else { new_addrflg=0;5 {* y; E+ C, Q } if( temp.data8bit[1]==W_Addr.data8bit[1] && temp.data8bit[2]==W_Addr.data8bit[2] && WL_flg)( z9 H- a+ |4 k9 V2 S { switch(temp.data8bit[3])* {: D% s' H3 | {//按键处理程序 ) H4 D# p3 {' D! ?" R% `$ B, Y }5 _. V& p# U! E: J+ D, b } } % Q: ~. O9 h: S+ W1 k } else if(EXTI->CR1== 0x80)//falling edge read H time2 F+ e5 _- H4 q* b- f5 O { EXTI->CR1= 0x40;//0:下降沿&低电平 1:上升沿2:下降沿 3:上升&下降 PD上升沿 PA下降 GPIOD->CR2|=0X20; ///////////////////// /******/. X! o1 a# [5 A$ M" G H_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;////读无线H电平时间 }) g O2 }9 C1 h& O6 L* n- R* i* t enableInterrupts(); } 附件是整个工程 |
wireless.rar
下载93.82 KB, 下载次数: 28
谢了,正在学习rf. |