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

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

[复制链接]
Mr.R 发布时间:2016-5-25 15:26
本帖最后由 Mr.R 于 2016-5-25 15:27 编辑 4 d* q4 q& |  k' h- D+ H0 U7 ^( O

5 p7 ~- I2 N# Q% I" Q/ z+ y前段时间用stvd写了一个超外差433无线接收程序。调试已经成功,但是还存在一些疑惑的地方,在此抛砖引玉,希望大家指正硬件上用PD5来接收数据,定时器2测量脉宽
' M2 X! g* t, o0 S
- j8 E  J. ?/ ?: c" p( H有遇到以下几个问题:
& n8 }$ d" b! A' Y1、PD5配置为中断模式,在中断中通过检测PD5d电平来确定此次进入的是上升沿中断还是下降沿
$ r  g5 b" f4 B# |' b, I2 Z/ z. Y5 l8 `5 I$ z
但是在仿真过程中发现进入中断操作GPIOD_CR2或者关闭总中断时会造成PD5口的输入寄存器的数据发生跳变,造成无法准确得知是什么边沿触发的中断。
" Y% X* L& c. b0 n* x4 Q2 I6 e为了解决这个问题,我改为通过检测EXTI_CR的设置来确定到底是什么边沿触发的中断。测试这样修改后接受就变得可靠多了。! i$ f# C& j  a# N$ m

# u; u9 \. ?9 M% y. v2、除了用到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写程序,
2 \9 n- ]" i: P6 j但是调试程序还是离不开stvd……打断点一定要停止运行才能打,无法返回上个光标位置……
% g0 ?7 D! C+ ^# v, B3 j; O中断程序
3 A2 I/ l0 R! o& {+ J  [- P@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;// 无线接收位数
( Z- q: m4 L8 K% n. M; t9 _        static u16 H_data_cnt,L_data_cnt;//脉冲宽度
* \8 F7 p' m. H# m6 S- S+ y- d' {$ g/ I, I5 v
        static u32 R_DATA;
/ \8 y6 [1 o( I! [        static union WireAddr: \: a" i* {6 ]; |9 Z
        {
5 [2 I% C! I9 s, F3 r# [                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
        /////////
9 \$ U. N* {6 ?0 Q        disableInterrupts();nop();nop();
5 e4 A$ j. L) q# g        GPIOD->CR2&=~0X20;
- P) y) u0 E2 h( h. K; ~5 `        nop();nop();nop();nop();
8 g! z9 j8 ~* u+ n; d# ?0 m        ////////0 D, S2 ^( |5 E+ d
        1 P% x# h, |8 e9 m/ d& U3 M
        nop();nop();nop();nop();nop();nop();
3 S; R* k' O% f% e2 G/ c
. F9 G9 V1 d1 {6 T( ^' z+ A        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下降
. d2 t, R( I! g; l6 W; Z- T$ f3 n  J8 H                GPIOD->CR2|=0X20;; B& ^0 \) p* B% f: S' F% _% u
                ///////////////////////////( ]6 N7 @2 p3 e- [: F' _  e8 c
        
$ s* R! F3 C+ M( K8 L. N! t                        /**************/
8 ~9 G' w" d0 t3 F& d+ V/ U9 R                temp.data32bit<<=1;
+ L7 p; A. v* Y) O                L_data_cnt= (TIM2->CNTRH)<<8|TIM2->CNTRL;//read L time/ s/ i) m' B0 h+ u' P% l
                Init_Timer2();
, v7 j& E3 w3 u7 I8 \4 R7 x                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 周期
, T3 q8 \- U7 E1 K8 ?  v; O  K                {//bit =0  H`1200  bit=1 H:400
+ j, ^. {5 S$ p4 n7 U7 _  x                        if(H_data_cnt>300&& H_data_cnt<500)//bit=1高电平时间
" e* t1 b# F- G7 Q( Y                        {
3 U3 q, t6 W+ x' _( f. `2 @/ r) R                                bit_cnt++;
1 a# G4 t8 q# }& Y; ]+ r                        }
! q' g6 k8 _- S                        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;
8 l7 ^9 d9 P" c- T                                bit_cnt++;/ B) u/ K' Q3 ?* v
                        }6 G) }( t3 T( }
                        else//无效信号& y: f: a! G9 _9 K! m6 s3 j* p
                        {
4 r# R# K' m- E' r( `                                bit_cnt=0;
1 u9 G- x* K. b1 ~- {                                temp.data32bit=0;
4 J/ q4 I, w7 A8 }: Q                        }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;
- D$ v. U4 p! h) Y9 F                        temp.data32bit=0;8 }2 A2 o- D7 q
                }
  c9 p, R4 ?# S* g$ c( N6 S1 O7 U                        /////////////////////////////////& P, a# H( C+ l7 t
                if(bit_cnt==24)
* y0 b# _+ w) M4 v* ~( Y. I2 ]                {                        : S3 T. g: e2 H$ n5 D
                        if(temp.data8bit[3]==0x0b)//mode+ key as learn key
9 X3 S- ^: C$ Y- M9 e0 l' I                        {/////用于对码
$ A0 Z" K8 }4 [6 @; q- G7 [* U! D9 m( `                                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
0 f, H& V# I) [, C1 ]                                        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
                                        {
% d( T) ]6 ~% z3 _                                                if(++learn_cnt>50)//长按时间=【(10+(1.2+0.4)x24】x50 ms
- H* m" p) U& F) {" c* S                                                {
# c% L: G" d) _! L: ~$ I                                                        learn_cnt=0;2 P7 ?) i+ n& `3 ?' v9 P
                                                        new_addrflg=0;
( i" P) F( Z' {# l                                                        W_Addr.data8bit[1]=N_Addr.data8bit[1];  r) B% s8 ?. r. ?
                                                        W_Addr.data8bit[2]=N_Addr.data8bit[2];
/ t  |! P) |8 i  Y                                                        ChgCD;5 p+ @" I, B5 y
                                                        ChgJG;
) y* y, z# _# j5 e                                                        delayms(500);7 i! C& s% y4 H% l4 @
                                                        ChgCD;
- k5 D  G: s; H1 ]* N( r$ ^                                                        ChgJG;. s9 d$ s$ {; y* l" D
                                                }
" ~6 _, @1 t0 M                                        }else7 q3 g, M- y+ N( u
                                        {  C* l+ q5 P% b( o5 F. B
                                                new_addrflg=0;' e6 ~8 l5 y& y. Z
                                        }
8 j" D: Z4 u* a" i                                }  y* W6 y+ @2 t1 K
                        }else
, h7 v' z; ?2 x( t. j                        {
5 ^$ x0 @) @; Y2 s3 M- F6 N                                new_addrflg=0;; G! Q- _+ k* k) c
                        }
4 B& E( l% t8 y$ f* `6 g) v# {                        if( temp.data8bit[1]==W_Addr.data8bit[1] &&  temp.data8bit[2]==W_Addr.data8bit[2] && WL_flg)0 {! D# I- `: P" \5 p
                        {        
& q& b3 d- a0 m. o. z                                switch(temp.data8bit[3])$ O: X, a2 W; i4 ?# T2 \3 K* d
                                {//按键处理程序( U9 _9 m, u  t# L' P( w, f4 M
                                       
  q5 H5 J* ?* q+ t! f, ?                                }7 b0 g/ x0 T3 x$ G; R
                        }
8 K) C0 h  `1 f* u, J                }        % q0 ~) k# r6 z
        }
# c2 f7 v& k  X0 P& r; d5 B; G& a, w        else if(EXTI->CR1== 0x80)//falling edge read H time4 g3 s) w/ T3 ?/ d5 x3 N( v" x
        {
8 z0 N/ {  a2 ]% k               
' }& w/ z( m- W+ a! ~                EXTI->CR1= 0x40;//0:下降沿&低电平 1:上升沿2:下降沿 3:上升&下降 PD上升沿 PA下降
, U- P  p* `; E5 `                GPIOD->CR2|=0X20;9 l, T1 n4 p# M  C& @$ |
                /////////////////////
2 F- V' f5 I' j               
7 F6 _* [7 i4 z. ?, J) z                /******/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
               
9 ^4 Q: _' F* n        }
- n- o( p0 m: z8 L5 G- j. ~        
4 ?* w1 _; Y. i) x9 \5 |  J1 S        enableInterrupts();        
1 Z( x3 K' N2 f' b1 R}
% t* @' D* e8 H  \( l$ i- Z/ [6 o. q4 N
附件是整个工程
1 Y0 Y7 M! H: }: H! Y5 h  E

wireless.rar

下载

93.82 KB, 下载次数: 28

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

举报

1个回答
gblaze 回答时间:2017-11-30 17:39:42
谢了,正在学习rf.
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版