你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm8s外部中断的无线接收程序

[复制链接]
Mr.R 发布时间:2016-5-25 15:26
本帖最后由 Mr.R 于 2016-5-25 15:27 编辑 ; }5 Q% O3 x/ B

% E" ?2 Z7 s! T" U# ?  [0 F4 q前段时间用stvd写了一个超外差433无线接收程序。调试已经成功,但是还存在一些疑惑的地方,在此抛砖引玉,希望大家指正硬件上用PD5来接收数据,定时器2测量脉宽
7 @/ i' w' ]' z, ~7 c
; L6 }; d8 ]. A有遇到以下几个问题:
. F1 }* t9 k# ^- J0 q. _1、PD5配置为中断模式,在中断中通过检测PD5d电平来确定此次进入的是上升沿中断还是下降沿
; x: P9 d5 b4 A6 d  A: U6 }1 A, p% y6 g+ ~( g. y* m% f$ @1 X
但是在仿真过程中发现进入中断操作GPIOD_CR2或者关闭总中断时会造成PD5口的输入寄存器的数据发生跳变,造成无法准确得知是什么边沿触发的中断。4 \" B: d" I6 a; _( |: N
为了解决这个问题,我改为通过检测EXTI_CR的设置来确定到底是什么边沿触发的中断。测试这样修改后接受就变得可靠多了。
9 U) Z5 z. ?+ y  [1 @. a; M* B" _& F5 l9 b) D! }
2、除了用到TIM2还用到TIM4,TIM4里面处理的程序长了点后发现测得的无线脉冲长度不准确了。将一部分程序从TIM4中断中移到主函数就解决了这个问题。问题是我并没有设置中断优先级,默认的优先级应该是中断号小的优先级更高,那么PD中断的优先级是高于TIM4的。因此我搞不清到底是什么原因导致这个问题的。
6 X! U2 o! X; U6 \* N# h) h8 x% S6 c7 k; W4 x# R. }
另外要吐槽一下stvd的界面还是需要改进改进……受不了之后我就用SI写程序,
' S) m9 V0 R1 g但是调试程序还是离不开stvd……打断点一定要停止运行才能打,无法返回上个光标位置……
$ q  @/ P7 r; ~0 g1 G中断程序) z5 r- M, X1 m; g4 s
@far @interrupt void EXTI_PORTD_IRQHandler (void)//for wireless receive; Y* y. C) T  Z
{
! I3 S2 B3 L6 T- a# _) s        static u8 bit_cnt,new_addrflg,learn_cnt;// 无线接收位数% F& n% i3 E- n$ b
        static u16 H_data_cnt,L_data_cnt;//脉冲宽度
2 z( `0 I! h) w  ]5 F6 I* N' f, g2 s) J. i' u/ u8 K4 y9 D; ^( P
        static u32 R_DATA;
0 \; Q' z/ H5 }/ p' j0 y! S        static union WireAddr
/ v. v- p% W: d2 H1 L        {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];
' M0 g  L1 [: i4 W' p2 U) e        }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;
+ U9 q# w  a( ^, ^4 b        nop();nop();nop();nop();% _$ Z" i' Y2 O! J3 R4 x% d
        ////////2 v/ `6 A) n7 m+ q
        
  Q8 v5 R4 d- q8 _* q: m+ V5 O! ^        nop();nop();nop();nop();nop();nop();. e- L* ?: ^/ {) }1 c0 m
, r( y0 x7 N& e1 ^& h
        if(EXTI->CR1== 0x40)//rise edge
# |3 B; @) [% O' z" d; x        {        ' \. 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
                ///////////////////////////
4 Y6 B# s" ~5 I8 Y% H, h        & f6 j% }; ]( n0 Y
                        /**************/
& h; v/ j/ h; E8 M: _2 h3 I7 u" C/ n                temp.data32bit<<=1;& r3 I* d0 ]7 F
                L_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;//read L time
/ U1 ?$ A7 v0 J- q: J/ r                Init_Timer2();
4 Y/ d4 p0 `8 o/ Q4 T4 V               
& ^, r, f6 z; U) \! t. d                        ///////////////- 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
* J7 Q- Z: y  h                        if(H_data_cnt>300&& H_data_cnt<500)//bit=1高电平时间
& k9 z: f( `+ e                        {  a( x+ D& w# j) c( j/ A# z
                                bit_cnt++;4 Q- e2 F8 _6 P
                        }
3 K  Y, K3 Q5 \) u; D! K  v                        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;
' U* i8 \' R; _                                bit_cnt++;
3 E8 A# l) L' l( J2 i6 S, a  }                        }" S1 T( P/ A8 j' S
                        else//无效信号. K" c! x5 @4 l# V/ A9 {
                        {$ T# F8 ]$ l: u3 X+ u
                                bit_cnt=0;
; y. P5 O. Z( `0 B                                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;
; y  T" t* i/ Z  k! l; ]                        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
                {                        
/ Z. r0 A3 C! M8 a                        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
) H: G/ h, z7 [1 A; \- q                                        new_addrflg=1;
( F: C2 N2 Z. t  q4 L                                }/ 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])
; p0 O5 E' D5 F/ n* m                                        {$ 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 w4 h! ?8 _# t3 g4 B( [; h7 i                                                {6 y# v; E5 K' r3 A5 I0 J% a0 ^
                                                        learn_cnt=0;
+ S% Z. e8 S& X/ ?: r  l                                                        new_addrflg=0;& V# g3 O* g( i) T
                                                        W_Addr.data8bit[1]=N_Addr.data8bit[1];
# @2 Y, }! b' q                                                        W_Addr.data8bit[2]=N_Addr.data8bit[2];
% Z+ V. z! C% c2 ~0 W                                                        ChgCD;7 R6 o& T- B/ C  V. |, R
                                                        ChgJG;/ n" E4 z4 f' Z6 ^' F
                                                        delayms(500);
/ \3 t- p' v" p# v6 D; |6 p; Y                                                        ChgCD;
" q( q5 }1 Y) l: |: T( a                                                        ChgJG;
  j; Y5 }# L8 {0 ?7 }                                                }
, E, b+ \  u: Y$ Y3 Z                                        }else  L: V7 c) }- I2 Y; H, `' w: f
                                        {
" p9 C( x) X& j+ F+ h1 D% s! ~                                                new_addrflg=0;
' A; }  h; i+ ^5 A! w/ J, n                                        }9 W* ~  w# q0 d$ T& G
                                }9 R3 P* ~$ Y6 w6 @/ A
                        }else
3 \/ T  ^, a. I) {9 Z' p3 b                        {
1 y1 c, j' ^: ^4 l                                new_addrflg=0;5 {* y; E+ C, Q
                        }
% n1 I8 A4 Z+ o9 b                        if( temp.data8bit[1]==W_Addr.data8bit[1] &&  temp.data8bit[2]==W_Addr.data8bit[2] && WL_flg)( z9 H- a+ |4 k9 V2 S
                        {        
+ B& R0 o# m  F1 y) D                                switch(temp.data8bit[3])* {: D% s' H3 |
                                {//按键处理程序
$ v4 ?: W6 _3 p2 w* F; A                                        ) H4 D# p3 {' D! ?" R% `$ B, Y
                                }5 _. V& p# U! E: J+ D, b
                        }
- _* Y1 K5 y2 \& F                }        % Q: ~. O9 h: S+ W1 k
        }
# K6 S$ W" u; @3 O7 F9 |4 @4 s        else if(EXTI->CR1== 0x80)//falling edge read H time2 F+ e5 _- H4 q* b- f5 O
        {
, f  u( {* ?/ \4 ^               
' f1 \" n9 u- j5 `" C                EXTI->CR1= 0x40;//0:下降沿&低电平 1:上升沿2:下降沿 3:上升&下降 PD上升沿 PA下降
; i0 d7 `! y( ?9 P. ]8 R                GPIOD->CR2|=0X20;
2 B+ I  r" W6 p; U                /////////////////////
" I6 \! N* D1 U; [) `               
% L. a$ f4 s- d4 I5 w                /******/. X! o1 a# [5 A$ M" G
                H_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;////读无线H电平时间
' c7 c# T+ J* m! ]1 E5 B               
# N2 v% u" B. N        }) g  O2 }9 C1 h& O6 L* n- R* i* t
        
" X, B. e4 R* F4 a' F( N        enableInterrupts();        
* O+ x% C3 }! F7 {7 i" Z}
$ i- Z; s5 T# @2 p
8 @$ f5 V4 e: L' Z8 y+ L附件是整个工程
" r' n9 G( a6 v( k

wireless.rar

下载

93.82 KB, 下载次数: 28

收藏 1 评论1 发布时间:2016-5-25 15:26

举报

1个回答
gblaze 回答时间:2017-11-30 17:39:42
谢了,正在学习rf.

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版